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);