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