Removed the part that deletes the ImsManger object cache when changing the subid
Manage cache in connectionReady()/connectionUnavailable()
Bug: 353577279
Test: atest ImsStateCallbackControllerTest
Flag: com.android.internal.telephony.flags.avoid_deleting_ims_object_from_cache
Change-Id: I8ce60753a2139a4934b5a5333f4b335c9919bcb7
diff --git a/src/com/android/phone/ImsStateCallbackController.java b/src/com/android/phone/ImsStateCallbackController.java
index 019c1ca..2dca102 100644
--- a/src/com/android/phone/ImsStateCallbackController.java
+++ b/src/com/android/phone/ImsStateCallbackController.java
@@ -59,6 +59,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConfigurationManager;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.ims.ImsResolver;
import com.android.internal.telephony.util.HandlerExecutor;
import com.android.internal.util.IndentingPrintWriter;
@@ -159,6 +160,8 @@
private int mNumSlots;
+ private final FeatureFlags mFeatureFlags;
+
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -287,11 +290,13 @@
if (mSubId == subId) return;
logd(mLogPrefix + "setSubId changed subId=" + subId);
- // subId changed from valid to invalid
- if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- if (VDBG) logv(mLogPrefix + "setSubId remove ImsManager " + mSubId);
- // remove ImsManager reference associated with subId
- mSubIdToImsManagerCache.remove(mSubId);
+ if (!mFeatureFlags.avoidDeletingImsObjectFromCache()) {
+ // subId changed from valid to invalid
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ if (VDBG) logv(mLogPrefix + "setSubId remove ImsManager " + mSubId);
+ // remove ImsManager reference associated with subId
+ mSubIdToImsManagerCache.remove(mSubId);
+ }
}
mSubId = subId;
@@ -709,7 +714,8 @@
/**
* create an instance
*/
- public static ImsStateCallbackController make(PhoneGlobals app, int numSlots) {
+ public static ImsStateCallbackController make(PhoneGlobals app, int numSlots,
+ FeatureFlags featureFlags) {
synchronized (ImsStateCallbackController.class) {
if (sInstance == null) {
logd("ImsStateCallbackController created");
@@ -718,7 +724,7 @@
handlerThread.start();
sInstance = new ImsStateCallbackController(app, handlerThread.getLooper(), numSlots,
ImsManager::getConnector, RcsFeatureManager::getConnector,
- ImsResolver.getInstance());
+ ImsResolver.getInstance(), featureFlags);
}
}
return sInstance;
@@ -727,7 +733,7 @@
@VisibleForTesting
public ImsStateCallbackController(PhoneGlobals app, Looper looper, int numSlots,
MmTelFeatureConnectorFactory mmTelFactory, RcsFeatureConnectorFactory rcsFactory,
- ImsResolver imsResolver) {
+ ImsResolver imsResolver, FeatureFlags featureFlags) {
mApp = app;
mHandler = new MyHandler(looper);
mImsResolver = imsResolver;
@@ -735,6 +741,7 @@
mTelephonyRegistryManager = mApp.getSystemService(TelephonyRegistryManager.class);
mMmTelFeatureFactory = mmTelFactory;
mRcsFeatureFactory = rcsFactory;
+ mFeatureFlags = featureFlags;
updateFeatureControllerSize(numSlots);
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index d0d92c6..8d6dc07 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -638,7 +638,8 @@
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS)) {
mImsStateCallbackController =
- ImsStateCallbackController.make(this, PhoneFactory.getPhones().length);
+ ImsStateCallbackController.make(this, PhoneFactory.getPhones().length,
+ mFeatureFlags);
mTelephonyRcsService = new TelephonyRcsService(this,
PhoneFactory.getPhones().length, mFeatureFlags);
mTelephonyRcsService.initialize();
diff --git a/tests/src/com/android/phone/ImsStateCallbackControllerTest.java b/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
index c86502b..0e902a8 100644
--- a/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
+++ b/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
@@ -37,6 +37,7 @@
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -60,6 +61,7 @@
import com.android.internal.telephony.IImsStateCallback;
import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.ims.ImsResolver;
import org.junit.After;
@@ -121,6 +123,7 @@
@Mock private IImsStateCallback mCallback2;
@Mock private IImsStateCallback mCallback3;
@Mock private ImsResolver mImsResolver;
+ @Mock private FeatureFlags mFeatureFlags;
private Executor mExecutor = new Executor() {
@Override
@@ -908,6 +911,31 @@
assertNull(imsManager);
}
+ @Test
+ @SmallTest
+ public void testImsManagerInstanceWithInvalidSubId() throws Exception {
+ doReturn(true).when(mFeatureFlags).avoidDeletingImsObjectFromCache();
+
+ createController(1);
+
+ // MmTelConnection ready
+ mMmTelConnectorListenerSlot0.getValue()
+ .connectionReady(mMmTelFeatureManager, SLOT_0_SUB_ID);
+ processAllMessages();
+
+ // check ImsManager instance
+ ImsManager imsManager = mImsStateCallbackController.getImsManager(SLOT_0_SUB_ID);
+ assertNotNull(imsManager);
+
+ // SubId changed from SLOT_0_SUB_ID to INVALID_SUBSCRIPTION_ID
+ when(mPhoneSlot0.getSubId()).thenReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ mImsStateCallbackController.onSubChanged();
+
+ // ImsStateCallbackController should keep the ImsManager instance for SLOT_0_SUB_ID
+ imsManager = mImsStateCallbackController.getImsManager(SLOT_0_SUB_ID);
+ assertNotNull(imsManager);
+ }
+
private void createController(int slotCount) throws Exception {
if (Looper.myLooper() == null) {
Looper.prepare();
@@ -929,7 +957,8 @@
mImsStateCallbackController =
new ImsStateCallbackController(mPhone, mHandlerThread.getLooper(),
- slotCount, mMmTelFeatureFactory, mRcsFeatureFactory, mImsResolver);
+ slotCount, mMmTelFeatureFactory, mRcsFeatureFactory, mImsResolver,
+ mFeatureFlags);
replaceInstance(ImsStateCallbackController.class,
"mPhoneFactoryProxy", mImsStateCallbackController, mPhoneFactoryProxy);