Merge changes from topic "ims_apis"

am: de65acb915

Change-Id: I717387907dde9f10fd61bbeb20e3533aeaeab220
This commit is contained in:
Brad Ebinger
2018-02-05 23:15:38 +00:00
committed by android-build-merger
9 changed files with 706 additions and 59 deletions

View File

@@ -4721,6 +4721,7 @@ package android.telephony.ims {
}
public final class ImsSuppServiceNotification implements android.os.Parcelable {
ctor public ImsSuppServiceNotification(int, int, int, int, java.lang.String, java.lang.String[]);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSuppServiceNotification> CREATOR;
@@ -4788,7 +4789,6 @@ package android.telephony.ims.feature {
public abstract class ImsFeature {
ctor public ImsFeature();
method public abstract void changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
method public final int getFeatureState();
method public abstract void onFeatureReady();
method public abstract void onFeatureRemoved();
method public final void setFeatureState(int);
@@ -4817,10 +4817,12 @@ package android.telephony.ims.feature {
method public android.telephony.ims.stub.ImsUtImplBase getUt();
method public final void notifyCapabilitiesStatusChanged(android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
method public final void notifyIncomingCall(android.telephony.ims.stub.ImsCallSessionImplBase, android.os.Bundle);
method public final void notifyVoiceMessageCountUpdate(int);
method public void onFeatureReady();
method public void onFeatureRemoved();
method public boolean queryCapabilityConfiguration(int, int);
method public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus();
method public void setUiTtyMode(int, android.os.Message);
method public int shouldProcessCall(java.lang.String[]);
field public static final int PROCESS_CALL_CSFB = 1; // 0x1
field public static final int PROCESS_CALL_EMERGENCY_CSFB = 2; // 0x2

View File

@@ -421,13 +421,13 @@ public final class ImsReasonInfo implements Parcelable {
// For main reason code
/** @hide */
public final int mCode;
public int mCode;
// For the extra code value; it depends on the code value.
/** @hide */
public final int mExtraCode;
public int mExtraCode;
// For the additional message of the reason info.
/** @hide */
public final String mExtraMessage;
public String mExtraMessage;
/** @hide */
public ImsReasonInfo() {

View File

@@ -46,6 +46,17 @@ public final class ImsSuppServiceNotification implements Parcelable {
/** List of forwarded numbers, if any */
public final String[] history;
public ImsSuppServiceNotification(int notificationType, int code, int index, int type,
String number, String[] history) {
this.notificationType = notificationType;
this.code = code;
this.index = index;
this.type = type;
this.number = number;
this.history = history;
}
/** @hide */
public ImsSuppServiceNotification(Parcel in) {
notificationType = in.readInt();

View File

@@ -22,6 +22,7 @@ import android.os.RemoteException;
import android.telephony.ims.ImsCallProfile;
import com.android.ims.internal.IImsCallSession;
import com.android.ims.internal.IImsCallSessionListener;
import com.android.ims.internal.IImsConfig;
import com.android.ims.internal.IImsEcbm;
import com.android.ims.internal.IImsMMTelFeature;
@@ -29,6 +30,10 @@ import com.android.ims.internal.IImsMultiEndpoint;
import com.android.ims.internal.IImsRegistrationListener;
import com.android.ims.internal.IImsUt;
import android.telephony.ims.ImsCallSession;
import android.telephony.ims.compat.stub.ImsCallSessionImplBase;
import android.telephony.ims.stub.ImsEcbmImplBase;
import android.telephony.ims.stub.ImsMultiEndpointImplBase;
import android.telephony.ims.stub.ImsUtImplBase;
/**
* Base implementation for MMTel.
@@ -110,7 +115,7 @@ public class MMTelFeature extends ImsFeature {
public IImsCallSession createCallSession(int sessionId, ImsCallProfile profile)
throws RemoteException {
synchronized (mLock) {
return MMTelFeature.this.createCallSession(sessionId, profile);
return MMTelFeature.this.createCallSession(sessionId, profile, null);
}
}
@@ -125,7 +130,8 @@ public class MMTelFeature extends ImsFeature {
@Override
public IImsUt getUtInterface() throws RemoteException {
synchronized (mLock) {
return MMTelFeature.this.getUtInterface();
ImsUtImplBase implBase = MMTelFeature.this.getUtInterface();
return implBase != null ? implBase.getInterface() : null;
}
}
@@ -153,7 +159,8 @@ public class MMTelFeature extends ImsFeature {
@Override
public IImsEcbm getEcbmInterface() throws RemoteException {
synchronized (mLock) {
return MMTelFeature.this.getEcbmInterface();
ImsEcbmImplBase implBase = MMTelFeature.this.getEcbmInterface();
return implBase != null ? implBase.getImsEcbm() : null;
}
}
@@ -167,7 +174,8 @@ public class MMTelFeature extends ImsFeature {
@Override
public IImsMultiEndpoint getMultiEndpointInterface() throws RemoteException {
synchronized (mLock) {
return MMTelFeature.this.getMultiEndpointInterface();
ImsMultiEndpointImplBase implBase = MMTelFeature.this.getMultiEndpointInterface();
return implBase != null ? implBase.getIImsMultiEndpoint() : null;
}
}
};
@@ -281,7 +289,8 @@ public class MMTelFeature extends ImsFeature {
* @param sessionId a session id which is obtained from {@link #startSession}
* @param profile a call profile to make the call
*/
public IImsCallSession createCallSession(int sessionId, ImsCallProfile profile) {
public IImsCallSession createCallSession(int sessionId, ImsCallProfile profile,
IImsCallSessionListener listener) {
return null;
}
@@ -298,7 +307,7 @@ public class MMTelFeature extends ImsFeature {
/**
* @return The Ut interface for the supplementary service configuration.
*/
public IImsUt getUtInterface() {
public ImsUtImplBase getUtInterface() {
return null;
}
@@ -324,7 +333,7 @@ public class MMTelFeature extends ImsFeature {
/**
* @return The Emergency call-back mode interface for emergency VoLTE calls that support it.
*/
public IImsEcbm getEcbmInterface() {
public ImsEcbmImplBase getEcbmInterface() {
return null;
}
@@ -339,7 +348,7 @@ public class MMTelFeature extends ImsFeature {
/**
* @return MultiEndpoint interface for DEP notifications
*/
public IImsMultiEndpoint getMultiEndpointInterface() {
public ImsMultiEndpointImplBase getMultiEndpointInterface() {
return null;
}

View File

@@ -16,16 +16,18 @@
package android.telephony.ims.compat.stub;
import android.os.Message;
import android.os.RemoteException;
import android.telephony.ims.ImsCallSessionListener;
import android.telephony.ims.ImsCallProfile;
import android.telephony.ims.ImsConferenceState;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsStreamMediaProfile;
import android.telephony.ims.ImsSuppServiceNotification;
import android.telephony.ims.aidl.IImsCallSessionListener;
import com.android.ims.internal.IImsCallSession;
import com.android.ims.internal.IImsCallSessionListener;
import com.android.ims.internal.IImsVideoCallProvider;
import android.telephony.ims.ImsCallSession;
/**
@@ -37,10 +39,12 @@ import android.telephony.ims.ImsCallSession;
* @hide
*/
public class ImsCallSessionImplBase extends android.telephony.ims.stub.ImsCallSessionImplBase {
public class ImsCallSessionImplBase extends IImsCallSession.Stub {
@Override
public final void setListener(ImsCallSessionListener listener) {
// convert to old implementation of listener
public final void setListener(IImsCallSessionListener listener)
throws RemoteException {
setListener(new ImsCallSessionListenerConverter(listener));
}
@@ -51,21 +55,326 @@ public class ImsCallSessionImplBase extends android.telephony.ims.stub.ImsCallSe
*
* @param listener to listen to the session events of this object
*/
public void setListener(IImsCallSessionListener listener) {
public void setListener(com.android.ims.internal.IImsCallSessionListener listener) {
}
/**
* Closes the object. This {@link ImsCallSessionImplBase} is not usable after being closed.
*/
@Override
public void close() {
}
/**
* @return A String containing the unique call ID of this {@link ImsCallSessionImplBase}.
*/
@Override
public String getCallId() {
return null;
}
/**
* @return The {@link ImsCallProfile} that this {@link ImsCallSessionImplBase} is associated
* with.
*/
@Override
public ImsCallProfile getCallProfile() {
return null;
}
/**
* @return The local {@link ImsCallProfile} that this {@link ImsCallSessionImplBase} is
* associated with.
*/
@Override
public ImsCallProfile getLocalCallProfile() {
return null;
}
/**
* @return The remote {@link ImsCallProfile} that this {@link ImsCallSessionImplBase} is
* associated with.
*/
@Override
public ImsCallProfile getRemoteCallProfile() {
return null;
}
/**
* @param name The String extra key.
* @return The string extra value associated with the specified property.
*/
@Override
public String getProperty(String name) {
return null;
}
/**
* @return The {@link ImsCallSessionImplBase} state.
*/
@Override
public int getState() {
return -1;
}
/**
* @return true if the {@link ImsCallSessionImplBase} is in a call, false otherwise.
*/
@Override
public boolean isInCall() {
return false;
}
/**
* Mutes or unmutes the mic for the active call.
*
* @param muted true if the call should be muted, false otherwise.
*/
@Override
public void setMute(boolean muted) {
}
/**
* Initiates an IMS call with the specified number and call profile.
* The session listener set in {@link #setListener(IImsCallSessionListener)} is called back upon
* defined session events.
* 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) {
}
/**
* Initiates an IMS call with the specified participants and call profile.
* The session listener set in {@link #setListener(IImsCallSessionListener)} 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) {
}
/**
* 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) {
}
/**
* Rejects an incoming call or session update.
*
* @param reason reason code to reject an incoming call, defined in {@link ImsReasonInfo}.
* {@link ImsCallSession.Listener#callSessionStartFailed}
*/
@Override
public void reject(int reason) {
}
/**
* Terminates a call.
*
* @param reason reason code to terminate a call, defined in {@link ImsReasonInfo}.
*
* @see {@link ImsCallSession.Listener#callSessionTerminated}
*/
@Override
public void terminate(int reason) {
}
/**
* 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) {
}
/**
* 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) {
}
/**
* Merges the active and held 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() {
}
/**
* 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) {
}
/**
* 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) {
}
/**
* 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) {
}
/**
* 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) {
}
/**
* Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
* 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) {
}
/**
* Start a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
* 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) {
}
/**
* Stop a DTMF code.
*/
@Override
public void stopDtmf() {
}
/**
* Sends an USSD message.
*
* @param ussdMessage USSD message to send
*/
@Override
public void sendUssd(String ussdMessage) {
}
@Override
public IImsVideoCallProvider getVideoCallProvider() {
return null;
}
/**
* Determines if the current session is multiparty.
* @return {@code True} if the session is multiparty.
*/
@Override
public boolean isMultiparty() {
return false;
}
/**
* Device issues RTT modify request
* @param toProfile The profile with requested changes made
*/
@Override
public void sendRttModifyRequest(ImsCallProfile toProfile) {
}
/**
* Device responds to Remote RTT modify request
* @param status true if the the request was accepted or false of the request is defined.
*/
@Override
public void sendRttModifyResponse(boolean status) {
}
/**
* Device sends RTT message
* @param rttMessage RTT message to be sent
*/
@Override
public void sendRttMessage(String rttMessage) {
}
/**
* There are two different ImsCallSessionListeners that need to reconciled here, we need to
* convert the "old" version of the com.android.ims.internal.IImsCallSessionListener to the
* "new" version of the Listener android.telephony.ims.ImsCallSessionListener when calling
* back to the framework.
*/
private class ImsCallSessionListenerConverter extends IImsCallSessionListener.Stub {
private class ImsCallSessionListenerConverter
extends com.android.ims.internal.IImsCallSessionListener.Stub {
private final ImsCallSessionListener mNewListener;
private final IImsCallSessionListener mNewListener;
public ImsCallSessionListenerConverter(ImsCallSessionListener listener) {
public ImsCallSessionListenerConverter(IImsCallSessionListener listener) {
mNewListener = listener;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018 The Android Open Source Project
* 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.
@@ -16,15 +16,23 @@
package android.telephony.ims.compat.stub;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.util.Log;
import com.android.ims.ImsConfig;
import com.android.ims.ImsConfigListener;
import com.android.ims.internal.IImsConfig;
import com.android.internal.annotations.VisibleForTesting;
import java.lang.ref.WeakReference;
import java.util.HashMap;
/**
* Base implementation of ImsConfig, which implements stub versions of the methods
* in the IImsConfig AIDL. Override the methods that your implementation of ImsConfig supports.
* Base implementation of ImsConfig.
* 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.
@@ -34,10 +42,25 @@ import com.android.ims.internal.IImsConfig;
* 1) Items provisioned by the operator.
* 2) Items configured by user. Mainly service feature class.
*
* The inner class {@link ImsConfigStub} implements methods of IImsConfig AIDL interface.
* The IImsConfig AIDL interface is called by ImsConfig, which may exist in many other processes.
* ImsConfigImpl access to the configuration parameters may be arbitrarily slow, especially in
* during initialization, or times when a lot of configuration parameters are being set/get
* (such as during boot up or SIM card change). By providing a cache in ImsConfigStub, we can speed
* up access to these configuration parameters, so a query to the ImsConfigImpl does not have to be
* performed every time.
* @hide
*/
public class ImsConfigImplBase extends IImsConfig.Stub {
public class ImsConfigImplBase {
static final private String TAG = "ImsConfigImplBase";
ImsConfigStub mImsConfigStub;
public ImsConfigImplBase(Context context) {
mImsConfigStub = new ImsConfigStub(this, context);
}
/**
* Gets the value for ims service/capabilities parameters from the provisioned
@@ -46,7 +69,6 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
* @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;
}
@@ -58,7 +80,6 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
* @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;
}
@@ -72,7 +93,6 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
* @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;
}
@@ -86,7 +106,6 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
* @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;
}
@@ -100,7 +119,6 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
* @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 {
}
@@ -115,7 +133,6 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
* @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 {
}
@@ -124,7 +141,6 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
* 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;
}
@@ -134,7 +150,6 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
*
* @param listener Video quality value returned asynchronously through listener.
*/
@Override
public void getVideoQuality(ImsConfigListener listener) throws RemoteException {
}
@@ -144,7 +159,233 @@ public class ImsConfigImplBase extends IImsConfig.Stub {
* @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 {
}
}
public IImsConfig getIImsConfig() { return mImsConfigStub; }
/**
* Updates provisioning value and notifies the framework of the change.
* Doesn't call #setProvisionedValue and assumes the result succeeded.
* This should only be used by modem when they implicitly changed provisioned values.
*
* @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
* @param value in Integer format.
*/
public final void notifyProvisionedValueChanged(int item, int value) {
mImsConfigStub.updateCachedValue(item, value, true);
}
/**
* Updates provisioning value and notifies the framework of the change.
* Doesn't call #setProvisionedValue and assumes the result succeeded.
* This should only be used by modem when they implicitly changed provisioned values.
*
* @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
* @param value in String format.
*/
public final void notifyProvisionedValueChanged(int item, String value) {
mImsConfigStub.updateCachedValue(item, value, true);
}
/**
* Implements the IImsConfig AIDL interface, which is called by potentially many processes
* in order to get/set configuration parameters.
*
* It holds an object of ImsConfigImplBase class which is usually extended by ImsConfigImpl
* with actual implementations from vendors. This class caches provisioned values from
* ImsConfigImpl layer because queries through ImsConfigImpl can be slow. When query goes in,
* it first checks cache layer. If missed, it will call the vendor implementation of
* ImsConfigImplBase API.
* and cache the return value if the set succeeds.
*
* 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
*/
@VisibleForTesting
static public class ImsConfigStub extends IImsConfig.Stub {
Context mContext;
WeakReference<ImsConfigImplBase> mImsConfigImplBaseWeakReference;
private HashMap<Integer, Integer> mProvisionedIntValue = new HashMap<>();
private HashMap<Integer, String> mProvisionedStringValue = new HashMap<>();
@VisibleForTesting
public ImsConfigStub(ImsConfigImplBase imsConfigImplBase, Context context) {
mContext = context;
mImsConfigImplBaseWeakReference =
new WeakReference<ImsConfigImplBase>(imsConfigImplBase);
}
/**
* Gets the value for ims service/capabilities parameters. It first checks its local cache,
* if missed, it will call ImsConfigImplBase.getProvisionedValue.
* Synchronous blocking call.
*
* @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
* @return value in Integer format.
*/
@Override
public synchronized int getProvisionedValue(int item) throws RemoteException {
if (mProvisionedIntValue.containsKey(item)) {
return mProvisionedIntValue.get(item);
} else {
int retVal = getImsConfigImpl().getProvisionedValue(item);
if (retVal != ImsConfig.OperationStatusConstants.UNKNOWN) {
updateCachedValue(item, retVal, false);
}
return retVal;
}
}
/**
* Gets the value for ims service/capabilities parameters. It first checks its local cache,
* if missed, it will call #ImsConfigImplBase.getProvisionedValue.
* Synchronous blocking call.
*
* @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
* @return value in String format.
*/
@Override
public synchronized String getProvisionedStringValue(int item) throws RemoteException {
if (mProvisionedIntValue.containsKey(item)) {
return mProvisionedStringValue.get(item);
} else {
String retVal = getImsConfigImpl().getProvisionedStringValue(item);
if (retVal != null) {
updateCachedValue(item, retVal, false);
}
return retVal;
}
}
/**
* 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, and write it into local cache.
* 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 synchronized int setProvisionedValue(int item, int value) throws RemoteException {
mProvisionedIntValue.remove(item);
int retVal = getImsConfigImpl().setProvisionedValue(item, value);
if (retVal == ImsConfig.OperationStatusConstants.SUCCESS) {
updateCachedValue(item, value, true);
} else {
Log.d(TAG, "Set provision value of " + item +
" to " + value + " failed with error code " + retVal);
}
return retVal;
}
/**
* 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, and write it into local cache.
* 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 synchronized int setProvisionedStringValue(int item, String value)
throws RemoteException {
mProvisionedStringValue.remove(item);
int retVal = getImsConfigImpl().setProvisionedStringValue(item, value);
if (retVal == ImsConfig.OperationStatusConstants.SUCCESS) {
updateCachedValue(item, value, true);
}
return retVal;
}
/**
* Wrapper function to call ImsConfigImplBase.getFeatureValue.
*/
@Override
public void getFeatureValue(int feature, int network, ImsConfigListener listener)
throws RemoteException {
getImsConfigImpl().getFeatureValue(feature, network, listener);
}
/**
* Wrapper function to call ImsConfigImplBase.setFeatureValue.
*/
@Override
public void setFeatureValue(int feature, int network, int value, ImsConfigListener listener)
throws RemoteException {
getImsConfigImpl().setFeatureValue(feature, network, value, listener);
}
/**
* Wrapper function to call ImsConfigImplBase.getVolteProvisioned.
*/
@Override
public boolean getVolteProvisioned() throws RemoteException {
return getImsConfigImpl().getVolteProvisioned();
}
/**
* Wrapper function to call ImsConfigImplBase.getVideoQuality.
*/
@Override
public void getVideoQuality(ImsConfigListener listener) throws RemoteException {
getImsConfigImpl().getVideoQuality(listener);
}
/**
* Wrapper function to call ImsConfigImplBase.setVideoQuality.
*/
@Override
public void setVideoQuality(int quality, ImsConfigListener listener)
throws RemoteException {
getImsConfigImpl().setVideoQuality(quality, listener);
}
private ImsConfigImplBase getImsConfigImpl() throws RemoteException {
ImsConfigImplBase ref = mImsConfigImplBaseWeakReference.get();
if (ref == null) {
throw new RemoteException("Fail to get ImsConfigImpl");
} else {
return ref;
}
}
private void sendImsConfigChangedIntent(int item, int value) {
sendImsConfigChangedIntent(item, Integer.toString(value));
}
private void sendImsConfigChangedIntent(int item, String value) {
Intent configChangedIntent = new Intent(ImsConfig.ACTION_IMS_CONFIG_CHANGED);
configChangedIntent.putExtra(ImsConfig.EXTRA_CHANGED_ITEM, item);
configChangedIntent.putExtra(ImsConfig.EXTRA_NEW_VALUE, value);
if (mContext != null) {
mContext.sendBroadcast(configChangedIntent);
}
}
protected synchronized void updateCachedValue(int item, int value, boolean notifyChange) {
mProvisionedIntValue.put(item, value);
if (notifyChange) {
sendImsConfigChangedIntent(item, value);
}
}
protected synchronized void updateCachedValue(
int item, String value, boolean notifyChange) {
mProvisionedStringValue.put(item, value);
if (notifyChange) {
sendImsConfigChangedIntent(item, value);
}
}
}
}

View File

@@ -363,8 +363,9 @@ public abstract class ImsFeature {
/**
* @return The current state of the feature, defined as {@link #STATE_UNAVAILABLE},
* {@link #STATE_INITIALIZING}, or {@link #STATE_READY}.
* @hide
*/
public final int getFeatureState() {
public int getFeatureState() {
synchronized (mLock) {
return mState;
}
@@ -489,7 +490,7 @@ public abstract class ImsFeature {
*/
@VisibleForTesting
public final void requestChangeEnabledCapabilities(CapabilityChangeRequest request,
IImsCapabilityCallback c) throws RemoteException {
IImsCapabilityCallback c) {
if (request == null) {
throw new IllegalArgumentException(
"ImsFeature#requestChangeEnabledCapabilities called with invalid params.");

View File

@@ -70,7 +70,11 @@ public class MmTelFeature extends ImsFeature {
@Override
public int getFeatureState() throws RemoteException {
synchronized (mLock) {
return MmTelFeature.this.getFeatureState();
try {
return MmTelFeature.this.getFeatureState();
} catch (Exception e) {
throw new RemoteException(e.getMessage());
}
}
}
@@ -79,15 +83,18 @@ public class MmTelFeature extends ImsFeature {
public ImsCallProfile createCallProfile(int callSessionType, int callType)
throws RemoteException {
synchronized (mLock) {
return MmTelFeature.this.createCallProfile(callSessionType, callType);
try {
return MmTelFeature.this.createCallProfile(callSessionType, callType);
} catch (Exception e) {
throw new RemoteException(e.getMessage());
}
}
}
@Override
public IImsCallSession createCallSession(ImsCallProfile profile) throws RemoteException {
synchronized (mLock) {
ImsCallSessionImplBase s = MmTelFeature.this.createCallSession(profile);
return s != null ? s.getServiceImpl() : null;
return createCallSessionInterface(profile);
}
}
@@ -101,30 +108,32 @@ public class MmTelFeature extends ImsFeature {
@Override
public IImsUt getUtInterface() throws RemoteException {
synchronized (mLock) {
return MmTelFeature.this.getUt().getInterface();
return MmTelFeature.this.getUtInterface();
}
}
@Override
public IImsEcbm getEcbmInterface() throws RemoteException {
synchronized (mLock) {
ImsEcbmImplBase ecbm = MmTelFeature.this.getEcbm();
return ecbm != null ? ecbm.getImsEcbm() : null;
return MmTelFeature.this.getEcbmInterface();
}
}
@Override
public void setUiTtyMode(int uiTtyMode, Message onCompleteMessage) throws RemoteException {
synchronized (mLock) {
MmTelFeature.this.setUiTtyMode(uiTtyMode, onCompleteMessage);
try {
MmTelFeature.this.setUiTtyMode(uiTtyMode, onCompleteMessage);
} catch (Exception e) {
throw new RemoteException(e.getMessage());
}
}
}
@Override
public IImsMultiEndpoint getMultiEndpointInterface() throws RemoteException {
synchronized (mLock) {
ImsMultiEndpointImplBase multiEndPoint = MmTelFeature.this.getMultiEndpoint();
return multiEndPoint != null ? multiEndPoint.getIImsMultiEndpoint() : null;
return MmTelFeature.this.getMultiEndpointInterface();
}
}
@@ -317,18 +326,18 @@ public class MmTelFeature extends ImsFeature {
}
/**
* To be returned by {@link #shouldProcessCall(Uri[])} when the ImsService should process the
* To be returned by {@link #shouldProcessCall(String[])} when the ImsService should process the
* outgoing call as IMS.
*/
public static final int PROCESS_CALL_IMS = 0;
/**
* To be returned by {@link #shouldProcessCall(Uri[])} when the telephony framework should not
* process the outgoing NON_EMERGENCY call as IMS and should instead use circuit switch.
* To be returned by {@link #shouldProcessCall(String[])} when the telephony framework should
* not process the outgoing NON_EMERGENCY call as IMS and should instead use circuit switch.
*/
public static final int PROCESS_CALL_CSFB = 1;
/**
* To be returned by {@link #shouldProcessCall(Uri[])} when the telephony framework should not
* process the outgoing EMERGENCY call as IMS and should instead use circuit switch.
* To be returned by {@link #shouldProcessCall(String[])} when the telephony framework should
* not process the outgoing EMERGENCY call as IMS and should instead use circuit switch.
*/
public static final int PROCESS_CALL_EMERGENCY_CSFB = 2;
@@ -401,10 +410,7 @@ public class MmTelFeature extends ImsFeature {
/**
* Notify the framework of an incoming call.
* @param c The {@link ImsCallSessionImplBase} of the new incoming call.
*
* @throws RuntimeException if the connection to the framework is not available. If this
* happens, the call should be no longer considered active and should be cleaned up.
* */
*/
public final void notifyIncomingCall(ImsCallSessionImplBase c, Bundle extras) {
synchronized (mLock) {
if (mListener == null) {
@@ -418,6 +424,40 @@ public class MmTelFeature extends ImsFeature {
}
}
/**
*
* @hide
*/
public final void notifyIncomingCallSession(IImsCallSession c, Bundle extras) {
synchronized (mLock) {
if (mListener == null) {
throw new IllegalStateException("Session is not available.");
}
try {
mListener.onIncomingCall(c, extras);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
}
/**
* Notify the framework of a change in the Voice Message count.
* @link count the new Voice Message count.
*/
public final void notifyVoiceMessageCountUpdate(int count) {
synchronized (mLock) {
if (mListener == null) {
throw new IllegalStateException("Session is not available.");
}
try {
mListener.onVoiceMessageCountUpdate(count);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
}
/**
* Provides the MmTelFeature with the ability to return the framework Capability Configuration
* for a provided Capability. If the framework calls {@link #changeEnabledCapabilities} and
@@ -473,6 +513,15 @@ public class MmTelFeature extends ImsFeature {
return null;
}
/**
* @hide
*/
public IImsCallSession createCallSessionInterface(ImsCallProfile profile)
throws RemoteException {
ImsCallSessionImplBase s = MmTelFeature.this.createCallSession(profile);
return s != null ? s.getServiceImpl() : null;
}
/**
* Creates an {@link ImsCallSession} with the specified call profile.
* Use other methods, if applicable, instead of interacting with
@@ -489,7 +538,7 @@ public class MmTelFeature extends ImsFeature {
* Called by the framework to determine if the outgoing call, designated by the outgoing
* {@link Uri}s, should be processed as an IMS call or CSFB call.
* @param numbers An array of {@link String}s that will be used for placing the call. There can
* be multiple {@link Strings}s listed in the case when we want to place an outgoing
* be multiple {@link String}s listed in the case when we want to place an outgoing
* call as a conference.
* @return a {@link ProcessCallResult} to the framework, which will be used to determine if the
* call wil lbe placed over IMS or via CSFB.
@@ -498,6 +547,31 @@ public class MmTelFeature extends ImsFeature {
return PROCESS_CALL_IMS;
}
/**
*
* @hide
*/
protected IImsUt getUtInterface() throws RemoteException {
ImsUtImplBase utImpl = getUt();
return utImpl != null ? utImpl.getInterface() : null;
}
/**
* @hide
*/
protected IImsEcbm getEcbmInterface() throws RemoteException {
ImsEcbmImplBase ecbmImpl = getEcbm();
return ecbmImpl != null ? ecbmImpl.getImsEcbm() : null;
}
/**
* @hide
*/
public IImsMultiEndpoint getMultiEndpointInterface() throws RemoteException {
ImsMultiEndpointImplBase multiendpointImpl = getMultiEndpoint();
return multiendpointImpl != null ? multiendpointImpl.getIImsMultiEndpoint() : null;
}
/**
* @return The {@link ImsUtImplBase} Ut interface implementation for the supplementary service
* configuration.
@@ -534,7 +608,7 @@ public class MmTelFeature extends ImsFeature {
* {@link TelecomManager#TTY_MODE_VCO}
* @param onCompleteMessage A {@link Message} to be used when the mode has been set.
*/
void setUiTtyMode(int mode, Message onCompleteMessage) {
public void setUiTtyMode(int mode, Message onCompleteMessage) {
// Base Implementation - Should be overridden
}

View File

@@ -147,7 +147,7 @@ public class ImsConfigImplBase {
mProvisionedIntValue.remove(item);
int retVal = getImsConfigImpl().setConfig(item, value);
if (retVal == ImsConfig.OperationStatusConstants.SUCCESS) {
updateCachedValue(item, retVal, true);
updateCachedValue(item, value, true);
} else {
Log.d(TAG, "Set provision value of " + item +
" to " + value + " failed with error code " + retVal);
@@ -173,7 +173,7 @@ public class ImsConfigImplBase {
mProvisionedStringValue.remove(item);
int retVal = getImsConfigImpl().setConfig(item, value);
if (retVal == ImsConfig.OperationStatusConstants.SUCCESS) {
updateCachedValue(item, retVal, true);
updateCachedValue(item, value, true);
}
return retVal;