diff options
author | Brad Ebinger <breadley@google.com> | 2018-03-16 11:46:30 -0700 |
---|---|---|
committer | Brad Ebinger <breadley@google.com> | 2018-03-21 10:19:39 -0700 |
commit | 48632581b200abe7110593d413f7038bd146fce3 (patch) | |
tree | 5be1b0cb51288a82d47bad978a06fba1d2c94757 | |
parent | fe2b2222bb6ab7049a8c869972bd6012cfaf2a02 (diff) | |
download | ims-48632581b200abe7110593d413f7038bd146fce3.tar.gz |
Cache IImsRegistration and IImsConfig interfaces
We currently query the IImsRegistration and IImsConfig
interfaces instead of caching them in the MmTelFeatureConnection.
This can lead to unnecessary pressure on cleanup of
binder objects when accessing these interfaces through
IPC.
Test: Manual
Bug: 72644425
Merged-In: Iebbb0a5e6e6b6715f46901ecdf07a034d8c37910
Change-Id: I4f07dd159ca2c1ed8cd50cd9603c4ed577171a74
-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 276688c4..6b140d93 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); } } |