To support Carrier config bundle for MmTel and Rcs

To support Carrier config bundle KEY_[MMTEL/RCS]_REQUIRES_PROVISIONING_BUNDLE

Bug: 214885306
Test: atest ImsProvisioningControllerTest
Change-Id: I907a32474a68af51e182169f146ad2fc957e5f8d
Merged-In: I907a32474a68af51e182169f146ad2fc957e5f8d
diff --git a/src/com/android/phone/ImsProvisioningController.java b/src/com/android/phone/ImsProvisioningController.java
index 2595e4b..98a6e89 100644
--- a/src/com/android/phone/ImsProvisioningController.java
+++ b/src/com/android/phone/ImsProvisioningController.java
@@ -29,6 +29,7 @@
 import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT;
 import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
 import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
+import static android.telephony.ims.feature.RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_OPTIONS_UCE;
 import static android.telephony.ims.feature.RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE;
 import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM;
 import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
@@ -48,6 +49,7 @@
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.telephony.CarrierConfigManager;
+import android.telephony.CarrierConfigManager.Ims;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyRegistryManager;
 import android.telephony.ims.ProvisioningManager;
@@ -70,6 +72,7 @@
 import com.android.telephony.Rlog;
 
 import java.util.Arrays;
+import java.util.Map;
 import java.util.concurrent.Executor;
 
 /**
@@ -116,6 +119,32 @@
     };
 
     /**
+     * map the MmTelCapabilities.MmTelCapability and
+     * CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT
+     * CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT
+     * CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_UT_INT
+     * CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_SMS_INT
+     * CarrierConfigManager.Ims.KEY_CAPABILITY_CALL_COMPOSER_INT
+     */
+    private static final Map<Integer, String> KEYS_MMTEL_CAPABILITY = Map.of(
+            CAPABILITY_TYPE_VOICE, Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+            CAPABILITY_TYPE_VIDEO, Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+            CAPABILITY_TYPE_UT, Ims.KEY_CAPABILITY_TYPE_UT_INT_ARRAY,
+            CAPABILITY_TYPE_SMS, Ims.KEY_CAPABILITY_TYPE_SMS_INT_ARRAY,
+            CAPABILITY_TYPE_CALL_COMPOSER, Ims.KEY_CAPABILITY_CALL_COMPOSER_INT_ARRAY
+    );
+
+    /**
+     * map the RcsImsCapabilities.RcsImsCapabilityFlag and
+     * CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_OPTIONS_UCE
+     * CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE
+     */
+    private static final Map<Integer, String> KEYS_RCS_CAPABILITY = Map.of(
+            CAPABILITY_TYPE_OPTIONS_UCE, Ims.KEY_CAPABILITY_TYPE_OPTIONS_UCE_INT_ARRAY,
+            CAPABILITY_TYPE_PRESENCE_UCE, Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY
+    );
+
+    /**
      * Create a FeatureConnector for this class to use to connect to an ImsManager.
      */
     @VisibleForTesting
@@ -838,7 +867,7 @@
     }
 
     /**
-     * return the boolean whether MmTel capability is required provisiong or not
+     * return the boolean whether MmTel capability is required provisioning or not
      */
     @VisibleForTesting
     public boolean isImsProvisioningRequiredForCapability(int subId, int capability, int tech) {
@@ -869,7 +898,7 @@
     }
 
     /**
-     * return the boolean whether RCS capability is required provisiong or not
+     * return the boolean whether RCS capability is required provisioning or not
      */
     @VisibleForTesting
     public boolean isRcsProvisioningRequiredForCapability(int subId, int capability, int tech) {
@@ -1170,29 +1199,18 @@
     }
 
     private boolean isProvisioningRequired(int subId, int capability, int tech, boolean isMmTel) {
-        String[] dataArray;
-        if (isMmTel) {
-            dataArray = getMmTelStringArrayFromCarrierConfig(subId);
-        } else {
-            dataArray = getRcsStringArrayFromCarrierConfig(subId);
-        }
-        if (dataArray == null) {
-            logw("isProvisioningRequired : retrieve data from carrier config failed");
-
-            // KEY_MMTEL/RCS_REQUIRES_PROVISIONING_STRING_ARRAY is not exist in CarrierConfig that
-            // means provisioning is not required
+        int[] techArray;
+        techArray = getTechsFromCarrierConfig(subId, capability, isMmTel);
+        if (techArray == null) {
+            logw("isProvisioningRequired : getTechsFromCarrierConfig failed");
+            // not exist in CarrierConfig that means provisioning is not required
             return false;
         }
 
-        // create String with capability and tech
-        String comp = capability + "," + tech;
-
         // compare with carrier config
-        for (String data : dataArray) {
-            // existing same String {capability,tech} means provisioning required
-            if (data.replaceAll("\\s", "").equals(comp)) {
-                return true;
-            }
+        if (Arrays.stream(techArray).anyMatch(keyValue -> keyValue == tech)) {
+            // existing same tech means provisioning required
+            return true;
         }
 
         log("isProvisioningRequired : not matched capability " + capability + " tech " + tech);
@@ -1200,19 +1218,35 @@
     }
 
     @VisibleForTesting
-    protected String[] getMmTelStringArrayFromCarrierConfig(int subId) {
-        PersistableBundle imsCarrierConfigs = mCarrierConfigManager.getConfigByComponentForSubId(
-                CarrierConfigManager.Ims.KEY_PREFIX, subId);
-        return imsCarrierConfigs.getStringArray(
-                CarrierConfigManager.Ims.KEY_MMTEL_REQUIRES_PROVISIONING_STRING_ARRAY);
-    }
+    protected int[] getTechsFromCarrierConfig(int subId, int capability, boolean isMmTel) {
+        String featureKey;
+        String capabilityKey;
+        if (isMmTel) {
+            featureKey = CarrierConfigManager.Ims.KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE;
+            capabilityKey = KEYS_MMTEL_CAPABILITY.get(capability);
+        } else {
+            featureKey = CarrierConfigManager.Ims.KEY_RCS_REQUIRES_PROVISIONING_BUNDLE;
+            capabilityKey = KEYS_RCS_CAPABILITY.get(capability);
+        }
 
-    @VisibleForTesting
-    protected String[] getRcsStringArrayFromCarrierConfig(int subId) {
-        PersistableBundle imsCarrierConfigs = mCarrierConfigManager.getConfigByComponentForSubId(
-                CarrierConfigManager.Ims.KEY_PREFIX, subId);
-        return imsCarrierConfigs.getStringArray(
-                CarrierConfigManager.Ims.KEY_RCS_REQUIRES_PROVISIONING_STRING_ARRAY);
+        if (capabilityKey != null) {
+            PersistableBundle imsCarrierConfigs = mCarrierConfigManager.getConfigForSubId(subId);
+            if (imsCarrierConfigs == null) {
+                log("getTechsFromCarrierConfig : imsCarrierConfigs null");
+                return null;
+            }
+
+            PersistableBundle provisioningBundle =
+                    imsCarrierConfigs.getPersistableBundle(featureKey);
+            if (provisioningBundle == null) {
+                log("getTechsFromCarrierConfig : provisioningBundle null");
+                return null;
+            }
+
+            return provisioningBundle.getIntArray(capabilityKey);
+        }
+
+        return null;
     }
 
     private int getValueFromImsService(int subId, int capability, int tech) {
diff --git a/tests/src/com/android/phone/ImsProvisioningControllerTest.java b/tests/src/com/android/phone/ImsProvisioningControllerTest.java
index 01a6a2c..c26b6a0 100644
--- a/tests/src/com/android/phone/ImsProvisioningControllerTest.java
+++ b/tests/src/com/android/phone/ImsProvisioningControllerTest.java
@@ -28,6 +28,7 @@
 import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT;
 import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
 import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
+import static android.telephony.ims.feature.RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_OPTIONS_UCE;
 import static android.telephony.ims.feature.RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE;
 import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM;
 import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
@@ -69,6 +70,7 @@
 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;
@@ -176,8 +178,9 @@
     int mSubId0 = 1234;
     int mSubId1 = 5678;
 
-    String[] mMmTelStringArray;
-    String[] mRcsStringArray;
+    SparseArray<int[]> mMmTelTechMap = new SparseArray<>();
+    SparseArray<int[]> mRcsTechMap = new SparseArray<>();
+
     int[][] mMmTelProvisioningStorage;
     int[][] mRcsProvisioningStorage;
     int[][] mImsConfigStorage;
@@ -207,12 +210,12 @@
             return mImsConfig;
         }
 
-        protected String[] getMmTelStringArrayFromCarrierConfig(int subId) {
-            return mMmTelStringArray;
-        }
-
-        protected String[] getRcsStringArrayFromCarrierConfig(int subId) {
-            return mRcsStringArray;
+        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) {
@@ -437,11 +440,16 @@
         // voice, all tech
         // video, all tech
         // UT, all tech
-        mMmTelStringArray = new String[] {
-                "1,0", "1,1", "1,2", "1,3",
-                "2,0", "2,1", "2,2", "2,3",
-                "4,0", "4,1", "4,2", "4,3"
-        };
+        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});
 
         boolean[][] expectedRequired = new boolean[][] {
                 {true, true, true, true},
@@ -495,9 +503,10 @@
         createImsProvisioningController();
 
         // provisioning required capability : PRESENCE, tech : all
-        mRcsStringArray = new String[] {
-                "2,0", "2,1", "2,2", "2,3"
-        };
+        mRcsTechMap.clear();
+        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
+                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
 
         boolean[] expectedRequired = new boolean[] {true, true, true, true};
 
@@ -519,11 +528,17 @@
         // voice, all tech
         // video, all tech
         // UT, all tech
-        mMmTelStringArray = new String[] {
-                "1,0", "1,1", "1,2", "1,3",
-                "2,0", "2,1", "2,2", "2,3",
-                "4,0", "4,1", "4,2", "4,3"
-        };
+        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});
+
         // provisioning Status
         mMmTelProvisioningStorage = new int[][] {
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, 0},
@@ -607,10 +622,12 @@
         // provisioning required capability
         // voice, LTE, IWLAN
         // video, LTE
-        mMmTelStringArray = new String[]{
-                "1,0", "1,1",
-                "2,0"
-        };
+        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});
+
         // provisioning StatusP, all of provisioning status is not provisioned
         mMmTelProvisioningStorage = new int[][]{
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, -1},
@@ -680,9 +697,11 @@
 
         // provisioning required capability
         // PRESENCE, all tech
-        mRcsStringArray = new String[] {
-                "2,0", "2,1", "2,2", "2,3"
-        };
+        mRcsTechMap.clear();
+        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
+                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+
         // provisioning Status
         mRcsProvisioningStorage = new int[][] {
                 {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, 1},
@@ -724,9 +743,10 @@
 
         // provisioning required capability
         // PRESENCE, LTE, IWLAN
-        mRcsStringArray = new String[]{
-                "2,0", "2,1"
-        };
+        mRcsTechMap.clear();
+        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN});
+
         // provisioning Status, all of provisioning status is not provisioned
         mRcsProvisioningStorage = new int[][]{
                 {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, -1},
@@ -785,9 +805,11 @@
 
         // provisioning required capability
         // voice, all tech
-        mMmTelStringArray = new String[] {
-                "1,0", "1,1", "1,2", "1,3"
-        };
+        mMmTelTechMap.clear();
+        mMmTelTechMap.put(CAPABILITY_TYPE_VOICE,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
+                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+
         // provisioning Status, all of provisioning status is not provisioned
         mMmTelProvisioningStorage = new int[][] {
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, 0},
@@ -864,9 +886,11 @@
 
         // provisioning required capability
         // video, all tech
-        mMmTelStringArray = new String[] {
-                "2,0", "2,1", "2,2", "2,3"
-        };
+        mMmTelTechMap.clear();
+        mMmTelTechMap.put(CAPABILITY_TYPE_VIDEO,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
+                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+
         // provisioning Status, all of provisioning status is not provisioned
         mMmTelProvisioningStorage = new int[][] {
                 {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE, 0},
@@ -941,9 +965,11 @@
 
         // provisioning required capability
         // PRESENCE, all tech
-        mRcsStringArray = new String[] {
-                "2,0", "2,1", "2,2", "2,3"
-        };
+        mRcsTechMap.clear();
+        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
+                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+
         // provisioning Status, all of provisioning status is not provisioned
         mRcsProvisioningStorage = new int[][] {
                 {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, 0},
@@ -1034,10 +1060,14 @@
         // provisioning required capability
         // voice, all tech
         // video, all tech
-        mMmTelStringArray = new String[] {
-                "1,0", "1,1", "1,2", "1,3",
-                "2,0", "2,1", "2,2", "2,3"
-        };
+        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});
+
         // provisioning Status, all of provisioning status is not set
         mMmTelProvisioningStorage = new int[][] {
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, -1},
@@ -1114,9 +1144,11 @@
 
         // provisioning required capability
         // presence, all tech
-        mRcsStringArray = new String[] {
-                "2,0", "2,1", "2,2", "2,3"
-        };
+        mRcsTechMap.clear();
+        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
+                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+
         // provisioning Status, all of provisioning status is not set
         mRcsProvisioningStorage = new int[][]{
                 {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, -1},
@@ -1214,10 +1246,12 @@
         // provisioning required capability
         // voice, LTE, IWLAN
         // video, LTE
-        mMmTelStringArray = new String[] {
-                "1,0", "1,1",
-                "2,0"
-        };
+        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});
+
         // provisioning Status, all of provisioning status is not set
         mMmTelProvisioningStorage = new int[][] {
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, 1},
@@ -1227,9 +1261,11 @@
 
         // provisioning required capability
         // presence, all tech
-        mRcsStringArray = new String[] {
-                "2,0", "2,1", "2,2", "2,3"
-        };
+        mRcsTechMap.clear();
+        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
+                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+
         // provisioning Status, all of provisioning status is not set
         mRcsProvisioningStorage = new int[][]{
                 {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, 1},
@@ -1310,10 +1346,12 @@
         // provisioning required capability
         // voice, LTE, IWLAN
         // video, LTE
-        mMmTelStringArray = new String[] {
-                "1,0", "1,1",
-                "2,0"
-        };
+        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});
+
         // provisioning Status, all of provisioning status is not set
         mMmTelProvisioningStorage = new int[][] {
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, -1},
@@ -1323,9 +1361,11 @@
 
         // provisioning required capability
         // presence, all tech
-        mRcsStringArray = new String[] {
-                "2,0", "2,1", "2,2", "2,3"
-        };
+        mRcsTechMap.clear();
+        mRcsTechMap.put(CAPABILITY_TYPE_PRESENCE_UCE,
+                new int[] {REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN,
+                        REGISTRATION_TECH_CROSS_SIM, REGISTRATION_TECH_NR});
+
         // provisioning Status, all of provisioning status is not set
         mRcsProvisioningStorage = new int[][]{
                 {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, -1},
@@ -1589,13 +1629,22 @@
     }
 
     private void initializeDefaultData() throws Exception {
-        mMmTelStringArray = new String[]{
-                "1,0", "1,1", "1,2", "1,3",
-                "2,0", "2,1", "2,2", "2,3",
-                "4,0", "4,1", "4,2", "4,3",
-                "8,0", "8,1", "8,2", "8,3",
-                "16,0", "16,1", "16,2", "16,3"
-        };
+        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});
         mMmTelProvisioningStorage = new int[][]{
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, 1},
                 {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN, 1},
@@ -1618,10 +1667,14 @@
                 {CAPABILITY_TYPE_CALL_COMPOSER, REGISTRATION_TECH_CROSS_SIM, 1},
                 {CAPABILITY_TYPE_CALL_COMPOSER, REGISTRATION_TECH_NR, 1}
         };
-        mRcsStringArray = new String[]{
-                "1,0", "1,1", "1,2", "1,3",
-                "2,0", "2,1", "2,2", "2,3"
-        };
+
+        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},