From 21013dcf1b1c0c740efba863b6b4962fe3da9095 Mon Sep 17 00:00:00 2001 From: Brad Ebinger Date: Thu, 2 Feb 2017 16:21:22 -0800 Subject: [PATCH] reates base implementation of ImsService AIDLs This change introduces "base classes" of the AIDL interfaces that are implemented in vendor provided ImsServices. This allows for new APIs to be added to the AIDL files, along with stub implementation of those AIDLs in the base classes. By extending from the base class, older implementations of the AIDL interfaces will not need to be updated when the interface changes. This change also moves some of the com.android.ims classes from frameworks/opt/net/ims to frameworks/base. Any class that will be used in the new unbundled ImsService system will need to be in the framework, as opposed to the optional library that they are in now. Bug: 30290416 Test: Manual Change-Id: I4a186d8e910d6d4f711e983ec8d717fc5cbdefab --- .../ims/stub/ImsCallSessionImplBase.java | 348 +++++ .../stub/ImsCallSessionListenerImplBase.java | 251 ++++ .../telephony/ims/stub/ImsConfigImplBase.java | 150 ++ .../telephony/ims/stub/ImsEcbmImplBase.java | 51 + .../ims/stub/ImsMultiEndpointImplBase.java | 53 + .../stub/ImsStreamMediaSessionImplBase.java | 40 + .../telephony/ims/stub/ImsUtImplBase.java | 174 +++ .../ims/stub/ImsUtListenerImplBase.java | 88 ++ telephony/java/com/android/ims/ImsConfig.java | 694 +++++++++ .../java/com/android/ims/ImsException.java | 52 + .../java/com/android/ims/ImsUtInterface.java | 179 +++ .../internal/IImsServiceFeatureListener.aidl | 3 +- .../android/ims/internal/ImsCallSession.java | 1290 +++++++++++++++++ .../ims/internal/ImsVideoCallProvider.java | 294 ++++ 14 files changed, 3666 insertions(+), 1 deletion(-) create mode 100644 telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java create mode 100644 telephony/java/android/telephony/ims/stub/ImsCallSessionListenerImplBase.java create mode 100644 telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java create mode 100644 telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java create mode 100644 telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java create mode 100644 telephony/java/android/telephony/ims/stub/ImsStreamMediaSessionImplBase.java create mode 100644 telephony/java/android/telephony/ims/stub/ImsUtImplBase.java create mode 100644 telephony/java/android/telephony/ims/stub/ImsUtListenerImplBase.java create mode 100644 telephony/java/com/android/ims/ImsConfig.java create mode 100644 telephony/java/com/android/ims/ImsException.java create mode 100644 telephony/java/com/android/ims/ImsUtInterface.java create mode 100644 telephony/java/com/android/ims/internal/ImsCallSession.java create mode 100644 telephony/java/com/android/ims/internal/ImsVideoCallProvider.java diff --git a/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java b/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java new file mode 100644 index 0000000000000..69b8acc5b6a92 --- /dev/null +++ b/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java @@ -0,0 +1,348 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony.ims.stub; + +import android.os.Message; +import android.os.RemoteException; + +import com.android.ims.ImsCallProfile; +import com.android.ims.ImsStreamMediaProfile; +import com.android.ims.internal.ImsCallSession; +import com.android.ims.internal.IImsCallSession; +import com.android.ims.internal.IImsCallSessionListener; +import com.android.ims.internal.IImsVideoCallProvider; + +/** + * Base implementation of IImsCallSession, which implements stub versions of the methods in the + * IImsCallSession AIDL. Override the methods that your implementation of ImsCallSession supports. + * + * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you + * will break other implementations of ImsCallSession maintained by other ImsServices. + * + * @hide + */ + +public class ImsCallSessionImplBase extends IImsCallSession.Stub { + + /** + * Closes the object. This object is not usable after being closed. + */ + @Override + public void close() throws RemoteException { + + } + + /** + * Gets the call ID of the session. + * + * @return the call ID + */ + @Override + public String getCallId() throws RemoteException { + return null; + } + + /** + * Gets the call profile that this session is associated with + * + * @return the {@link ImsCallProfile} that this session is associated with + */ + @Override + public ImsCallProfile getCallProfile() throws RemoteException { + return null; + } + + /** + * Gets the local call profile that this session is associated with + * + * @return the local {@link ImsCallProfile} that this session is associated with + */ + @Override + public ImsCallProfile getLocalCallProfile() throws RemoteException { + return null; + } + + /** + * Gets the remote call profile that this session is associated with + * + * @return the remote {@link ImsCallProfile} that this session is associated with + */ + @Override + public ImsCallProfile getRemoteCallProfile() throws RemoteException { + return null; + } + + /** + * Gets the value associated with the specified property of this session. + * + * @return the string value associated with the specified property + */ + @Override + public String getProperty(String name) throws RemoteException { + return null; + } + + /** + * Gets the session state. + * The value returned must be one of the states in {@link ImsCallSession.State}. + * + * @return the session state + */ + @Override + public int getState() throws RemoteException { + return ImsCallSession.State.INVALID; + } + + /** + * Checks if the session is in call. + * + * @return true if the session is in call, false otherwise + */ + @Override + public boolean isInCall() throws RemoteException { + return false; + } + + /** + * Sets the listener to listen to the session events. An {@link ImsCallSession} + * can only hold one listener at a time. Subsequent calls to this method + * override the previous listener. + * + * @param listener to listen to the session events of this object + */ + @Override + public void setListener(IImsCallSessionListener listener) throws RemoteException { + } + + /** + * Mutes or unmutes the mic for the active call. + * + * @param muted true if the call is muted, false otherwise + */ + @Override + public void setMute(boolean muted) throws RemoteException { + } + + /** + * Initiates an IMS call with the specified target and call profile. + * The session listener set in {@link #setListener} is called back upon defined session events. + * The method is only valid to call when the session state is in + * {@link ImsCallSession.State#IDLE}. + * + * @param callee dialed string to make the call to + * @param profile call profile to make the call with the specified service type, + * call type and media information + * @see {@link ImsCallSession.Listener#callSessionStarted}, + * {@link ImsCallSession.Listener#callSessionStartFailed} + */ + @Override + public void start(String callee, ImsCallProfile profile) throws RemoteException { + } + + /** + * Initiates an IMS call with the specified participants and call profile. + * The session listener set in {@link #setListener} is called back upon defined session events. + * The method is only valid to call when the session state is in + * {@link ImsCallSession.State#IDLE}. + * + * @param participants participant list to initiate an IMS conference call + * @param profile call profile to make the call with the specified service type, + * call type and media information + * @see {@link ImsCallSession.Listener#callSessionStarted}, + * {@link ImsCallSession.Listener#callSessionStartFailed} + */ + @Override + public void startConference(String[] participants, ImsCallProfile profile) + throws RemoteException { + } + + /** + * Accepts an incoming call or session update. + * + * @param callType call type specified in {@link ImsCallProfile} to be answered + * @param profile stream media profile {@link ImsStreamMediaProfile} to be answered + * @see {@link ImsCallSession.Listener#callSessionStarted} + */ + @Override + public void accept(int callType, ImsStreamMediaProfile profile) throws RemoteException { + } + + /** + * Rejects an incoming call or session update. + * + * @param reason reason code to reject an incoming call, defined in + * com.android.ims.ImsReasonInfo + * {@link ImsCallSession.Listener#callSessionStartFailed} + */ + @Override + public void reject(int reason) throws RemoteException { + } + + /** + * Terminates a call. + * + * @param reason reason code to terminate a call, defined in + * com.android.ims.ImsReasonInfo + * + * @see {@link ImsCallSession.Listener#callSessionTerminated} + */ + @Override + public void terminate(int reason) throws RemoteException { + } + + /** + * Puts a call on hold. When it succeeds, {@link ImsCallSession.Listener#callSessionHeld} is + * called. + * + * @param profile stream media profile {@link ImsStreamMediaProfile} to hold the call + * @see {@link ImsCallSession.Listener#callSessionHeld}, + * {@link ImsCallSession.Listener#callSessionHoldFailed} + */ + @Override + public void hold(ImsStreamMediaProfile profile) throws RemoteException { + } + + /** + * Continues a call that's on hold. When it succeeds, + * {@link ImsCallSession.Listener#callSessionResumed} is called. + * + * @param profile stream media profile with {@link ImsStreamMediaProfile} to resume the call + * @see {@link ImsCallSession.Listener#callSessionResumed}, + * {@link ImsCallSession.Listener#callSessionResumeFailed} + */ + @Override + public void resume(ImsStreamMediaProfile profile) throws RemoteException { + } + + /** + * Merges the active & hold call. When the merge starts, + * {@link ImsCallSession.Listener#callSessionMergeStarted} is called. + * {@link ImsCallSession.Listener#callSessionMergeComplete} is called if the merge is + * successful, and {@link ImsCallSession.Listener#callSessionMergeFailed} is called if the merge + * fails. + * + * @see {@link ImsCallSession.Listener#callSessionMergeStarted}, + * {@link ImsCallSession.Listener#callSessionMergeComplete}, + * {@link ImsCallSession.Listener#callSessionMergeFailed} + */ + @Override + public void merge() throws RemoteException { + } + + /** + * Updates the current call's properties (ex. call mode change: video upgrade / downgrade). + * + * @param callType call type specified in {@link ImsCallProfile} to be updated + * @param profile stream media profile {@link ImsStreamMediaProfile} to be updated + * @see {@link ImsCallSession.Listener#callSessionUpdated}, + * {@link ImsCallSession.Listener#callSessionUpdateFailed} + */ + @Override + public void update(int callType, ImsStreamMediaProfile profile) throws RemoteException { + } + + /** + * Extends this call to the conference call with the specified recipients. + * + * @param participants participant list to be invited to the conference call after extending the + * call + * @see {@link ImsCallSession.Listener#callSessionConferenceExtended}, + * {@link ImsCallSession.Listener#callSessionConferenceExtendFailed} + */ + @Override + public void extendToConference(String[] participants) throws RemoteException { + } + + /** + * Requests the conference server to invite an additional participants to the conference. + * + * @param participants participant list to be invited to the conference call + * @see {@link ImsCallSession.Listener#callSessionInviteParticipantsRequestDelivered}, + * {@link ImsCallSession.Listener#callSessionInviteParticipantsRequestFailed} + */ + @Override + public void inviteParticipants(String[] participants) throws RemoteException { + } + + /** + * Requests the conference server to remove the specified participants from the conference. + * + * @param participants participant list to be removed from the conference call + * @see {@link ImsCallSession.Listener#callSessionRemoveParticipantsRequestDelivered}, + * {@link ImsCallSession.Listener#callSessionRemoveParticipantsRequestFailed} + */ + @Override + public void removeParticipants(String[] participants) throws RemoteException { + } + + /** + * Sends a DTMF code. According to RFC 2833, + * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15, + * and event flash to 16. Currently, event flash is not supported. + * + * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs. + */ + @Override + public void sendDtmf(char c, Message result) throws RemoteException { + } + + /** + * Start a DTMF code. According to RFC 2833, + * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15, + * and event flash to 16. Currently, event flash is not supported. + * + * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs. + */ + @Override + public void startDtmf(char c) throws RemoteException { + } + + /** + * Stop a DTMF code. + */ + @Override + public void stopDtmf() throws RemoteException { + } + + /** + * Sends an USSD message. + * + * @param ussdMessage USSD message to send + */ + @Override + public void sendUssd(String ussdMessage) throws RemoteException { + } + + /** + * Returns a binder for the video call provider implementation contained within the IMS service + * process. This binder is used by the VideoCallProvider subclass in Telephony which + * intermediates between the propriety implementation and Telecomm/InCall. + */ + @Override + public IImsVideoCallProvider getVideoCallProvider() throws RemoteException { + return null; + } + + /** + * Determines if the current session is multiparty. + * @return {@code True} if the session is multiparty. + */ + @Override + public boolean isMultiparty() throws RemoteException { + return false; + } +} diff --git a/telephony/java/android/telephony/ims/stub/ImsCallSessionListenerImplBase.java b/telephony/java/android/telephony/ims/stub/ImsCallSessionListenerImplBase.java new file mode 100644 index 0000000000000..46f8f808a92c7 --- /dev/null +++ b/telephony/java/android/telephony/ims/stub/ImsCallSessionListenerImplBase.java @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony.ims.stub; + +import com.android.ims.ImsCallProfile; +import com.android.ims.ImsConferenceState; +import com.android.ims.ImsReasonInfo; +import com.android.ims.ImsStreamMediaProfile; +import com.android.ims.ImsSuppServiceNotification; +import com.android.ims.internal.IImsCallSession; +import com.android.ims.internal.IImsCallSessionListener; + +/** + * Base implementation of ImsCallSessionListenerBase, which implements stub versions of the methods + * in the IImsCallSessionListener AIDL. Override the methods that your implementation of + * ImsCallSessionListener supports. + * + * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you + * will break other implementations of ImsCallSessionListener maintained by other ImsServices. + * + * @hide + */ +public class ImsCallSessionListenerImplBase extends IImsCallSessionListener.Stub { + /** + * Notifies the result of the basic session operation (setup / terminate). + */ + @Override + public void callSessionProgressing(IImsCallSession session, ImsStreamMediaProfile profile) { + // no-op + } + + @Override + public void callSessionStarted(IImsCallSession session, ImsCallProfile profile) { + // no-op + } + + @Override + public void callSessionStartFailed(IImsCallSession session, ImsReasonInfo reasonInfo) { + // no-op + } + + @Override + public void callSessionTerminated(IImsCallSession session, ImsReasonInfo reasonInfo) { + // no-op + } + + /** + * Notifies the result of the call hold/resume operation. + */ + @Override + public void callSessionHeld(IImsCallSession session, ImsCallProfile profile) { + // no-op + } + + @Override + public void callSessionHoldFailed(IImsCallSession session, ImsReasonInfo reasonInfo) { + // no-op + } + + @Override + public void callSessionHoldReceived(IImsCallSession session, ImsCallProfile profile) { + // no-op + } + + @Override + public void callSessionResumed(IImsCallSession session, ImsCallProfile profile) { + // no-op + } + + @Override + public void callSessionResumeFailed(IImsCallSession session, ImsReasonInfo reasonInfo) { + // no-op + } + + @Override + public void callSessionResumeReceived(IImsCallSession session, ImsCallProfile profile) { + // no-op + } + + /** + * Notifies the result of call merge operation. + */ + @Override + public void callSessionMergeStarted(IImsCallSession session, IImsCallSession newSession, + ImsCallProfile profile) { + // no-op + } + + @Override + public void callSessionMergeComplete(IImsCallSession session) { + // no-op + } + + @Override + public void callSessionMergeFailed(IImsCallSession session, ImsReasonInfo reasonInfo) { + // no-op + } + + /** + * Notifies the result of call upgrade / downgrade or any other call + * updates. + */ + @Override + public void callSessionUpdated(IImsCallSession session, ImsCallProfile profile) { + // no-op + } + + @Override + public void callSessionUpdateFailed(IImsCallSession session, ImsReasonInfo reasonInfo) { + // no-op + } + + @Override + public void callSessionUpdateReceived(IImsCallSession session, ImsCallProfile profile) { + // no-op + } + + /** + * Notifies the result of conference extension. + */ + @Override + public void callSessionConferenceExtended(IImsCallSession session, IImsCallSession newSession, + ImsCallProfile profile) { + // no-op + } + + @Override + public void callSessionConferenceExtendFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + // no-op + } + + @Override + public void callSessionConferenceExtendReceived(IImsCallSession session, + IImsCallSession newSession, + ImsCallProfile profile) { + // no-op + } + + /** + * Notifies the result of the participant invitation / removal to/from the + * conference session. + */ + @Override + public void callSessionInviteParticipantsRequestDelivered(IImsCallSession session) { + // no-op + } + + @Override + public void callSessionInviteParticipantsRequestFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + // no-op + } + + @Override + public void callSessionRemoveParticipantsRequestDelivered(IImsCallSession session) { + // no-op + } + + @Override + public void callSessionRemoveParticipantsRequestFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + // no-op + } + + /** + * Notifies the changes of the conference info. the conference session. + */ + @Override + public void callSessionConferenceStateUpdated(IImsCallSession session, + ImsConferenceState state) { + // no-op + } + + /** + * Notifies the incoming USSD message. + */ + @Override + public void callSessionUssdMessageReceived(IImsCallSession session, int mode, + String ussdMessage) { + // no-op + } + + /** + * Notifies of handover information for this call + */ + @Override + public void callSessionHandover(IImsCallSession session, int srcAccessTech, + int targetAccessTech, + ImsReasonInfo reasonInfo) { + // no-op + } + + @Override + public void callSessionHandoverFailed(IImsCallSession session, int srcAccessTech, + int targetAccessTech, + ImsReasonInfo reasonInfo) { + // no-op + } + + /** + * Notifies the TTY mode change by remote party. + * + * @param mode one of the following: - + * {@link com.android.internal.telephony.Phone#TTY_MODE_OFF} - + * {@link com.android.internal.telephony.Phone#TTY_MODE_FULL} - + * {@link com.android.internal.telephony.Phone#TTY_MODE_HCO} - + * {@link com.android.internal.telephony.Phone#TTY_MODE_VCO} + */ + @Override + public void callSessionTtyModeReceived(IImsCallSession session, int mode) { + // no-op + } + + /** + * Notifies of a change to the multiparty state for this + * {@code ImsCallSession}. + * + * @param session The call session. + * @param isMultiParty {@code true} if the session became multiparty, + * {@code false} otherwise. + */ + @Override + public void callSessionMultipartyStateChanged(IImsCallSession session, boolean isMultiParty) { + // no-op + } + + /** + * Notifies the supplementary service information for the current session. + */ + @Override + public void callSessionSuppServiceReceived(IImsCallSession session, + ImsSuppServiceNotification suppSrvNotification) { + // no-op + } +} + diff --git a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java new file mode 100644 index 0000000000000..5a4db99ee0d0c --- /dev/null +++ b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony.ims.stub; + +import android.os.RemoteException; + +import com.android.ims.ImsConfig; +import com.android.ims.ImsConfigListener; +import com.android.ims.internal.IImsConfig; + +/** + * Base implementation of ImsConfig, which implements stub versions of the methods + * in the IImsConfig AIDL. Override the methods that your implementation of ImsConfig supports. + * + * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you + * will break other implementations of ImsConfig maintained by other ImsServices. + * + * Provides APIs to get/set the IMS service feature/capability/parameters. + * The config items include: + * 1) Items provisioned by the operator. + * 2) Items configured by user. Mainly service feature class. + * + * @hide + */ + +public class ImsConfigImplBase extends IImsConfig.Stub { + + /** + * Gets the value for ims service/capabilities parameters from the provisioned + * value storage. Synchronous blocking call. + * + * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. + * @return value in Integer format. + */ + @Override + public int getProvisionedValue(int item) throws RemoteException { + return -1; + } + + /** + * Gets the value for ims service/capabilities parameters from the provisioned + * value storage. Synchronous blocking call. + * + * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. + * @return value in String format. + */ + @Override + public String getProvisionedStringValue(int item) throws RemoteException { + return null; + } + + /** + * Sets the value for IMS service/capabilities parameters by the operator device + * management entity. It sets the config item value in the provisioned storage + * from which the master value is derived. Synchronous blocking call. + * + * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. + * @param value in Integer format. + * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants. + */ + @Override + public int setProvisionedValue(int item, int value) throws RemoteException { + return ImsConfig.OperationStatusConstants.FAILED; + } + + /** + * Sets the value for IMS service/capabilities parameters by the operator device + * management entity. It sets the config item value in the provisioned storage + * from which the master value is derived. Synchronous blocking call. + * + * @param item as defined in com.android.ims.ImsConfig#ConfigConstants. + * @param value in String format. + * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants. + */ + @Override + public int setProvisionedStringValue(int item, String value) throws RemoteException { + return ImsConfig.OperationStatusConstants.FAILED; + } + + /** + * Gets the value of the specified IMS feature item for specified network type. + * This operation gets the feature config value from the master storage (i.e. final + * value). Asynchronous non-blocking call. + * + * @param feature as defined in com.android.ims.ImsConfig#FeatureConstants. + * @param network as defined in android.telephony.TelephonyManager#NETWORK_TYPE_XXX. + * @param listener feature value returned asynchronously through listener. + */ + @Override + public void getFeatureValue(int feature, int network, ImsConfigListener listener) + throws RemoteException { + } + + /** + * Sets the value for IMS feature item for specified network type. + * This operation stores the user setting in setting db from which master db + * is derived. + * + * @param feature as defined in com.android.ims.ImsConfig#FeatureConstants. + * @param network as defined in android.telephony.TelephonyManager#NETWORK_TYPE_XXX. + * @param value as defined in com.android.ims.ImsConfig#FeatureValueConstants. + * @param listener, provided if caller needs to be notified for set result. + */ + @Override + public void setFeatureValue(int feature, int network, int value, ImsConfigListener listener) + throws RemoteException { + } + + /** + * Gets the value for IMS VoLTE provisioned. + * This should be the same as the operator provisioned value if applies. + */ + @Override + public boolean getVolteProvisioned() throws RemoteException { + return false; + } + + /** + * Gets the value for IMS feature item video quality. + * + * @param listener Video quality value returned asynchronously through listener. + */ + @Override + public void getVideoQuality(ImsConfigListener listener) throws RemoteException { + } + + /** + * Sets the value for IMS feature item video quality. + * + * @param quality, defines the value of video quality. + * @param listener, provided if caller needs to be notified for set result. + */ + @Override + public void setVideoQuality(int quality, ImsConfigListener listener) throws RemoteException { + } +} diff --git a/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java b/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java new file mode 100644 index 0000000000000..89f95ff0142d0 --- /dev/null +++ b/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony.ims.stub; + +import android.os.RemoteException; + +import com.android.ims.internal.IImsEcbm; +import com.android.ims.internal.IImsEcbmListener; + +/** + * Base implementation of ImsEcbm, which implements stub versions of the methods + * in the IImsEcbm AIDL. Override the methods that your implementation of ImsEcbm supports. + * + * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you + * will break other implementations of ImsEcbm maintained by other ImsServices. + * + * @hide + */ + +public class ImsEcbmImplBase extends IImsEcbm.Stub { + + /** + * Sets the listener. + */ + @Override + public void setListener(IImsEcbmListener listener) throws RemoteException { + + } + + /** + * Requests Modem to come out of ECBM mode + */ + @Override + public void exitEmergencyCallbackMode() throws RemoteException { + + } +} diff --git a/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java b/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java new file mode 100644 index 0000000000000..05da9da485a96 --- /dev/null +++ b/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony.ims.stub; + +import android.os.RemoteException; + +import com.android.ims.internal.IImsExternalCallStateListener; +import com.android.ims.internal.IImsMultiEndpoint; + +/** + * Base implementation of ImsMultiEndpoint, which implements stub versions of the methods + * in the IImsMultiEndpoint AIDL. Override the methods that your implementation of + * ImsMultiEndpoint supports. + * + * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you + * will break other implementations of ImsMultiEndpoint maintained by other ImsServices. + * + * @hide + */ + +public class ImsMultiEndpointImplBase extends IImsMultiEndpoint.Stub { + + /** + * Sets the listener. + */ + @Override + public void setListener(IImsExternalCallStateListener listener) throws RemoteException { + + } + + /** + * Query API to get the latest Dialog Event Package information + * Should be invoked only after setListener is done + */ + @Override + public void requestImsExternalCallStateInfo() throws RemoteException { + + } +} diff --git a/telephony/java/android/telephony/ims/stub/ImsStreamMediaSessionImplBase.java b/telephony/java/android/telephony/ims/stub/ImsStreamMediaSessionImplBase.java new file mode 100644 index 0000000000000..92f1a018677d3 --- /dev/null +++ b/telephony/java/android/telephony/ims/stub/ImsStreamMediaSessionImplBase.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony.ims.stub; + +import android.os.RemoteException; + +import com.android.ims.internal.IImsStreamMediaSession; + +/** + * Base implementation of ImsStreamMediaSession, which implements stub versions of the methods + * in the IImsStreamMediaSession AIDL. Override the methods that your implementation of + * ImsStreamMediaSession supports. + * + * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you + * will break other implementations of ImsStreamMediaSession maintained by other ImsServices. + * + * @hide + */ + +public class ImsStreamMediaSessionImplBase extends IImsStreamMediaSession.Stub { + + @Override + public void close() throws RemoteException { + + } +} diff --git a/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java b/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java new file mode 100644 index 0000000000000..dc74094d6f93d --- /dev/null +++ b/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony.ims.stub; + +import android.os.Bundle; +import android.os.RemoteException; + +import com.android.ims.internal.IImsUt; +import com.android.ims.internal.IImsUtListener; + +/** + * Base implementation of ImsUt, which implements stub versions of the methods + * in the IImsUt AIDL. Override the methods that your implementation of ImsUt supports. + * + * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you + * will break other implementations of ImsUt maintained by other ImsServices. + * + * Provides the Ut interface interworking to get/set the supplementary service configuration. + * + * @hide + */ + +public class ImsUtImplBase extends IImsUt.Stub { + + /** + * Closes the object. This object is not usable after being closed. + */ + @Override + public void close() throws RemoteException { + + } + + /** + * Retrieves the configuration of the call barring. + */ + @Override + public int queryCallBarring(int cbType) throws RemoteException { + return -1; + } + + /** + * Retrieves the configuration of the call forward. + */ + @Override + public int queryCallForward(int condition, String number) throws RemoteException { + return -1; + } + + /** + * Retrieves the configuration of the call waiting. + */ + @Override + public int queryCallWaiting() throws RemoteException { + return -1; + } + + /** + * Retrieves the default CLIR setting. + */ + @Override + public int queryCLIR() throws RemoteException { + return -1; + } + + /** + * Retrieves the CLIP call setting. + */ + @Override + public int queryCLIP() throws RemoteException { + return -1; + } + + /** + * Retrieves the COLR call setting. + */ + @Override + public int queryCOLR() throws RemoteException { + return -1; + } + + /** + * Retrieves the COLP call setting. + */ + @Override + public int queryCOLP() throws RemoteException { + return -1; + } + + /** + * Updates or retrieves the supplementary service configuration. + */ + @Override + public int transact(Bundle ssInfo) throws RemoteException { + return -1; + } + + /** + * Updates the configuration of the call barring. + */ + @Override + public int updateCallBarring(int cbType, int action, String[] barrList) throws RemoteException { + return -1; + } + + /** + * Updates the configuration of the call forward. + */ + @Override + public int updateCallForward(int action, int condition, String number, int serviceClass, + int timeSeconds) throws RemoteException { + return 0; + } + + /** + * Updates the configuration of the call waiting. + */ + @Override + public int updateCallWaiting(boolean enable, int serviceClass) throws RemoteException { + return -1; + } + + /** + * Updates the configuration of the CLIR supplementary service. + */ + @Override + public int updateCLIR(int clirMode) throws RemoteException { + return -1; + } + + /** + * Updates the configuration of the CLIP supplementary service. + */ + @Override + public int updateCLIP(boolean enable) throws RemoteException { + return -1; + } + + /** + * Updates the configuration of the COLR supplementary service. + */ + @Override + public int updateCOLR(int presentation) throws RemoteException { + return -1; + } + + /** + * Updates the configuration of the COLP supplementary service. + */ + @Override + public int updateCOLP(boolean enable) throws RemoteException { + return -1; + } + + /** + * Sets the listener. + */ + @Override + public void setListener(IImsUtListener listener) throws RemoteException { + } +} diff --git a/telephony/java/android/telephony/ims/stub/ImsUtListenerImplBase.java b/telephony/java/android/telephony/ims/stub/ImsUtListenerImplBase.java new file mode 100644 index 0000000000000..b371efb68030e --- /dev/null +++ b/telephony/java/android/telephony/ims/stub/ImsUtListenerImplBase.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony.ims.stub; + +import android.os.Bundle; +import android.os.RemoteException; + +import com.android.ims.ImsCallForwardInfo; +import com.android.ims.ImsReasonInfo; +import com.android.ims.ImsSsInfo; +import com.android.ims.internal.IImsUt; +import com.android.ims.internal.IImsUtListener; + +/** + * Base implementation of ImsUtListener, which implements stub versions of the methods + * in the IImsUtListener AIDL. Override the methods that your implementation of + * ImsUtListener supports. + * + * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you + * will break other implementations of ImsUtListener maintained by other ImsServices. + * + * @hide + */ + +public class ImsUtListenerImplBase extends IImsUtListener.Stub { + + /** + * Notifies the result of the supplementary service configuration udpate. + */ + @Override + public void utConfigurationUpdated(IImsUt ut, int id) throws RemoteException { + } + + @Override + public void utConfigurationUpdateFailed(IImsUt ut, int id, ImsReasonInfo error) + throws RemoteException { + } + + /** + * Notifies the result of the supplementary service configuration query. + */ + @Override + public void utConfigurationQueried(IImsUt ut, int id, Bundle ssInfo) throws RemoteException { + } + + @Override + public void utConfigurationQueryFailed(IImsUt ut, int id, ImsReasonInfo error) + throws RemoteException { + } + + /** + * Notifies the status of the call barring supplementary service. + */ + @Override + public void utConfigurationCallBarringQueried(IImsUt ut, int id, ImsSsInfo[] cbInfo) + throws RemoteException { + } + + /** + * Notifies the status of the call forwarding supplementary service. + */ + @Override + public void utConfigurationCallForwardQueried(IImsUt ut, int id, ImsCallForwardInfo[] cfInfo) + throws RemoteException { + } + + /** + * Notifies the status of the call waiting supplementary service. + */ + @Override + public void utConfigurationCallWaitingQueried(IImsUt ut, int id, ImsSsInfo[] cwInfo) + throws RemoteException { + } +} diff --git a/telephony/java/com/android/ims/ImsConfig.java b/telephony/java/com/android/ims/ImsConfig.java new file mode 100644 index 0000000000000..cd076b1a52dfd --- /dev/null +++ b/telephony/java/com/android/ims/ImsConfig.java @@ -0,0 +1,694 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.ims; + +import android.content.Context; +import android.os.RemoteException; +import android.telephony.Rlog; + +import com.android.ims.internal.IImsConfig; + +/** + * Provides APIs to get/set the IMS service feature/capability/parameters. + * The config items include: + * 1) Items provisioned by the operator. + * 2) Items configured by user. Mainly service feature class. + * + * @hide + */ +public class ImsConfig { + private static final String TAG = "ImsConfig"; + private boolean DBG = true; + private final IImsConfig miConfig; + private Context mContext; + + /** + * Broadcast action: the feature enable status was changed + * + * @hide + */ + public static final String ACTION_IMS_FEATURE_CHANGED = + "com.android.intent.action.IMS_FEATURE_CHANGED"; + + /** + * Broadcast action: the configuration was changed + * + * @hide + */ + public static final String ACTION_IMS_CONFIG_CHANGED = + "com.android.intent.action.IMS_CONFIG_CHANGED"; + + /** + * Extra parameter "item" of intent ACTION_IMS_FEATURE_CHANGED and ACTION_IMS_CONFIG_CHANGED. + * It is the value of FeatureConstants or ConfigConstants. + * + * @hide + */ + public static final String EXTRA_CHANGED_ITEM = "item"; + + /** + * Extra parameter "value" of intent ACTION_IMS_FEATURE_CHANGED and ACTION_IMS_CONFIG_CHANGED. + * It is the new value of "item". + * + * @hide + */ + public static final String EXTRA_NEW_VALUE = "value"; + + /** + * Defines IMS service/capability feature constants. + */ + public static class FeatureConstants { + public static final int FEATURE_TYPE_UNKNOWN = -1; + + /** + * FEATURE_TYPE_VOLTE supports features defined in 3GPP and + * GSMA IR.92 over LTE. + */ + public static final int FEATURE_TYPE_VOICE_OVER_LTE = 0; + + /** + * FEATURE_TYPE_LVC supports features defined in 3GPP and + * GSMA IR.94 over LTE. + */ + public static final int FEATURE_TYPE_VIDEO_OVER_LTE = 1; + + /** + * FEATURE_TYPE_VOICE_OVER_WIFI supports features defined in 3GPP and + * GSMA IR.92 over WiFi. + */ + public static final int FEATURE_TYPE_VOICE_OVER_WIFI = 2; + + /** + * FEATURE_TYPE_VIDEO_OVER_WIFI supports features defined in 3GPP and + * GSMA IR.94 over WiFi. + */ + public static final int FEATURE_TYPE_VIDEO_OVER_WIFI = 3; + + /** + * FEATURE_TYPE_UT supports features defined in 3GPP and + * GSMA IR.92 over LTE. + */ + public static final int FEATURE_TYPE_UT_OVER_LTE = 4; + + /** + * FEATURE_TYPE_UT_OVER_WIFI supports features defined in 3GPP and + * GSMA IR.92 over WiFi. + */ + public static final int FEATURE_TYPE_UT_OVER_WIFI = 5; + } + + /** + * Defines IMS service/capability parameters. + */ + public static class ConfigConstants { + + // Define IMS config items + public static final int CONFIG_START = 0; + + // Define operator provisioned config items + public static final int PROVISIONED_CONFIG_START = CONFIG_START; + + /** + * AMR CODEC Mode Value set, 0-7 in comma separated sequence. + * Value is in String format. + */ + public static final int VOCODER_AMRMODESET = CONFIG_START; + + /** + * Wide Band AMR CODEC Mode Value set,0-7 in comma separated sequence. + * Value is in String format. + */ + public static final int VOCODER_AMRWBMODESET = 1; + + /** + * SIP Session Timer value (seconds). + * Value is in Integer format. + */ + public static final int SIP_SESSION_TIMER = 2; + + /** + * Minimum SIP Session Expiration Timer in (seconds). + * Value is in Integer format. + */ + public static final int MIN_SE = 3; + + /** + * SIP_INVITE cancellation time out value (in milliseconds). Integer format. + * Value is in Integer format. + */ + public static final int CANCELLATION_TIMER = 4; + + /** + * Delay time when an iRAT transition from eHRPD/HRPD/1xRTT to LTE. + * Value is in Integer format. + */ + public static final int TDELAY = 5; + + /** + * Silent redial status of Enabled (True), or Disabled (False). + * Value is in Integer format. + */ + public static final int SILENT_REDIAL_ENABLE = 6; + + /** + * SIP T1 timer value in milliseconds. See RFC 3261 for define. + * Value is in Integer format. + */ + public static final int SIP_T1_TIMER = 7; + + /** + * SIP T2 timer value in milliseconds. See RFC 3261 for define. + * Value is in Integer format. + */ + public static final int SIP_T2_TIMER = 8; + + /** + * SIP TF timer value in milliseconds. See RFC 3261 for define. + * Value is in Integer format. + */ + public static final int SIP_TF_TIMER = 9; + + /** + * VoLTE status for VLT/s status of Enabled (1), or Disabled (0). + * Value is in Integer format. + */ + public static final int VLT_SETTING_ENABLED = 10; + + /** + * VoLTE status for LVC/s status of Enabled (1), or Disabled (0). + * Value is in Integer format. + */ + public static final int LVC_SETTING_ENABLED = 11; + /** + * Domain Name for the device to populate the request URI for REGISTRATION. + * Value is in String format. + */ + public static final int DOMAIN_NAME = 12; + /** + * Device Outgoing SMS based on either 3GPP or 3GPP2 standards. + * Value is in Integer format. 3GPP2(0), 3GPP(1) + */ + public static final int SMS_FORMAT = 13; + /** + * Turns IMS ON/OFF on the device. + * Value is in Integer format. ON (1), OFF(0). + */ + public static final int SMS_OVER_IP = 14; + /** + * Requested expiration for Published Online availability. + * Value is in Integer format. + */ + public static final int PUBLISH_TIMER = 15; + /** + * Requested expiration for Published Offline availability. + * Value is in Integer format. + */ + public static final int PUBLISH_TIMER_EXTENDED = 16; + /** + * + * Value is in Integer format. + */ + public static final int CAPABILITY_DISCOVERY_ENABLED = 17; + /** + * Period of time the capability information of the contact is cached on handset. + * Value is in Integer format. + */ + public static final int CAPABILITIES_CACHE_EXPIRATION = 18; + /** + * Peiod of time the availability information of a contact is cached on device. + * Value is in Integer format. + */ + public static final int AVAILABILITY_CACHE_EXPIRATION = 19; + /** + * Interval between successive capabilities polling. + * Value is in Integer format. + */ + public static final int CAPABILITIES_POLL_INTERVAL = 20; + /** + * Minimum time between two published messages from the device. + * Value is in Integer format. + */ + public static final int SOURCE_THROTTLE_PUBLISH = 21; + /** + * The Maximum number of MDNs contained in one Request Contained List. + * Value is in Integer format. + */ + public static final int MAX_NUMENTRIES_IN_RCL = 22; + /** + * Expiration timer for subscription of a Request Contained List, used in capability + * polling. + * Value is in Integer format. + */ + public static final int CAPAB_POLL_LIST_SUB_EXP = 23; + /** + * Applies compression to LIST Subscription. + * Value is in Integer format. Enable (1), Disable(0). + */ + public static final int GZIP_FLAG = 24; + /** + * VOLTE Status for EAB/s status of Enabled (1), or Disabled (0). + * Value is in Integer format. + */ + public static final int EAB_SETTING_ENABLED = 25; + /** + * Wi-Fi calling roaming status. + * Value is in Integer format. ON (1), OFF(0). + */ + public static final int VOICE_OVER_WIFI_ROAMING = 26; + /** + * Wi-Fi calling modem - WfcModeFeatureValueConstants. + * Value is in Integer format. + */ + public static final int VOICE_OVER_WIFI_MODE = 27; + /** + * VOLTE Status for voice over wifi status of Enabled (1), or Disabled (0). + * Value is in Integer format. + */ + public static final int VOICE_OVER_WIFI_SETTING_ENABLED = 28; + /** + * Mobile data enabled. + * Value is in Integer format. On (1), OFF(0). + */ + public static final int MOBILE_DATA_ENABLED = 29; + /** + * VoLTE user opted in status. + * Value is in Integer format. Opted-in (1) Opted-out (0). + */ + public static final int VOLTE_USER_OPT_IN_STATUS = 30; + /** + * Proxy for Call Session Control Function(P-CSCF) address for Local-BreakOut(LBO). + * Value is in String format. + */ + public static final int LBO_PCSCF_ADDRESS = 31; + /** + * Keep Alive Enabled for SIP. + * Value is in Integer format. On(1), OFF(0). + */ + public static final int KEEP_ALIVE_ENABLED = 32; + /** + * Registration retry Base Time value in seconds. + * Value is in Integer format. + */ + public static final int REGISTRATION_RETRY_BASE_TIME_SEC = 33; + /** + * Registration retry Max Time value in seconds. + * Value is in Integer format. + */ + public static final int REGISTRATION_RETRY_MAX_TIME_SEC = 34; + /** + * Smallest RTP port for speech codec. + * Value is in integer format. + */ + public static final int SPEECH_START_PORT = 35; + /** + * Largest RTP port for speech code. + * Value is in Integer format. + */ + public static final int SPEECH_END_PORT = 36; + /** + * SIP Timer A's value in milliseconds. Timer A is the INVITE request + * retransmit interval, for UDP only. + * Value is in Integer format. + */ + public static final int SIP_INVITE_REQ_RETX_INTERVAL_MSEC = 37; + /** + * SIP Timer B's value in milliseconds. Timer B is the wait time for + * INVITE message to be acknowledged. + * Value is in Integer format. + */ + public static final int SIP_INVITE_RSP_WAIT_TIME_MSEC = 38; + /** + * SIP Timer D's value in milliseconds. Timer D is the wait time for + * response retransmits of the invite client transactions. + * Value is in Integer format. + */ + public static final int SIP_INVITE_RSP_RETX_WAIT_TIME_MSEC = 39; + /** + * SIP Timer E's value in milliseconds. Timer E is the value Non-INVITE + * request retransmit interval, for UDP only. + * Value is in Integer format. + */ + public static final int SIP_NON_INVITE_REQ_RETX_INTERVAL_MSEC = 40; + /** + * SIP Timer F's value in milliseconds. Timer F is the Non-INVITE transaction + * timeout timer. + * Value is in Integer format. + */ + public static final int SIP_NON_INVITE_TXN_TIMEOUT_TIMER_MSEC = 41; + /** + * SIP Timer G's value in milliseconds. Timer G is the value of INVITE response + * retransmit interval. + * Value is in Integer format. + */ + public static final int SIP_INVITE_RSP_RETX_INTERVAL_MSEC = 42; + /** + * SIP Timer H's value in milliseconds. Timer H is the value of wait time for + * ACK receipt. + * Value is in Integer format. + */ + public static final int SIP_ACK_RECEIPT_WAIT_TIME_MSEC = 43; + /** + * SIP Timer I's value in milliseconds. Timer I is the value of wait time for + * ACK retransmits. + * Value is in Integer format. + */ + public static final int SIP_ACK_RETX_WAIT_TIME_MSEC = 44; + /** + * SIP Timer J's value in milliseconds. Timer J is the value of wait time for + * non-invite request retransmission. + * Value is in Integer format. + */ + public static final int SIP_NON_INVITE_REQ_RETX_WAIT_TIME_MSEC = 45; + /** + * SIP Timer K's value in milliseconds. Timer K is the value of wait time for + * non-invite response retransmits. + * Value is in Integer format. + */ + public static final int SIP_NON_INVITE_RSP_RETX_WAIT_TIME_MSEC = 46; + /** + * AMR WB octet aligned dynamic payload type. + * Value is in Integer format. + */ + public static final int AMR_WB_OCTET_ALIGNED_PT = 47; + /** + * AMR WB bandwidth efficient payload type. + * Value is in Integer format. + */ + public static final int AMR_WB_BANDWIDTH_EFFICIENT_PT = 48; + /** + * AMR octet aligned dynamic payload type. + * Value is in Integer format. + */ + public static final int AMR_OCTET_ALIGNED_PT = 49; + /** + * AMR bandwidth efficient payload type. + * Value is in Integer format. + */ + public static final int AMR_BANDWIDTH_EFFICIENT_PT = 50; + /** + * DTMF WB payload type. + * Value is in Integer format. + */ + public static final int DTMF_WB_PT = 51; + /** + * DTMF NB payload type. + * Value is in Integer format. + */ + public static final int DTMF_NB_PT = 52; + /** + * AMR Default encoding mode. + * Value is in Integer format. + */ + public static final int AMR_DEFAULT_MODE = 53; + /** + * SMS Public Service Identity. + * Value is in String format. + */ + public static final int SMS_PSI = 54; + /** + * Video Quality - VideoQualityFeatureValuesConstants. + * Value is in Integer format. + */ + public static final int VIDEO_QUALITY = 55; + /** + * LTE threshold. + * Handover from LTE to WiFi if LTE < THLTE1 and WiFi >= VOWT_A. + */ + public static final int TH_LTE1 = 56; + /** + * LTE threshold. + * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2). + */ + public static final int TH_LTE2 = 57; + /** + * LTE threshold. + * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2). + */ + public static final int TH_LTE3 = 58; + /** + * 1x threshold. + * Handover from 1x to WiFi if 1x < TH1x + */ + public static final int TH_1x = 59; + /** + * WiFi threshold. + * Handover from LTE to WiFi if LTE < THLTE1 and WiFi >= VOWT_A. + */ + public static final int VOWT_A = 60; + /** + * WiFi threshold. + * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2). + */ + public static final int VOWT_B = 61; + /** + * LTE ePDG timer. + * Device shall not handover back to LTE until the T_ePDG_LTE timer expires. + */ + public static final int T_EPDG_LTE = 62; + /** + * WiFi ePDG timer. + * Device shall not handover back to WiFi until the T_ePDG_WiFi timer expires. + */ + public static final int T_EPDG_WIFI = 63; + /** + * 1x ePDG timer. + * Device shall not re-register on 1x until the T_ePDG_1x timer expires. + */ + public static final int T_EPDG_1X = 64; + /** + * MultiEndpoint status: Enabled (1), or Disabled (0). + * Value is in Integer format. + */ + public static final int VICE_SETTING_ENABLED = 65; + + // Expand the operator config items as needed here, need to change + // PROVISIONED_CONFIG_END after that. + public static final int PROVISIONED_CONFIG_END = VICE_SETTING_ENABLED; + + // Expand the operator config items as needed here. + } + + /** + * Defines IMS set operation status. + */ + public static class OperationStatusConstants { + public static final int UNKNOWN = -1; + public static final int SUCCESS = 0; + public static final int FAILED = 1; + public static final int UNSUPPORTED_CAUSE_NONE = 2; + public static final int UNSUPPORTED_CAUSE_RAT = 3; + public static final int UNSUPPORTED_CAUSE_DISABLED = 4; + } + + /** + * Defines IMS get operation values. + */ + public static class OperationValuesConstants { + /** + * Values related to Video Quality + */ + public static final int VIDEO_QUALITY_UNKNOWN = -1; + public static final int VIDEO_QUALITY_LOW = 0; + public static final int VIDEO_QUALITY_HIGH = 1; + } + + /** + * Defines IMS video quality feature value. + */ + public static class VideoQualityFeatureValuesConstants { + public static final int LOW = 0; + public static final int HIGH = 1; + } + + /** + * Defines IMS feature value. + */ + public static class FeatureValueConstants { + public static final int OFF = 0; + public static final int ON = 1; + } + + /** + * Defines IMS feature value. + */ + public static class WfcModeFeatureValueConstants { + public static final int WIFI_ONLY = 0; + public static final int CELLULAR_PREFERRED = 1; + public static final int WIFI_PREFERRED = 2; + } + + public ImsConfig(IImsConfig iconfig, Context context) { + if (DBG) Rlog.d(TAG, "ImsConfig creates"); + miConfig = iconfig; + mContext = context; + } + + /** + * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack. + * This function should not be called from the mainthread as it could block the + * mainthread. + * + * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. + * @return the value in Integer format. + * + * @throws ImsException if calling the IMS service results in an error. + */ + public int getProvisionedValue(int item) throws ImsException { + int ret = 0; + try { + ret = miConfig.getProvisionedValue(item); + } catch (RemoteException e) { + throw new ImsException("getValue()", e, + ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); + } + if (DBG) Rlog.d(TAG, "getProvisionedValue(): item = " + item + ", ret =" + ret); + + return ret; + } + + /** + * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack. + * This function should not be called from the mainthread as it could block the + * mainthread. + * + * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. + * @return value in String format. + * + * @throws ImsException if calling the IMS service results in an error. + */ + public String getProvisionedStringValue(int item) throws ImsException { + String ret = "Unknown"; + try { + ret = miConfig.getProvisionedStringValue(item); + } catch (RemoteException e) { + throw new ImsException("getProvisionedStringValue()", e, + ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); + } + if (DBG) Rlog.d(TAG, "getProvisionedStringValue(): item = " + item + ", ret =" + ret); + + return ret; + } + + /** + * Sets the value for IMS service/capabilities parameters by + * the operator device management entity. + * This function should not be called from main thread as it could block + * mainthread. + * + * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. + * @param value in Integer format. + * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants + * + * @throws ImsException if calling the IMS service results in an error. + */ + public int setProvisionedValue(int item, int value) + throws ImsException { + int ret = OperationStatusConstants.UNKNOWN; + if (DBG) { + Rlog.d(TAG, "setProvisionedValue(): item = " + item + + "value = " + value); + } + try { + ret = miConfig.setProvisionedValue(item, value); + } catch (RemoteException e) { + throw new ImsException("setProvisionedValue()", e, + ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); + } + if (DBG) { + Rlog.d(TAG, "setProvisionedValue(): item = " + item + + " value = " + value + " ret = " + ret); + } + return ret; + } + + /** + * Sets the value for IMS service/capabilities parameters by + * the operator device management entity. + * This function should not be called from main thread as it could block + * mainthread. + * + * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. + * @param value in String format. + * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants + * + * @throws ImsException if calling the IMS service results in an error. + */ + public int setProvisionedStringValue(int item, String value) + throws ImsException { + int ret = OperationStatusConstants.UNKNOWN; + try { + ret = miConfig.setProvisionedStringValue(item, value); + } catch (RemoteException e) { + throw new ImsException("setProvisionedStringValue()", e, + ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); + } + if (DBG) { + Rlog.d(TAG, "setProvisionedStringValue(): item = " + item + + ", value =" + value); + } + return ret; + } + + /** + * Gets the value for IMS feature item for specified network type. + * + * @param feature, defined as in FeatureConstants. + * @param network, defined as in android.telephony.TelephonyManager#NETWORK_TYPE_XXX. + * @param listener, provided to be notified for the feature on/off status. + * @return void + * + * @throws ImsException if calling the IMS service results in an error. + */ + public void getFeatureValue(int feature, int network, + ImsConfigListener listener) throws ImsException { + if (DBG) { + Rlog.d(TAG, "getFeatureValue: feature = " + feature + ", network =" + network + + ", listener =" + listener); + } + try { + miConfig.getFeatureValue(feature, network, listener); + } catch (RemoteException e) { + throw new ImsException("getFeatureValue()", e, + ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); + } + } + + /** + * Sets the value for IMS feature item for specified network type. + * + * @param feature, as defined in FeatureConstants. + * @param network, as defined in android.telephony.TelephonyManager#NETWORK_TYPE_XXX. + * @param value, as defined in FeatureValueConstants. + * @param listener, provided if caller needs to be notified for set result. + * @return void + * + * @throws ImsException if calling the IMS service results in an error. + */ + public void setFeatureValue(int feature, int network, int value, + ImsConfigListener listener) throws ImsException { + if (DBG) { + Rlog.d(TAG, "setFeatureValue: feature = " + feature + ", network =" + network + + ", value =" + value + ", listener =" + listener); + } + try { + miConfig.setFeatureValue(feature, network, value, listener); + } catch (RemoteException e) { + throw new ImsException("setFeatureValue()", e, + ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); + } + } +} diff --git a/telephony/java/com/android/ims/ImsException.java b/telephony/java/com/android/ims/ImsException.java new file mode 100644 index 0000000000000..74b20f472641c --- /dev/null +++ b/telephony/java/com/android/ims/ImsException.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ims; + +/** + * This class defines a general IMS-related exception. + * + * @hide + */ +public class ImsException extends Exception { + + /** + * Refer to CODE_LOCAL_* in {@link ImsReasonInfo} + */ + private int mCode; + + public ImsException() { + } + + public ImsException(String message, int code) { + super(message + ", code = " + code); + mCode = code; + } + + public ImsException(String message, Throwable cause, int code) { + super(message, cause); + mCode = code; + } + + /** + * Gets the detailed exception code when ImsException is throwed + * + * @return the exception code in {@link ImsReasonInfo} + */ + public int getCode() { + return mCode; + } +} diff --git a/telephony/java/com/android/ims/ImsUtInterface.java b/telephony/java/com/android/ims/ImsUtInterface.java new file mode 100644 index 0000000000000..5984e789a3639 --- /dev/null +++ b/telephony/java/com/android/ims/ImsUtInterface.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ims; + +import android.os.Message; + +/** + * Provides APIs for the supplementary service settings using IMS (Ut interface). + * It is created from 3GPP TS 24.623 (XCAP(XML Configuration Access Protocol) + * over the Ut interface for manipulating supplementary services). + * + * @hide + */ +public interface ImsUtInterface { + /** + * Actions + * @hide + */ + public static final int ACTION_DEACTIVATION = 0; + public static final int ACTION_ACTIVATION = 1; + public static final int ACTION_REGISTRATION = 3; + public static final int ACTION_ERASURE = 4; + public static final int ACTION_INTERROGATION = 5; + + /** + * OIR (Originating Identification Restriction, 3GPP TS 24.607) + * OIP (Originating Identification Presentation, 3GPP TS 24.607) + * TIR (Terminating Identification Restriction, 3GPP TS 24.608) + * TIP (Terminating Identification Presentation, 3GPP TS 24.608) + */ + public static final int OIR_DEFAULT = 0; // "user subscription default value" + public static final int OIR_PRESENTATION_RESTRICTED = 1; + public static final int OIR_PRESENTATION_NOT_RESTRICTED = 2; + + /** + * CW (Communication Waiting, 3GPP TS 24.615) + */ + + /** + * CDIV (Communication Diversion, 3GPP TS 24.604) + * actions: target, no reply timer + */ + public static final int CDIV_CF_UNCONDITIONAL = 0; + public static final int CDIV_CF_BUSY = 1; + public static final int CDIV_CF_NO_REPLY = 2; + public static final int CDIV_CF_NOT_REACHABLE = 3; + // For CS service code: 002 + public static final int CDIV_CF_ALL = 4; + // For CS service code: 004 + public static final int CDIV_CF_ALL_CONDITIONAL = 5; + // It's only supported in the IMS service (CS does not define it). + // IR.92 recommends that an UE activates both the CFNRc and the CFNL + // (CDIV using condition not-registered) to the same target. + public static final int CDIV_CF_NOT_LOGGED_IN = 6; + + /** + * CB (Communication Barring, 3GPP TS 24.611) + */ + // Barring of All Incoming Calls + public static final int CB_BAIC = 1; + // Barring of All Outgoing Calls + public static final int CB_BAOC = 2; + // Barring of Outgoing International Calls + public static final int CB_BOIC = 3; + // Barring of Outgoing International Calls - excluding Home Country + public static final int CB_BOIC_EXHC = 4; + // Barring of Incoming Calls - when roaming + public static final int CB_BIC_WR = 5; + // Barring of Anonymous Communication Rejection (ACR) - a particular case of ICB service + public static final int CB_BIC_ACR = 6; + // Barring of All Calls + public static final int CB_BA_ALL = 7; + // Barring of Outgoing Services (Service Code 333 - 3GPP TS 22.030 Table B-1) + public static final int CB_BA_MO = 8; + // Barring of Incoming Services (Service Code 353 - 3GPP TS 22.030 Table B-1) + public static final int CB_BA_MT = 9; + // Barring of Specific Incoming calls + public static final int CB_BS_MT = 10; + + /** + * Invalid result value. + */ + public static final int INVALID = (-1); + + + + /** + * Operations for the supplementary service configuration + */ + + /** + * Retrieves the configuration of the call barring. + * The return value of ((AsyncResult)result.obj) is an array of {@link ImsSsInfo}. + */ + public void queryCallBarring(int cbType, Message result); + + /** + * Retrieves the configuration of the call forward. + * The return value of ((AsyncResult)result.obj) is an array of {@link ImsCallForwardInfo}. + */ + public void queryCallForward(int condition, String number, Message result); + + /** + * Retrieves the configuration of the call waiting. + * The return value of ((AsyncResult)result.obj) is an array of {@link ImsSsInfo}. + */ + public void queryCallWaiting(Message result); + + /** + * Retrieves the default CLIR setting. + */ + public void queryCLIR(Message result); + + /** + * Retrieves the CLIP call setting. + */ + public void queryCLIP(Message result); + + /** + * Retrieves the COLR call setting. + */ + public void queryCOLR(Message result); + + /** + * Retrieves the COLP call setting. + */ + public void queryCOLP(Message result); + + /** + * Modifies the configuration of the call barring. + */ + public void updateCallBarring(int cbType, int action, + Message result, String[] barrList); + + /** + * Modifies the configuration of the call forward. + */ + public void updateCallForward(int action, int condition, String number, + int serviceClass, int timeSeconds, Message result); + + /** + * Modifies the configuration of the call waiting. + */ + public void updateCallWaiting(boolean enable, int serviceClass, Message result); + + /** + * Updates the configuration of the CLIR supplementary service. + */ + public void updateCLIR(int clirMode, Message result); + + /** + * Updates the configuration of the CLIP supplementary service. + */ + public void updateCLIP(boolean enable, Message result); + + /** + * Updates the configuration of the COLR supplementary service. + */ + public void updateCOLR(int presentation, Message result); + + /** + * Updates the configuration of the COLP supplementary service. + */ + public void updateCOLP(boolean enable, Message result); +} diff --git a/telephony/java/com/android/ims/internal/IImsServiceFeatureListener.aidl b/telephony/java/com/android/ims/internal/IImsServiceFeatureListener.aidl index 82a13dcb537c8..df10700283f23 100644 --- a/telephony/java/com/android/ims/internal/IImsServiceFeatureListener.aidl +++ b/telephony/java/com/android/ims/internal/IImsServiceFeatureListener.aidl @@ -17,7 +17,8 @@ package com.android.ims.internal; /** -* Interface from ImsResolver to ImsServiceProxy in ImsManager. + * Interface from ImsResolver to ImsServiceProxy in ImsManager. + * Callback to ImsManager when a feature changes in the ImsServiceController. * {@hide} */ oneway interface IImsServiceFeatureListener { diff --git a/telephony/java/com/android/ims/internal/ImsCallSession.java b/telephony/java/com/android/ims/internal/ImsCallSession.java new file mode 100644 index 0000000000000..8196b2367ce9d --- /dev/null +++ b/telephony/java/com/android/ims/internal/ImsCallSession.java @@ -0,0 +1,1290 @@ +/* + * Copyright (c) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ims.internal; + +import android.os.Message; +import android.os.RemoteException; + +import java.util.Objects; + +import android.telephony.ims.stub.ImsCallSessionListenerImplBase; +import android.util.Log; +import com.android.ims.ImsCallProfile; +import com.android.ims.ImsConferenceState; +import com.android.ims.ImsReasonInfo; +import com.android.ims.ImsStreamMediaProfile; +import com.android.ims.ImsSuppServiceNotification; + +/** + * Provides the call initiation/termination, and media exchange between two IMS endpoints. + * It directly communicates with IMS service which implements the IMS protocol behavior. + * + * @hide + */ +public class ImsCallSession { + private static final String TAG = "ImsCallSession"; + + /** + * Defines IMS call session state. + */ + public static class State { + public static final int IDLE = 0; + public static final int INITIATED = 1; + public static final int NEGOTIATING = 2; + public static final int ESTABLISHING = 3; + public static final int ESTABLISHED = 4; + + public static final int RENEGOTIATING = 5; + public static final int REESTABLISHING = 6; + + public static final int TERMINATING = 7; + public static final int TERMINATED = 8; + + public static final int INVALID = (-1); + + /** + * Converts the state to string. + */ + public static String toString(int state) { + switch (state) { + case IDLE: + return "IDLE"; + case INITIATED: + return "INITIATED"; + case NEGOTIATING: + return "NEGOTIATING"; + case ESTABLISHING: + return "ESTABLISHING"; + case ESTABLISHED: + return "ESTABLISHED"; + case RENEGOTIATING: + return "RENEGOTIATING"; + case REESTABLISHING: + return "REESTABLISHING"; + case TERMINATING: + return "TERMINATING"; + case TERMINATED: + return "TERMINATED"; + default: + return "UNKNOWN"; + } + } + + private State() { + } + } + + /** + * Listener for events relating to an IMS session, such as when a session is being + * recieved ("on ringing") or a call is outgoing ("on calling"). + *

Many of these events are also received by {@link ImsCall.Listener}.

+ */ + public static class Listener { + /** + * Called when a request is sent out to initiate a new session + * and 1xx response is received from the network. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionProgressing(ImsCallSession session, + ImsStreamMediaProfile profile) { + // no-op + } + + /** + * Called when the session is established. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionStarted(ImsCallSession session, + ImsCallProfile profile) { + // no-op + } + + /** + * Called when the session establishment is failed. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the session establishment failure + */ + public void callSessionStartFailed(ImsCallSession session, + ImsReasonInfo reasonInfo) { + } + + /** + * Called when the session is terminated. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the session termination + */ + public void callSessionTerminated(ImsCallSession session, + ImsReasonInfo reasonInfo) { + } + + /** + * Called when the session is in hold. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionHeld(ImsCallSession session, + ImsCallProfile profile) { + } + + /** + * Called when the session hold is failed. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the session hold failure + */ + public void callSessionHoldFailed(ImsCallSession session, + ImsReasonInfo reasonInfo) { + } + + /** + * Called when the session hold is received from the remote user. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionHoldReceived(ImsCallSession session, + ImsCallProfile profile) { + } + + /** + * Called when the session resume is done. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionResumed(ImsCallSession session, + ImsCallProfile profile) { + } + + /** + * Called when the session resume is failed. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the session resume failure + */ + public void callSessionResumeFailed(ImsCallSession session, + ImsReasonInfo reasonInfo) { + } + + /** + * Called when the session resume is received from the remote user. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionResumeReceived(ImsCallSession session, + ImsCallProfile profile) { + } + + /** + * Called when the session merge has been started. At this point, the {@code newSession} + * represents the session which has been initiated to the IMS conference server for the + * new merged conference. + * + * @param session the session object that carries out the IMS session + * @param newSession the session object that is merged with an active & hold session + */ + public void callSessionMergeStarted(ImsCallSession session, + ImsCallSession newSession, ImsCallProfile profile) { + } + + /** + * Called when the session merge is successful and the merged session is active. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionMergeComplete(ImsCallSession session) { + } + + /** + * Called when the session merge has failed. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the call merge failure + */ + public void callSessionMergeFailed(ImsCallSession session, + ImsReasonInfo reasonInfo) { + } + + /** + * Called when the session is updated (except for hold/unhold). + * + * @param session the session object that carries out the IMS session + */ + public void callSessionUpdated(ImsCallSession session, + ImsCallProfile profile) { + } + + /** + * Called when the session update is failed. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the session update failure + */ + public void callSessionUpdateFailed(ImsCallSession session, + ImsReasonInfo reasonInfo) { + } + + /** + * Called when the session update is received from the remote user. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionUpdateReceived(ImsCallSession session, + ImsCallProfile profile) { + // no-op + } + + /** + * Called when the session is extended to the conference session. + * + * @param session the session object that carries out the IMS session + * @param newSession the session object that is extended to the conference + * from the active session + */ + public void callSessionConferenceExtended(ImsCallSession session, + ImsCallSession newSession, ImsCallProfile profile) { + } + + /** + * Called when the conference extension is failed. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the conference extension failure + */ + public void callSessionConferenceExtendFailed(ImsCallSession session, + ImsReasonInfo reasonInfo) { + } + + /** + * Called when the conference extension is received from the remote user. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionConferenceExtendReceived(ImsCallSession session, + ImsCallSession newSession, ImsCallProfile profile) { + // no-op + } + + /** + * Called when the invitation request of the participants is delivered to the conference + * server. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionInviteParticipantsRequestDelivered(ImsCallSession session) { + // no-op + } + + /** + * Called when the invitation request of the participants is failed. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the conference invitation failure + */ + public void callSessionInviteParticipantsRequestFailed(ImsCallSession session, + ImsReasonInfo reasonInfo) { + // no-op + } + + /** + * Called when the removal request of the participants is delivered to the conference + * server. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionRemoveParticipantsRequestDelivered(ImsCallSession session) { + // no-op + } + + /** + * Called when the removal request of the participants is failed. + * + * @param session the session object that carries out the IMS session + * @param reasonInfo detailed reason of the conference removal failure + */ + public void callSessionRemoveParticipantsRequestFailed(ImsCallSession session, + ImsReasonInfo reasonInfo) { + // no-op + } + + /** + * Called when the conference state is updated. + * + * @param session the session object that carries out the IMS session + */ + public void callSessionConferenceStateUpdated(ImsCallSession session, + ImsConferenceState state) { + // no-op + } + + /** + * Called when the USSD message is received from the network. + * + * @param mode mode of the USSD message (REQUEST / NOTIFY) + * @param ussdMessage USSD message + */ + public void callSessionUssdMessageReceived(ImsCallSession session, + int mode, String ussdMessage) { + // no-op + } + + /** + * Called when session access technology changes + * + * @param session IMS session object + * @param srcAccessTech original access technology + * @param targetAccessTech new access technology + * @param reasonInfo + */ + public void callSessionHandover(ImsCallSession session, + int srcAccessTech, int targetAccessTech, + ImsReasonInfo reasonInfo) { + // no-op + } + + /** + * Called when session access technology change fails + * + * @param session IMS session object + * @param srcAccessTech original access technology + * @param targetAccessTech new access technology + * @param reasonInfo handover failure reason + */ + public void callSessionHandoverFailed(ImsCallSession session, + int srcAccessTech, int targetAccessTech, + ImsReasonInfo reasonInfo) { + // no-op + } + + /** + * Called when TTY mode of remote party changed + * + * @param session IMS session object + * @param mode TTY mode of remote party + */ + public void callSessionTtyModeReceived(ImsCallSession session, + int mode) { + // no-op + } + + /** + * Notifies of a change to the multiparty state for this {@code ImsCallSession}. + * + * @param session The call session. + * @param isMultiParty {@code true} if the session became multiparty, {@code false} + * otherwise. + */ + public void callSessionMultipartyStateChanged(ImsCallSession session, + boolean isMultiParty) { + // no-op + } + + /** + * Called when the session supplementary service is received + * + * @param session the session object that carries out the IMS session + */ + public void callSessionSuppServiceReceived(ImsCallSession session, + ImsSuppServiceNotification suppServiceInfo) { + } + } + + private final IImsCallSession miSession; + private boolean mClosed = false; + private Listener mListener; + + public ImsCallSession(IImsCallSession iSession) { + miSession = iSession; + + if (iSession != null) { + try { + iSession.setListener(new IImsCallSessionListenerProxy()); + } catch (RemoteException e) { + } + } else { + mClosed = true; + } + } + + public ImsCallSession(IImsCallSession iSession, Listener listener) { + this(iSession); + setListener(listener); + } + + /** + * Closes this object. This object is not usable after being closed. + */ + public synchronized void close() { + if (mClosed) { + return; + } + + try { + miSession.close(); + mClosed = true; + } catch (RemoteException e) { + } + } + + /** + * Gets the call ID of the session. + * + * @return the call ID + */ + public String getCallId() { + if (mClosed) { + return null; + } + + try { + return miSession.getCallId(); + } catch (RemoteException e) { + return null; + } + } + + /** + * Gets the call profile that this session is associated with + * + * @return the call profile that this session is associated with + */ + public ImsCallProfile getCallProfile() { + if (mClosed) { + return null; + } + + try { + return miSession.getCallProfile(); + } catch (RemoteException e) { + return null; + } + } + + /** + * Gets the local call profile that this session is associated with + * + * @return the local call profile that this session is associated with + */ + public ImsCallProfile getLocalCallProfile() { + if (mClosed) { + return null; + } + + try { + return miSession.getLocalCallProfile(); + } catch (RemoteException e) { + return null; + } + } + + /** + * Gets the remote call profile that this session is associated with + * + * @return the remote call profile that this session is associated with + */ + public ImsCallProfile getRemoteCallProfile() { + if (mClosed) { + return null; + } + + try { + return miSession.getRemoteCallProfile(); + } catch (RemoteException e) { + return null; + } + } + + /** + * Gets the video call provider for the session. + * + * @return The video call provider. + */ + public IImsVideoCallProvider getVideoCallProvider() { + if (mClosed) { + return null; + } + + try { + return miSession.getVideoCallProvider(); + } catch (RemoteException e) { + return null; + } + } + + /** + * Gets the value associated with the specified property of this session. + * + * @return the string value associated with the specified property + */ + public String getProperty(String name) { + if (mClosed) { + return null; + } + + try { + return miSession.getProperty(name); + } catch (RemoteException e) { + return null; + } + } + + /** + * Gets the session state. + * The value returned must be one of the states in {@link State}. + * + * @return the session state + */ + public int getState() { + if (mClosed) { + return State.INVALID; + } + + try { + return miSession.getState(); + } catch (RemoteException e) { + return State.INVALID; + } + } + + /** + * Determines if the {@link ImsCallSession} is currently alive (e.g. not in a terminated or + * closed state). + * + * @return {@code True} if the session is alive. + */ + public boolean isAlive() { + if (mClosed) { + return false; + } + + int state = getState(); + switch (state) { + case State.IDLE: + case State.INITIATED: + case State.NEGOTIATING: + case State.ESTABLISHING: + case State.ESTABLISHED: + case State.RENEGOTIATING: + case State.REESTABLISHING: + return true; + default: + return false; + } + } + + /** + * Gets the native IMS call session. + * @hide + */ + public IImsCallSession getSession() { + return miSession; + } + + /** + * Checks if the session is in call. + * + * @return true if the session is in call + */ + public boolean isInCall() { + if (mClosed) { + return false; + } + + try { + return miSession.isInCall(); + } catch (RemoteException e) { + return false; + } + } + + /** + * Sets the listener to listen to the session events. A {@link ImsCallSession} + * can only hold one listener at a time. Subsequent calls to this method + * override the previous listener. + * + * @param listener to listen to the session events of this object + */ + public void setListener(Listener listener) { + mListener = listener; + } + + /** + * Mutes or unmutes the mic for the active call. + * + * @param muted true if the call is muted, false otherwise + */ + public void setMute(boolean muted) { + if (mClosed) { + return; + } + + try { + miSession.setMute(muted); + } catch (RemoteException e) { + } + } + + /** + * Initiates an IMS call with the specified target and call profile. + * The session listener is called back upon defined session events. + * The method is only valid to call when the session state is in + * {@link ImsCallSession.State#IDLE}. + * + * @param callee dialed string to make the call to + * @param profile call profile to make the call with the specified service type, + * call type and media information + * @see Listener#callSessionStarted, Listener#callSessionStartFailed + */ + public void start(String callee, ImsCallProfile profile) { + if (mClosed) { + return; + } + + try { + miSession.start(callee, profile); + } catch (RemoteException e) { + } + } + + /** + * Initiates an IMS conference call with the specified target and call profile. + * The session listener is called back upon defined session events. + * The method is only valid to call when the session state is in + * {@link ImsCallSession.State#IDLE}. + * + * @param participants participant list to initiate an IMS conference call + * @param profile call profile to make the call with the specified service type, + * call type and media information + * @see Listener#callSessionStarted, Listener#callSessionStartFailed + */ + public void start(String[] participants, ImsCallProfile profile) { + if (mClosed) { + return; + } + + try { + miSession.startConference(participants, profile); + } catch (RemoteException e) { + } + } + + /** + * Accepts an incoming call or session update. + * + * @param callType call type specified in {@link ImsCallProfile} to be answered + * @param profile stream media profile {@link ImsStreamMediaProfile} to be answered + * @see Listener#callSessionStarted + */ + public void accept(int callType, ImsStreamMediaProfile profile) { + if (mClosed) { + return; + } + + try { + miSession.accept(callType, profile); + } catch (RemoteException e) { + } + } + + /** + * Rejects an incoming call or session update. + * + * @param reason reason code to reject an incoming call + * @see Listener#callSessionStartFailed + */ + public void reject(int reason) { + if (mClosed) { + return; + } + + try { + miSession.reject(reason); + } catch (RemoteException e) { + } + } + + /** + * Terminates a call. + * + * @see Listener#callSessionTerminated + */ + public void terminate(int reason) { + if (mClosed) { + return; + } + + try { + miSession.terminate(reason); + } catch (RemoteException e) { + } + } + + /** + * Puts a call on hold. When it succeeds, {@link Listener#callSessionHeld} is called. + * + * @param profile stream media profile {@link ImsStreamMediaProfile} to hold the call + * @see Listener#callSessionHeld, Listener#callSessionHoldFailed + */ + public void hold(ImsStreamMediaProfile profile) { + if (mClosed) { + return; + } + + try { + miSession.hold(profile); + } catch (RemoteException e) { + } + } + + /** + * Continues a call that's on hold. When it succeeds, + * {@link Listener#callSessionResumed} is called. + * + * @param profile stream media profile {@link ImsStreamMediaProfile} to resume the call + * @see Listener#callSessionResumed, Listener#callSessionResumeFailed + */ + public void resume(ImsStreamMediaProfile profile) { + if (mClosed) { + return; + } + + try { + miSession.resume(profile); + } catch (RemoteException e) { + } + } + + /** + * Merges the active & hold call. When it succeeds, + * {@link Listener#callSessionMergeStarted} is called. + * + * @see Listener#callSessionMergeStarted , Listener#callSessionMergeFailed + */ + public void merge() { + if (mClosed) { + return; + } + + try { + miSession.merge(); + } catch (RemoteException e) { + } + } + + /** + * Updates the current call's properties (ex. call mode change: video upgrade / downgrade). + * + * @param callType call type specified in {@link ImsCallProfile} to be updated + * @param profile stream media profile {@link ImsStreamMediaProfile} to be updated + * @see Listener#callSessionUpdated, Listener#callSessionUpdateFailed + */ + public void update(int callType, ImsStreamMediaProfile profile) { + if (mClosed) { + return; + } + + try { + miSession.update(callType, profile); + } catch (RemoteException e) { + } + } + + /** + * Extends this call to the conference call with the specified recipients. + * + * @param participants list to be invited to the conference call after extending the call + * @see Listener#callSessionConferenceExtended + * @see Listener#callSessionConferenceExtendFailed + */ + public void extendToConference(String[] participants) { + if (mClosed) { + return; + } + + try { + miSession.extendToConference(participants); + } catch (RemoteException e) { + } + } + + /** + * Requests the conference server to invite an additional participants to the conference. + * + * @param participants list to be invited to the conference call + * @see Listener#callSessionInviteParticipantsRequestDelivered + * @see Listener#callSessionInviteParticipantsRequestFailed + */ + public void inviteParticipants(String[] participants) { + if (mClosed) { + return; + } + + try { + miSession.inviteParticipants(participants); + } catch (RemoteException e) { + } + } + + /** + * Requests the conference server to remove the specified participants from the conference. + * + * @param participants participant list to be removed from the conference call + * @see Listener#callSessionRemoveParticipantsRequestDelivered + * @see Listener#callSessionRemoveParticipantsRequestFailed + */ + public void removeParticipants(String[] participants) { + if (mClosed) { + return; + } + + try { + miSession.removeParticipants(participants); + } catch (RemoteException e) { + } + } + + + /** + * Sends a DTMF code. According to RFC 2833, + * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15, + * and event flash to 16. Currently, event flash is not supported. + * + * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs. + */ + public void sendDtmf(char c, Message result) { + if (mClosed) { + return; + } + + try { + miSession.sendDtmf(c, result); + } catch (RemoteException e) { + } + } + + /** + * Starts a DTMF code. According to RFC 2833, + * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15, + * and event flash to 16. Currently, event flash is not supported. + * + * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs. + */ + public void startDtmf(char c) { + if (mClosed) { + return; + } + + try { + miSession.startDtmf(c); + } catch (RemoteException e) { + } + } + + /** + * Stops a DTMF code. + */ + public void stopDtmf() { + if (mClosed) { + return; + } + + try { + miSession.stopDtmf(); + } catch (RemoteException e) { + } + } + + /** + * Sends an USSD message. + * + * @param ussdMessage USSD message to send + */ + public void sendUssd(String ussdMessage) { + if (mClosed) { + return; + } + + try { + miSession.sendUssd(ussdMessage); + } catch (RemoteException e) { + } + } + + /** + * Determines if the session is multiparty. + * + * @return {@code True} if the session is multiparty. + */ + public boolean isMultiparty() { + if (mClosed) { + return false; + } + + try { + return miSession.isMultiparty(); + } catch (RemoteException e) { + return false; + } + } + + /** + * A listener type for receiving notification on IMS call session events. + * When an event is generated for an {@link IImsCallSession}, + * the application is notified by having one of the methods called on + * the {@link IImsCallSessionListener}. + */ + private class IImsCallSessionListenerProxy extends ImsCallSessionListenerImplBase { + /** + * Notifies the result of the basic session operation (setup / terminate). + */ + @Override + public void callSessionProgressing(IImsCallSession session, + ImsStreamMediaProfile profile) { + if (mListener != null) { + mListener.callSessionProgressing(ImsCallSession.this, profile); + } + } + + @Override + public void callSessionStarted(IImsCallSession session, + ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionStarted(ImsCallSession.this, profile); + } + } + + @Override + public void callSessionStartFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionStartFailed(ImsCallSession.this, reasonInfo); + } + } + + @Override + public void callSessionTerminated(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionTerminated(ImsCallSession.this, reasonInfo); + } + } + + /** + * Notifies the result of the call hold/resume operation. + */ + @Override + public void callSessionHeld(IImsCallSession session, + ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionHeld(ImsCallSession.this, profile); + } + } + + @Override + public void callSessionHoldFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionHoldFailed(ImsCallSession.this, reasonInfo); + } + } + + @Override + public void callSessionHoldReceived(IImsCallSession session, + ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionHoldReceived(ImsCallSession.this, profile); + } + } + + @Override + public void callSessionResumed(IImsCallSession session, + ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionResumed(ImsCallSession.this, profile); + } + } + + @Override + public void callSessionResumeFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionResumeFailed(ImsCallSession.this, reasonInfo); + } + } + + @Override + public void callSessionResumeReceived(IImsCallSession session, + ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionResumeReceived(ImsCallSession.this, profile); + } + } + + /** + * Notifies the start of a call merge operation. + * + * @param session The call session. + * @param newSession The merged call session. + * @param profile The call profile. + */ + @Override + public void callSessionMergeStarted(IImsCallSession session, + IImsCallSession newSession, ImsCallProfile profile) { + // This callback can be used for future use to add additional + // functionality that may be needed between conference start and complete + Log.d(TAG, "callSessionMergeStarted"); + } + + /** + * Notifies the successful completion of a call merge operation. + * + * @param newSession The call session. + */ + @Override + public void callSessionMergeComplete(IImsCallSession newSession) { + if (mListener != null) { + if (newSession != null) { + // Check if the active session is the same session that was + // active before the merge request was sent. + ImsCallSession validActiveSession = ImsCallSession.this; + try { + if (!Objects.equals(miSession.getCallId(), newSession.getCallId())) { + // New session created after conference + validActiveSession = new ImsCallSession(newSession); + } + } catch (RemoteException rex) { + Log.e(TAG, "callSessionMergeComplete: exception for getCallId!"); + } + mListener.callSessionMergeComplete(validActiveSession); + } else { + // Session already exists. Hence no need to pass + mListener.callSessionMergeComplete(null); + } + } + } + + /** + * Notifies of a failure to perform a call merge operation. + * + * @param session The call session. + * @param reasonInfo The merge failure reason. + */ + @Override + public void callSessionMergeFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionMergeFailed(ImsCallSession.this, reasonInfo); + } + } + + /** + * Notifies the result of call upgrade / downgrade or any other call updates. + */ + @Override + public void callSessionUpdated(IImsCallSession session, + ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionUpdated(ImsCallSession.this, profile); + } + } + + @Override + public void callSessionUpdateFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionUpdateFailed(ImsCallSession.this, reasonInfo); + } + } + + @Override + public void callSessionUpdateReceived(IImsCallSession session, + ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionUpdateReceived(ImsCallSession.this, profile); + } + } + + /** + * Notifies the result of conference extension. + */ + @Override + public void callSessionConferenceExtended(IImsCallSession session, + IImsCallSession newSession, ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionConferenceExtended(ImsCallSession.this, + new ImsCallSession(newSession), profile); + } + } + + @Override + public void callSessionConferenceExtendFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionConferenceExtendFailed(ImsCallSession.this, reasonInfo); + } + } + + @Override + public void callSessionConferenceExtendReceived(IImsCallSession session, + IImsCallSession newSession, ImsCallProfile profile) { + if (mListener != null) { + mListener.callSessionConferenceExtendReceived(ImsCallSession.this, + new ImsCallSession(newSession), profile); + } + } + + /** + * Notifies the result of the participant invitation / removal to/from + * the conference session. + */ + @Override + public void callSessionInviteParticipantsRequestDelivered(IImsCallSession session) { + if (mListener != null) { + mListener.callSessionInviteParticipantsRequestDelivered(ImsCallSession.this); + } + } + + @Override + public void callSessionInviteParticipantsRequestFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionInviteParticipantsRequestFailed(ImsCallSession.this, + reasonInfo); + } + } + + @Override + public void callSessionRemoveParticipantsRequestDelivered(IImsCallSession session) { + if (mListener != null) { + mListener.callSessionRemoveParticipantsRequestDelivered(ImsCallSession.this); + } + } + + @Override + public void callSessionRemoveParticipantsRequestFailed(IImsCallSession session, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionRemoveParticipantsRequestFailed(ImsCallSession.this, + reasonInfo); + } + } + + /** + * Notifies the changes of the conference info. in the conference session. + */ + @Override + public void callSessionConferenceStateUpdated(IImsCallSession session, + ImsConferenceState state) { + if (mListener != null) { + mListener.callSessionConferenceStateUpdated(ImsCallSession.this, state); + } + } + + /** + * Notifies the incoming USSD message. + */ + @Override + public void callSessionUssdMessageReceived(IImsCallSession session, + int mode, String ussdMessage) { + if (mListener != null) { + mListener.callSessionUssdMessageReceived(ImsCallSession.this, mode, ussdMessage); + } + } + + /** + * Notifies of handover information for this call + */ + @Override + public void callSessionHandover(IImsCallSession session, + int srcAccessTech, int targetAccessTech, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionHandover(ImsCallSession.this, srcAccessTech, + targetAccessTech, reasonInfo); + } + } + + /** + * Notifies of handover failure info for this call + */ + @Override + public void callSessionHandoverFailed(IImsCallSession session, + int srcAccessTech, int targetAccessTech, + ImsReasonInfo reasonInfo) { + if (mListener != null) { + mListener.callSessionHandoverFailed(ImsCallSession.this, srcAccessTech, + targetAccessTech, reasonInfo); + } + } + + /** + * Notifies the TTY mode received from remote party. + */ + @Override + public void callSessionTtyModeReceived(IImsCallSession session, + int mode) { + if (mListener != null) { + mListener.callSessionTtyModeReceived(ImsCallSession.this, mode); + } + } + + /** + * Notifies of a change to the multiparty state for this {@code ImsCallSession}. + * + * @param session The call session. + * @param isMultiParty {@code true} if the session became multiparty, {@code false} + * otherwise. + */ + public void callSessionMultipartyStateChanged(IImsCallSession session, + boolean isMultiParty) { + + if (mListener != null) { + mListener.callSessionMultipartyStateChanged(ImsCallSession.this, isMultiParty); + } + } + + @Override + public void callSessionSuppServiceReceived(IImsCallSession session, + ImsSuppServiceNotification suppServiceInfo ) { + if (mListener != null) { + mListener.callSessionSuppServiceReceived(ImsCallSession.this, suppServiceInfo); + } + } + + } + + /** + * Provides a string representation of the {@link ImsCallSession}. Primarily intended for + * use in log statements. + * + * @return String representation of session. + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("[ImsCallSession objId:"); + sb.append(System.identityHashCode(this)); + sb.append(" state:"); + sb.append(State.toString(getState())); + sb.append(" callId:"); + sb.append(getCallId()); + sb.append("]"); + return sb.toString(); + } +} diff --git a/telephony/java/com/android/ims/internal/ImsVideoCallProvider.java b/telephony/java/com/android/ims/internal/ImsVideoCallProvider.java new file mode 100644 index 0000000000000..432dc39057379 --- /dev/null +++ b/telephony/java/com/android/ims/internal/ImsVideoCallProvider.java @@ -0,0 +1,294 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.ims.internal; + +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.os.RemoteException; +import android.telecom.Connection; +import android.telecom.VideoProfile; +import android.telecom.VideoProfile.CameraCapabilities; +import android.view.Surface; + +import com.android.internal.os.SomeArgs; + +/** + * @hide + */ +public abstract class ImsVideoCallProvider { + private static final int MSG_SET_CALLBACK = 1; + private static final int MSG_SET_CAMERA = 2; + private static final int MSG_SET_PREVIEW_SURFACE = 3; + private static final int MSG_SET_DISPLAY_SURFACE = 4; + private static final int MSG_SET_DEVICE_ORIENTATION = 5; + private static final int MSG_SET_ZOOM = 6; + private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7; + private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8; + private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9; + private static final int MSG_REQUEST_CALL_DATA_USAGE = 10; + private static final int MSG_SET_PAUSE_IMAGE = 11; + + private final ImsVideoCallProviderBinder mBinder; + + private IImsVideoCallCallback mCallback; + + /** + * Default handler used to consolidate binder method calls onto a single thread. + */ + private final Handler mProviderHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_SET_CALLBACK: + mCallback = (IImsVideoCallCallback) msg.obj; + break; + case MSG_SET_CAMERA: + { + SomeArgs args = (SomeArgs) msg.obj; + try { + onSetCamera((String) args.arg1); + onSetCamera((String) args.arg1, args.argi1); + } finally { + args.recycle(); + } + break; + } + case MSG_SET_PREVIEW_SURFACE: + onSetPreviewSurface((Surface) msg.obj); + break; + case MSG_SET_DISPLAY_SURFACE: + onSetDisplaySurface((Surface) msg.obj); + break; + case MSG_SET_DEVICE_ORIENTATION: + onSetDeviceOrientation(msg.arg1); + break; + case MSG_SET_ZOOM: + onSetZoom((Float) msg.obj); + break; + case MSG_SEND_SESSION_MODIFY_REQUEST: { + SomeArgs args = (SomeArgs) msg.obj; + try { + VideoProfile fromProfile = (VideoProfile) args.arg1; + VideoProfile toProfile = (VideoProfile) args.arg2; + + onSendSessionModifyRequest(fromProfile, toProfile); + } finally { + args.recycle(); + } + break; + } + case MSG_SEND_SESSION_MODIFY_RESPONSE: + onSendSessionModifyResponse((VideoProfile) msg.obj); + break; + case MSG_REQUEST_CAMERA_CAPABILITIES: + onRequestCameraCapabilities(); + break; + case MSG_REQUEST_CALL_DATA_USAGE: + onRequestCallDataUsage(); + break; + case MSG_SET_PAUSE_IMAGE: + onSetPauseImage((Uri) msg.obj); + break; + default: + break; + } + } + }; + + /** + * IImsVideoCallProvider stub implementation. + */ + private final class ImsVideoCallProviderBinder extends IImsVideoCallProvider.Stub { + public void setCallback(IImsVideoCallCallback callback) { + mProviderHandler.obtainMessage(MSG_SET_CALLBACK, callback).sendToTarget(); + } + + public void setCamera(String cameraId, int uid) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = cameraId; + args.argi1 = uid; + mProviderHandler.obtainMessage(MSG_SET_CAMERA, args).sendToTarget(); + } + + public void setPreviewSurface(Surface surface) { + mProviderHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget(); + } + + public void setDisplaySurface(Surface surface) { + mProviderHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget(); + } + + public void setDeviceOrientation(int rotation) { + mProviderHandler.obtainMessage(MSG_SET_DEVICE_ORIENTATION, rotation, 0).sendToTarget(); + } + + public void setZoom(float value) { + mProviderHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget(); + } + + public void sendSessionModifyRequest(VideoProfile fromProfile, VideoProfile toProfile) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = fromProfile; + args.arg2 = toProfile; + mProviderHandler.obtainMessage(MSG_SEND_SESSION_MODIFY_REQUEST, args).sendToTarget(); + } + + public void sendSessionModifyResponse(VideoProfile responseProfile) { + mProviderHandler.obtainMessage( + MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget(); + } + + public void requestCameraCapabilities() { + mProviderHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget(); + } + + public void requestCallDataUsage() { + mProviderHandler.obtainMessage(MSG_REQUEST_CALL_DATA_USAGE).sendToTarget(); + } + + public void setPauseImage(Uri uri) { + mProviderHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget(); + } + } + + public ImsVideoCallProvider() { + mBinder = new ImsVideoCallProviderBinder(); + } + + /** + * Returns binder object which can be used across IPC methods. + */ + public final IImsVideoCallProvider getInterface() { + return mBinder; + } + + /** @see Connection.VideoProvider#onSetCamera */ + public abstract void onSetCamera(String cameraId); + + /** + * Similar to {@link #onSetCamera(String)}, except includes the UID of the calling process which + * the IMS service uses when opening the camera. This ensures camera permissions are verified + * by the camera service. + * + * @param cameraId The id of the camera to be opened. + * @param uid The uid of the caller, used when opening the camera for permission verification. + * @see Connection.VideoProvider#onSetCamera + */ + public void onSetCamera(String cameraId, int uid) { + } + + /** @see Connection.VideoProvider#onSetPreviewSurface */ + public abstract void onSetPreviewSurface(Surface surface); + + /** @see Connection.VideoProvider#onSetDisplaySurface */ + public abstract void onSetDisplaySurface(Surface surface); + + /** @see Connection.VideoProvider#onSetDeviceOrientation */ + public abstract void onSetDeviceOrientation(int rotation); + + /** @see Connection.VideoProvider#onSetZoom */ + public abstract void onSetZoom(float value); + + /** @see Connection.VideoProvider#onSendSessionModifyRequest */ + public abstract void onSendSessionModifyRequest(VideoProfile fromProfile, + VideoProfile toProfile); + + /** @see Connection.VideoProvider#onSendSessionModifyResponse */ + public abstract void onSendSessionModifyResponse(VideoProfile responseProfile); + + /** @see Connection.VideoProvider#onRequestCameraCapabilities */ + public abstract void onRequestCameraCapabilities(); + + /** @see Connection.VideoProvider#onRequestCallDataUsage */ + public abstract void onRequestCallDataUsage(); + + /** @see Connection.VideoProvider#onSetPauseImage */ + public abstract void onSetPauseImage(Uri uri); + + /** @see Connection.VideoProvider#receiveSessionModifyRequest */ + public void receiveSessionModifyRequest(VideoProfile VideoProfile) { + if (mCallback != null) { + try { + mCallback.receiveSessionModifyRequest(VideoProfile); + } catch (RemoteException ignored) { + } + } + } + + /** @see Connection.VideoProvider#receiveSessionModifyResponse */ + public void receiveSessionModifyResponse( + int status, VideoProfile requestedProfile, VideoProfile responseProfile) { + if (mCallback != null) { + try { + mCallback.receiveSessionModifyResponse(status, requestedProfile, responseProfile); + } catch (RemoteException ignored) { + } + } + } + + /** @see Connection.VideoProvider#handleCallSessionEvent */ + public void handleCallSessionEvent(int event) { + if (mCallback != null) { + try { + mCallback.handleCallSessionEvent(event); + } catch (RemoteException ignored) { + } + } + } + + /** @see Connection.VideoProvider#changePeerDimensions */ + public void changePeerDimensions(int width, int height) { + if (mCallback != null) { + try { + mCallback.changePeerDimensions(width, height); + } catch (RemoteException ignored) { + } + } + } + + /** @see Connection.VideoProvider#changeCallDataUsage */ + public void changeCallDataUsage(long dataUsage) { + if (mCallback != null) { + try { + mCallback.changeCallDataUsage(dataUsage); + } catch (RemoteException ignored) { + } + } + } + + /** @see Connection.VideoProvider#changeCameraCapabilities */ + public void changeCameraCapabilities(CameraCapabilities CameraCapabilities) { + if (mCallback != null) { + try { + mCallback.changeCameraCapabilities(CameraCapabilities); + } catch (RemoteException ignored) { + } + } + } + + /** @see Connection.VideoProvider#changeVideoQuality */ + public void changeVideoQuality(int videoQuality) { + if (mCallback != null) { + try { + mCallback.changeVideoQuality(videoQuality); + } catch (RemoteException ignored) { + } + } + } +}