Replace hard-coded configuration with resource configuration

Bug: 312404708
Test: atest CarrierConfigHelperTest
Change-Id: I09bb68319c33aa47b30a128c141f2e04372406ea
diff --git a/res/values/config.xml b/res/values/config.xml
index 939faa7..dcfa364 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -318,6 +318,13 @@
     <string-array name="thermal_mitigation_allowlisted_packages" translatable="false">
     </string-array>
 
+    <!-- Array of carriers that don't care about NGRAN's preference in the preferred emergency
+         network scan list after SIM is removed. -->
+    <integer-array name="config_carriers_ignore_ngran_preference_when_sim_removed">
+        <!-- 001-01 Test SIM -->
+        <item>1911</item>
+    </integer-array>
+
     <!-- Array of countries that active SIM is needed for emergency calls. Values should be
          ISO3166 country codes in lowercase. -->
     <string-array name="config_countries_require_sim_for_emergency" translatable="false">
diff --git a/src/com/android/services/telephony/domainselection/CarrierConfigHelper.java b/src/com/android/services/telephony/domainselection/CarrierConfigHelper.java
index 6ca2eeb..d39a6b7 100644
--- a/src/com/android/services/telephony/domainselection/CarrierConfigHelper.java
+++ b/src/com/android/services/telephony/domainselection/CarrierConfigHelper.java
@@ -23,6 +23,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
@@ -36,6 +37,12 @@
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.phone.R;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /** Helper class to cache carrier configurations. */
 public class CarrierConfigHelper extends Handler {
@@ -57,6 +64,8 @@
     // For test purpose only
     private final SharedPreferences mSharedPreferences;
 
+    private List<Integer> mIgnoreNrWhenSimRemoved = null;
+
     /**
      * Creates an instance.
      *
@@ -87,6 +96,7 @@
         mSharedPreferences = sharedPreferences;
 
         readFromSharedPreference();
+        readResourceConfiguration();
     }
 
     /**
@@ -154,8 +164,7 @@
                 break;
             }
         }
-        // Ignore configuration for TEST SIM.
-        if (carrierId == 1911) carrierConfig = false;
+        if (mIgnoreNrWhenSimRemoved.contains(carrierId)) carrierConfig = false;
 
         Boolean savedConfig = mVoNrSupported.get(Integer.valueOf(slotIndex));
         if (carrierConfig == savedConfig) {
@@ -174,6 +183,22 @@
                 + ", supported=" + carrierConfig);
     }
 
+    private void readResourceConfiguration() {
+        try {
+            mIgnoreNrWhenSimRemoved = Arrays.stream(mContext.getResources().getIntArray(
+                    R.array.config_carriers_ignore_ngran_preference_when_sim_removed))
+                    .boxed().collect(Collectors.toList());
+        } catch (Resources.NotFoundException nfe) {
+            Log.e(TAG, "readResourceConfiguration exception=" + nfe);
+        } catch (NullPointerException npe) {
+            Log.e(TAG, "readResourceConfiguration exception=" + npe);
+        }
+        if (mIgnoreNrWhenSimRemoved == null) {
+            mIgnoreNrWhenSimRemoved = new ArrayList<Integer>();
+        }
+        Log.i(TAG, "readResourceConfiguration ignoreNrWhenSimRemoved=" + mIgnoreNrWhenSimRemoved);
+    }
+
     /** Destroys the instance. */
     public void destroy() {
         if (DBG) Log.d(TAG, "destroy");
diff --git a/tests/src/com/android/services/telephony/domainselection/CarrierConfigHelperTest.java b/tests/src/com/android/services/telephony/domainselection/CarrierConfigHelperTest.java
index 1828067..5d4fe17 100644
--- a/tests/src/com/android/services/telephony/domainselection/CarrierConfigHelperTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/CarrierConfigHelperTest.java
@@ -32,9 +32,11 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.PersistableBundle;
@@ -64,10 +66,12 @@
     private static final int SLOT_0 = 0;
     private static final int SLOT_1 = 1;
     private static final int SUB_1 = 1;
+    private static final int TEST_SIM_CARRIER_ID = 1911;
 
     @Mock private Context mContext;
     @Mock private SharedPreferences mSharedPreferences;
     @Mock private SharedPreferences.Editor mEditor;
+    @Mock private Resources mResources;
 
     private HandlerThread mHandlerThread;
     private TestableLooper mLooper;
@@ -93,6 +97,11 @@
             public String getOpPackageName() {
                 return "";
             }
+
+            @Override
+            public Resources getResources() {
+                return mResources;
+            }
         };
 
         if (Looper.myLooper() == null) {
@@ -116,6 +125,8 @@
         doReturn(TelephonyManager.SIM_STATE_READY)
                 .when(mTelephonyManager).getSimState(anyInt());
 
+        doReturn(new int[] { TEST_SIM_CARRIER_ID }).when(mResources).getIntArray(anyInt());
+
         mCarrierConfigHelper = new CarrierConfigHelper(mContext, mHandlerThread.getLooper(),
                 mSharedPreferences);
     }
@@ -231,6 +242,28 @@
         assertTrue(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
     }
 
+    @Test
+    public void testCarrierIgnoreNrWhenSimRemoved() throws Exception {
+        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
+                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
+
+        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
+                callbackCaptor.capture());
+
+        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
+
+        assertNotNull(callback);
+
+        // NR is included and carrier config for TEST SIM is applied.
+        PersistableBundle b = getPersistableBundle(new int[] { EUTRAN, NGRAN }, true);
+        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
+        callback.onCarrierConfigChanged(SLOT_0, SUB_1, TEST_SIM_CARRIER_ID, 0);
+
+        // NR is ignored.
+        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
+        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_1));
+    }
+
     private static PersistableBundle getPersistableBundle(int[] imsRats, boolean applied) {
         PersistableBundle bundle  = new PersistableBundle();
         bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY, imsRats);