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) { + } + } + } +}