ImsProvisioningController returns provisioned when provisoning has not completed

Add code that access deprecated carrier config key when new define key
is not exist. This functionality comes from ImsManager

Bug: 230794289
Test: atest ImsProvisioningControllerTest, ImsServiceTest
Test: manual with TMO, ATT SIM
1. add carrier config carrier_volte_provisioning_required_bool as true
2. device reboot
3. check IMS registration and imsprovisioningstatus_X.xml file is created by ImsProvisioningLoader

Change-Id: Ifbcecf259f5dd1ecdf01b7ae76161f1a38566474
diff --git a/src/com/android/phone/ImsProvisioningController.java b/src/com/android/phone/ImsProvisioningController.java
index 54fc547..7a6c3e0 100644
--- a/src/com/android/phone/ImsProvisioningController.java
+++ b/src/com/android/phone/ImsProvisioningController.java
@@ -889,8 +889,27 @@
             throw new IllegalArgumentException("Registration technology '" + tech + "' is invalid");
         }
 
+        // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
         boolean retVal = isProvisioningRequired(subId, capability, tech, /*isMmTel*/true);
 
+        // if that returns false, check deprecated carrier config
+        // KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL
+        if (!retVal && (capability == CAPABILITY_TYPE_VOICE
+                || capability == CAPABILITY_TYPE_VIDEO
+                || capability == CAPABILITY_TYPE_UT)) {
+            String key = CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL;
+            if (capability == CAPABILITY_TYPE_UT) {
+                key = CarrierConfigManager.KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL;
+            }
+
+            PersistableBundle imsCarrierConfigs = mCarrierConfigManager.getConfigForSubId(subId);
+            if (imsCarrierConfigs != null) {
+                retVal = imsCarrierConfigs.getBoolean(key);
+            } else {
+                retVal = CarrierConfigManager.getDefaultConfig().getBoolean(key);
+            }
+        }
+
         log("isImsProvisioningRequiredForCapability capability " + capability
                 + " tech " + tech + " return value " + retVal);
 
@@ -920,8 +939,22 @@
             throw new IllegalArgumentException("Registration technology '" + tech + "' is invalid");
         }
 
+        // check new carrier config first KEY_RCS_REQUIRES_PROVISIONING_BUNDLE
         boolean retVal = isProvisioningRequired(subId, capability, tech, /*isMmTel*/false);
 
+        // if that returns false, check deprecated carrier config
+        // KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL
+        if (!retVal) {
+            PersistableBundle imsCarrierConfigs = mCarrierConfigManager.getConfigForSubId(subId);
+            if (imsCarrierConfigs != null) {
+                retVal = imsCarrierConfigs.getBoolean(
+                        CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL);
+            } else {
+                retVal = CarrierConfigManager.getDefaultConfig().getBoolean(
+                        CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL);
+            }
+        }
+
         log("isRcsProvisioningRequiredForCapability capability " + capability
                 + " tech " + tech + " return value " + retVal);
 
@@ -1212,8 +1245,7 @@
         return false;
     }
 
-    @VisibleForTesting
-    protected int[] getTechsFromCarrierConfig(int subId, int capability, boolean isMmTel) {
+    private int[] getTechsFromCarrierConfig(int subId, int capability, boolean isMmTel) {
         String featureKey;
         String capabilityKey;
         if (isMmTel) {
diff --git a/tests/src/com/android/phone/ImsProvisioningControllerTest.java b/tests/src/com/android/phone/ImsProvisioningControllerTest.java
index 6494df4..49ce6b5 100644
--- a/tests/src/com/android/phone/ImsProvisioningControllerTest.java
+++ b/tests/src/com/android/phone/ImsProvisioningControllerTest.java
@@ -16,7 +16,6 @@
 
 package com.android.phone;
 
-import static android.telephony.ims.ImsRcsManager.CAPABILITY_TYPE_OPTIONS_UCE;
 import static android.telephony.ims.ImsRcsManager.CAPABILITY_TYPE_PRESENCE_UCE;
 import static android.telephony.ims.ProvisioningManager.KEY_EAB_PROVISIONING_STATUS;
 import static android.telephony.ims.ProvisioningManager.KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE;
@@ -70,7 +69,6 @@
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.TestableLooper;
 import android.util.Log;
-import android.util.SparseArray;
 
 import com.android.ims.FeatureConnector;
 import com.android.ims.ImsConfig;
@@ -178,9 +176,6 @@
     int mSubId0 = 1234;
     int mSubId1 = 5678;
 
-    SparseArray<int[]> mMmTelTechMap = new SparseArray<>();
-    SparseArray<int[]> mRcsTechMap = new SparseArray<>();
-
     int[][] mMmTelProvisioningStorage;
     int[][] mRcsProvisioningStorage;
     int[][] mImsConfigStorage;
@@ -210,14 +205,6 @@
             return mImsConfig;
         }
 
-        protected int[] getTechsFromCarrierConfig(int subId, int capability, boolean isMmtel) {
-            if (isMmtel) {
-                return mMmTelTechMap.get(capability);
-            } else {
-                return mRcsTechMap.get(capability);
-            }
-        }
-
         protected boolean isValidSubId(int subId) {
             return mIsValidSubId;
         }
@@ -328,6 +315,14 @@
     public void connectionReady_MmTelFeatureListener() throws Exception {
         createImsProvisioningController();
 
+        // provisioning required capability
+        // voice, all tech
+        // video, all tech
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
+
         try {
             mTestImsProvisioningController.addFeatureProvisioningChangedCallback(
                     mSubId0, mIFeatureProvisioningCallback0);
@@ -376,6 +371,10 @@
     public void connectionReady_RcsFeatureListener() throws Exception {
         createImsProvisioningController();
 
+        // provisioning required capability : PRESENCE, tech : all
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
+
         try {
             mTestImsProvisioningController.addFeatureProvisioningChangedCallback(
                     mSubId0, mIFeatureProvisioningCallback0);
@@ -440,22 +439,24 @@
         // voice, all tech
         // video, all tech
         // UT, all tech
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_UT,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_UT_INT_ARRAY,
+                RADIO_TECHS);
 
+        // provisioning required for each capability
         boolean[][] expectedRequired = new boolean[][] {
+                //voice - LTE, WLAN, CROSS-SIM, NR
                 {true, true, true, true},
+                //video - LTE, WLAN, CROSS-SIM, NR
                 {true, true, true, true},
+                //UT - LTE, WLAN, CROSS-SIM, NR
                 {true, true, true, true},
+                //SMS not required
                 {false, false, false, false},
+                //Call composer not required
                 {false, false, false, false}
         };
 
@@ -472,6 +473,45 @@
 
     @Test
     @SmallTest
+    public void isImsProvisioningRequiredForCapability_withDeprecatedKey() throws Exception {
+        createImsProvisioningController();
+
+        // provisioning required capability
+        // KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE is not defined
+        // but KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL and
+        // KEY_CARRIER_SUPPORTS_SS_OVER_UT_BOOL are defined
+        setDeprecatedCarrierConfig(
+                CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, true);
+        setDeprecatedCarrierConfig(
+                CarrierConfigManager.KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL, true);
+
+        // provisioning required for each capability
+        boolean[][] expectedRequired = new boolean[][] {
+                //voice - LTE, WLAN, CROSS-SIM, NR
+                {true, true, true, true},
+                //video - LTE, WLAN, CROSS-SIM, NR
+                {true, true, true, true},
+                //UT - LTE, WLAN, CROSS-SIM, NR
+                {true, true, true, true},
+                //SMS not required
+                {false, false, false, false},
+                //Call composer not required
+                {false, false, false, false}
+        };
+
+        boolean isRequired;
+        for (int i = 0; i < MMTEL_CAPAS.length; i++) {
+            for (int j = 0; j < RADIO_TECHS.length; j++) {
+                isRequired = mTestImsProvisioningController
+                        .isImsProvisioningRequiredForCapability(
+                                mSubId0, MMTEL_CAPAS[i], RADIO_TECHS[j]);
+                assertEquals(expectedRequired[i][j], isRequired);
+            }
+        }
+    }
+
+    @Test
+    @SmallTest
     public void isRcsProvisioningRequiredForCapability_withInvalidCapabilityTech()
             throws Exception {
         createImsProvisioningController();
@@ -503,12 +543,13 @@
         createImsProvisioningController();
 
         // provisioning required capability : PRESENCE, tech : all
-        mRcsTechMap.clear();
-        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
 
-        boolean[] expectedRequired = new boolean[] {true, true, true, true};
+        // PRESENCE provisioning required on
+        boolean[] expectedRequired = new boolean[]
+                //LTE, WLAN, CROSS-SIM, NR
+                {true, true, true, true};
 
         boolean isRequired;
         for (int i = 0; i < RADIO_TECHS.length; i++) {
@@ -521,6 +562,31 @@
 
     @Test
     @SmallTest
+    public void isRcsProvisioningRequiredForCapability_withDeprecatedKey() throws Exception {
+        createImsProvisioningController();
+
+        // provisioning required capability
+        // KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE is not defined
+        // but KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL is defined
+        setDeprecatedCarrierConfig(
+                CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL, true);
+
+        // PRESENCE provisioning required on
+        boolean[] expectedRequired = new boolean[]
+                //LTE, WLAN, CROSS-SIM, NR
+                {true, true, true, true};
+
+        boolean isRequired;
+        for (int i = 0; i < RADIO_TECHS.length; i++) {
+            isRequired = mTestImsProvisioningController
+                    .isRcsProvisioningRequiredForCapability(
+                            mSubId0, CAPABILITY_TYPE_PRESENCE_UCE, RADIO_TECHS[i]);
+            assertEquals(expectedRequired[i], isRequired);
+        }
+    }
+
+    @Test
+    @SmallTest
     public void getImsProvisioningRequiredForCapability_withVoiceVideoUt() throws Exception {
         createImsProvisioningController();
 
@@ -528,16 +594,12 @@
         // voice, all tech
         // video, all tech
         // UT, all tech
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_UT,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_UT_INT_ARRAY,
+                RADIO_TECHS);
 
         // provisioning Status
         mMmTelProvisioningStorage = new int[][] {
@@ -622,11 +684,10 @@
         // provisioning required capability
         // voice, LTE, IWLAN
         // video, LTE
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN});
-        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
-                new int[] {REGISTRATION_TECH_LTE});
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                REGISTRATION_TECH_LTE);
 
         // provisioning StatusP, all of provisioning status is not provisioned
         mMmTelProvisioningStorage = new int[][]{
@@ -697,10 +758,8 @@
 
         // provisioning required capability
         // PRESENCE, all tech
-        mRcsTechMap.clear();
-        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
 
         // provisioning Status
         mRcsProvisioningStorage = new int[][] {
@@ -743,9 +802,9 @@
 
         // provisioning required capability
         // PRESENCE, LTE, IWLAN
-        mRcsTechMap.clear();
-        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN});
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY,
+                REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN);
 
         // provisioning Status, all of provisioning status is not provisioned
         mRcsProvisioningStorage = new int[][]{
@@ -805,10 +864,8 @@
 
         // provisioning required capability
         // voice, all tech
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                RADIO_TECHS);
 
         // provisioning Status, all of provisioning status is not provisioned
         mMmTelProvisioningStorage = new int[][] {
@@ -886,10 +943,8 @@
 
         // provisioning required capability
         // video, all tech
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
 
         // provisioning Status, all of provisioning status is not provisioned
         mMmTelProvisioningStorage = new int[][] {
@@ -965,10 +1020,8 @@
 
         // provisioning required capability
         // PRESENCE, all tech
-        mRcsTechMap.clear();
-        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
 
         // provisioning Status, all of provisioning status is not provisioned
         mRcsProvisioningStorage = new int[][] {
@@ -1060,13 +1113,10 @@
         // provisioning required capability
         // voice, all tech
         // video, all tech
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
 
         // provisioning Status, all of provisioning status is not set
         mMmTelProvisioningStorage = new int[][] {
@@ -1144,10 +1194,8 @@
 
         // provisioning required capability
         // presence, all tech
-        mRcsTechMap.clear();
-        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
 
         // provisioning Status, all of provisioning status is not set
         mRcsProvisioningStorage = new int[][]{
@@ -1246,11 +1294,10 @@
         // provisioning required capability
         // voice, LTE, IWLAN
         // video, LTE
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN});
-        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
-                new int[] {REGISTRATION_TECH_LTE});
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                REGISTRATION_TECH_LTE);
 
         // provisioning Status, all of provisioning status is not set
         mMmTelProvisioningStorage = new int[][] {
@@ -1261,10 +1308,8 @@
 
         // provisioning required capability
         // presence, all tech
-        mRcsTechMap.clear();
-        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
 
         // provisioning Status, all of provisioning status is not set
         mRcsProvisioningStorage = new int[][]{
@@ -1346,11 +1391,10 @@
         // provisioning required capability
         // voice, LTE, IWLAN
         // video, LTE
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN});
-        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
-                new int[] {REGISTRATION_TECH_LTE});
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                REGISTRATION_TECH_LTE);
 
         // provisioning Status, all of provisioning status is not set
         mMmTelProvisioningStorage = new int[][] {
@@ -1361,10 +1405,8 @@
 
         // provisioning required capability
         // presence, all tech
-        mRcsTechMap.clear();
-        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
 
         // provisioning Status, all of provisioning status is not set
         mRcsProvisioningStorage = new int[][]{
@@ -1458,6 +1500,14 @@
     public void onMultiSimConfigChanged() throws Exception {
         createImsProvisioningController();
 
+        // provisioning required capability
+        // voice, all tech
+        // video, all tech
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
+
         // change number of slot 2 -> 1
         mHandler.sendMessage(mHandler.obtainMessage(
                 mTestImsProvisioningController.EVENT_MULTI_SIM_CONFIGURATION_CHANGE,
@@ -1517,6 +1567,11 @@
         clearInvocations(mIFeatureProvisioningCallback0);
         clearInvocations(mIFeatureProvisioningCallback1);
 
+        // provisioning required capability
+        // voice, all tech
+        setCarrierConfig(mSubId1, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                RADIO_TECHS);
+
         // check get,setImsProvisioningRequiredForCapability with mSubId1, mPhoneId1 : Ok
         int capability = CAPABILITY_TYPE_VOICE;
         int tech = REGISTRATION_TECH_LTE;
@@ -1629,22 +1684,22 @@
     }
 
     private void initializeDefaultData() throws Exception {
-        mMmTelTechMap.clear();
-        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_UT,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_SMS,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mMmTelTechMap.put(CAPABILITY_TYPE_CALL_COMPOSER,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+        mPersistableBundle0.clear();
+        mPersistableBundle0.putPersistableBundle(
+                CarrierConfigManager.Ims.KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE,
+                new PersistableBundle());
+        mPersistableBundle0.putPersistableBundle(
+                CarrierConfigManager.Ims.KEY_RCS_REQUIRES_PROVISIONING_BUNDLE,
+                new PersistableBundle());
+
+        mPersistableBundle1.clear();
+        mPersistableBundle1.putPersistableBundle(
+                CarrierConfigManager.Ims.KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE,
+                new PersistableBundle());
+        mPersistableBundle1.putPersistableBundle(
+                CarrierConfigManager.Ims.KEY_RCS_REQUIRES_PROVISIONING_BUNDLE,
+                new PersistableBundle());
+
         mMmTelProvisioningStorage = new int[][]{
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, 1},
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN, 1},
@@ -1668,13 +1723,6 @@
                 {CAPABILITY_TYPE_CALL_COMPOSER, REGISTRATION_TECH_NR, 1}
         };
 
-        mRcsTechMap.clear();
-        mRcsTechMap.put(CAPABILITY_TYPE_OPTIONS_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
-        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
-                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
-                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
         mRcsProvisioningStorage = new int[][]{
                 {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, 1},
                 {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_IWLAN, 1},
@@ -1690,6 +1738,29 @@
         };
     }
 
+    private void setCarrierConfig(int subId, String capabilityKey, int... techs) {
+        PersistableBundle imsCarrierConfig = mPersistableBundle0;
+        if (subId == mSubId1) {
+            imsCarrierConfig = mPersistableBundle1;
+        }
+
+        PersistableBundle requiredBundle;
+        if (capabilityKey.equals(
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY)) {
+            requiredBundle = imsCarrierConfig.getPersistableBundle(
+                    CarrierConfigManager.Ims.KEY_RCS_REQUIRES_PROVISIONING_BUNDLE);
+        } else {
+            requiredBundle = imsCarrierConfig.getPersistableBundle(
+                    CarrierConfigManager.Ims.KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE);
+        }
+
+        requiredBundle.putIntArray(capabilityKey, techs);
+    }
+
+    private void setDeprecatedCarrierConfig(String key, boolean value) {
+        mPersistableBundle0.putBoolean(key, value);
+    }
+
     private int getProvisionedValue(int i, int j) {
         for (int[] data : mMmTelProvisioningStorage) {
             if (data[0] == i && data[1] == j) {