diff options
author | Brad Ebinger <breadley@google.com> | 2018-03-21 20:37:40 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-03-21 20:37:40 +0000 |
commit | 94e56892df693c7ec6ca591f8c78dee60b01d3d3 (patch) | |
tree | e6c06907f80c70444263ad276e4a7f99300f1369 | |
parent | 57f6a85c80fe022e3844d5d203839023149ea471 (diff) | |
parent | 48632581b200abe7110593d413f7038bd146fce3 (diff) | |
download | ims-94e56892df693c7ec6ca591f8c78dee60b01d3d3.tar.gz |
Merge "Cache IImsRegistration and IImsConfig interfaces" into pi-dev
-rw-r--r-- | src/java/com/android/ims/MmTelFeatureConnection.java | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/src/java/com/android/ims/MmTelFeatureConnection.java b/src/java/com/android/ims/MmTelFeatureConnection.java index 5679591b..de8f9282 100644 --- a/src/java/com/android/ims/MmTelFeatureConnection.java +++ b/src/java/com/android/ims/MmTelFeatureConnection.java @@ -68,7 +68,10 @@ public class MmTelFeatureConnection { // Updated by IImsServiceFeatureCallback when FEATURE_EMERGENCY_MMTEL is sent. private boolean mSupportsEmergencyCalling = false; - private MmTelFeature.Listener mMmTelFeatureListener; + // Cache the Registration and Config interfaces as long as the MmTel feature is connected. If + // it becomes disconnected, invalidate. + private IImsRegistration mRegistrationBinder; + private IImsConfig mConfigBinder; private abstract class CallbackAdapterManager<T> { private static final String TAG = "CallbackAdapterManager"; @@ -333,6 +336,7 @@ public class MmTelFeatureConnection { if (mIsAvailable) { Log.i(TAG, "MmTel disabled on slotId: " + slotId); mIsAvailable = false; + mmTelFeatureRemoved(); if (mStatusCallback != null) { mStatusCallback.notifyUnavailable(); } @@ -368,14 +372,53 @@ public class MmTelFeatureConnection { mContext = context; } + // Called when the MmTelFeatureConnection has received an unavailable notification. + private void mmTelFeatureRemoved() { + synchronized (mLock) { + // invalidate caches. + mRegistrationBinder = null; + mConfigBinder = null; + } + } + private @Nullable IImsRegistration getRegistration() { + synchronized (mLock) { + // null if cache is invalid; + if (mRegistrationBinder != null) { + return mRegistrationBinder; + } + } TelephonyManager tm = getTelephonyManager(mContext); - return tm != null ? tm.getImsRegistration(mSlotId, ImsFeature.FEATURE_MMTEL) : null; + // We don't want to synchronize on a binder call to another process. + IImsRegistration regBinder = tm != null + ? tm.getImsRegistration(mSlotId, ImsFeature.FEATURE_MMTEL) : null; + synchronized (mLock) { + // mRegistrationBinder may have changed while we tried to get the registration + // interface. + if (mRegistrationBinder == null) { + mRegistrationBinder = regBinder; + } + } + return mRegistrationBinder; } private IImsConfig getConfig() { + synchronized (mLock) { + // null if cache is invalid; + if (mConfigBinder != null) { + return mConfigBinder; + } + } TelephonyManager tm = getTelephonyManager(mContext); - return tm != null ? tm.getImsConfig(mSlotId, ImsFeature.FEATURE_MMTEL) : null; + IImsConfig configBinder = tm != null + ? tm.getImsConfig(mSlotId, ImsFeature.FEATURE_MMTEL) : null; + synchronized (mLock) { + // mConfigBinder may have changed while we tried to get the config interface. + if (mConfigBinder == null) { + mConfigBinder = configBinder; + } + } + return mConfigBinder; } public boolean isEmergencyMmTelAvailable() { @@ -400,8 +443,7 @@ public class MmTelFeatureConnection { public void openConnection(MmTelFeature.Listener listener) throws RemoteException { synchronized (mLock) { checkServiceIsReady(); - mMmTelFeatureListener = listener; - getServiceInterface(mBinder).setListener(mMmTelFeatureListener); + getServiceInterface(mBinder).setListener(listener); } } |