aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Ebinger <breadley@google.com>2018-03-21 20:37:40 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-03-21 20:37:40 +0000
commit94e56892df693c7ec6ca591f8c78dee60b01d3d3 (patch)
treee6c06907f80c70444263ad276e4a7f99300f1369
parent57f6a85c80fe022e3844d5d203839023149ea471 (diff)
parent48632581b200abe7110593d413f7038bd146fce3 (diff)
downloadims-94e56892df693c7ec6ca591f8c78dee60b01d3d3.tar.gz
Merge "Cache IImsRegistration and IImsConfig interfaces" into pi-dev
-rw-r--r--src/java/com/android/ims/MmTelFeatureConnection.java52
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);
}
}