Use Subscription properties to store Ims user settings.
To support multi-sim Ims settings, SubscriptionManager is a
better place than Global settings, since the settings are per
subId. So we use SubscriptionManager to store them now.
Bug: 66699661
Test: Manual
Change-Id: Icad66768bfecb7f1add1896e211fa377ec044895
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index a77abcd..305735d 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -237,6 +237,8 @@
private static final long BACKOFF_MAX_DELAY_MS = 300000;
// Multiplier for exponential delay
private static final int BACKOFF_MULTIPLIER = 2;
+ // -1 indicates a subscriptionProperty value that is never set.
+ private static final int SUB_PROPERTY_NOT_INITIALIZED = -1;
/**
@@ -281,20 +283,22 @@
}
/**
- * Returns the user configuration of Enhanced 4G LTE Mode setting for slot.
+ * Returns the user configuration of Enhanced 4G LTE Mode setting for slot. If not set, it
+ * returns true as default value.
*/
public boolean isEnhanced4gLteModeSettingEnabledByUser() {
// If user can't edit Enhanced 4G LTE Mode, it assumes Enhanced 4G LTE Mode is always true.
// If user changes SIM from editable mode to uneditable mode, need to return true.
- if (!getBooleanCarrierConfig(
- CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL)) {
+ if (!getBooleanCarrierConfig(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL)) {
return true;
}
- int enabled = android.provider.Settings.Global.getInt(
- mContext.getContentResolver(),
- android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED,
- ImsConfig.FeatureValueConstants.ON);
- return (enabled == 1);
+
+ int setting = SubscriptionManager.getIntegerSubscriptionProperty(
+ getSubId(), SubscriptionManager.ENHANCED_4G_MODE_ENABLED,
+ SUB_PROPERTY_NOT_INITIALIZED, mContext);
+
+ // If it's never set, by default we return true.
+ return (setting == SUB_PROPERTY_NOT_INITIALIZED || setting == 1);
}
/**
@@ -319,28 +323,23 @@
*
*/
public void setEnhanced4gLteModeSetting(boolean enabled) {
- // If false, we must always keep advanced 4G mode set to true (1).
- int value = getBooleanCarrierConfig(
- CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL) ? (enabled ? 1: 0) : 1;
+ // If false, we must always keep advanced 4G mode set to true.
+ enabled = getBooleanCarrierConfig(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL)
+ ? enabled : true;
- try {
- int prevSetting = android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED);
- if (prevSetting == value) {
- // Don't trigger setAdvanced4GMode if the setting hasn't changed.
- return;
- }
- } catch (Settings.SettingNotFoundException e) {
- // Setting doesn't exist yet, so set it below.
- }
+ int prevSetting = SubscriptionManager.getIntegerSubscriptionProperty(
+ getSubId(), SubscriptionManager.ENHANCED_4G_MODE_ENABLED,
+ SUB_PROPERTY_NOT_INITIALIZED, mContext);
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, value);
- if (isNonTtyOrTtyOnVolteEnabled()) {
- try {
- setAdvanced4GMode(enabled);
- } catch (ImsException ie) {
- // do nothing
+ if (prevSetting != (enabled ? 1 : 0)) {
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.ENHANCED_4G_MODE_ENABLED, booleanToPropertyString(enabled));
+ if (isNonTtyOrTtyOnVolteEnabled()) {
+ try {
+ setAdvanced4GMode(enabled);
+ } catch (ImsException ie) {
+ // do nothing
+ }
}
}
}
@@ -406,8 +405,7 @@
return mContext.getResources().getBoolean(
com.android.internal.R.bool.config_device_volte_available)
- && getBooleanCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL)
+ && getBooleanCarrierConfig(CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL)
&& isGbaValid();
}
@@ -541,8 +539,7 @@
return mContext.getResources().getBoolean(
com.android.internal.R.bool.config_device_vt_available) &&
- getBooleanCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_VT_AVAILABLE_BOOL) &&
+ getBooleanCarrierConfig(CarrierConfigManager.KEY_CARRIER_VT_AVAILABLE_BOOL) &&
isGbaValid();
}
@@ -562,13 +559,16 @@
}
/**
- * Returns the user configuration of VT setting per slot.
+ * Returns the user configuration of VT setting per slot. If not set, it
+ * returns true as default value.
*/
public boolean isVtEnabledByUser() {
- int enabled = android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.VT_IMS_ENABLED,
- ImsConfig.FeatureValueConstants.ON);
- return (enabled == 1);
+ int setting = SubscriptionManager.getIntegerSubscriptionProperty(
+ getSubId(), SubscriptionManager.VT_IMS_ENABLED,
+ SUB_PROPERTY_NOT_INITIALIZED, mContext);
+
+ // If it's never set, by default we return true.
+ return (setting == SUB_PROPERTY_NOT_INITIALIZED || setting == 1);
}
/**
@@ -589,10 +589,9 @@
* Change persistent VT enabled setting for slot.
*/
public void setVtSetting(boolean enabled) {
- int value = enabled ? 1 : 0;
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.VT_IMS_ENABLED, value);
-
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.VT_IMS_ENABLED,
+ booleanToPropertyString(enabled));
try {
ImsConfig config = getConfigInterface();
config.setFeatureValue(ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE,
@@ -662,15 +661,21 @@
}
/**
- * Returns the user configuration of WFC setting for slot.
+ * Returns the user configuration of WFC setting for slot. If not set, it
+ * queries CarrierConfig value as default.
*/
public boolean isWfcEnabledByUser() {
- int enabled = android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_ENABLED,
- getBooleanCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL) ?
- ImsConfig.FeatureValueConstants.ON : ImsConfig.FeatureValueConstants.OFF);
- return enabled == 1;
+ int setting = SubscriptionManager.getIntegerSubscriptionProperty(
+ getSubId(), SubscriptionManager.WFC_IMS_ENABLED,
+ SUB_PROPERTY_NOT_INITIALIZED, mContext);
+
+ // SUB_PROPERTY_NOT_INITIALIZED indicates it's never set in sub db.
+ if (setting == SUB_PROPERTY_NOT_INITIALIZED) {
+ return getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL);
+ } else {
+ return setting == 1;
+ }
}
/**
@@ -691,9 +696,8 @@
* Change persistent WFC enabled setting for slot.
*/
public void setWfcSetting(boolean enabled) {
- int value = enabled ? 1 : 0;
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_ENABLED, value);
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.WFC_IMS_ENABLED, booleanToPropertyString(enabled));
setWfcNonPersistent(enabled, getWfcMode());
}
@@ -736,7 +740,7 @@
/**
* Returns the user configuration of WFC preference setting.
*
- * @deprecated Doesn't support MSIM devices. Use {@link #getWfcMode()} instead.
+ * @deprecated Doesn't support MSIM devices. Use {@link #getWfcMode(boolean roaming)} instead.
*/
public static int getWfcMode(Context context) {
ImsManager mgr = ImsManager.getInstance(context,
@@ -750,13 +754,10 @@
/**
* Returns the user configuration of WFC preference setting
+ * @deprecated. Use {@link #getWfcMode(boolean roaming)} instead.
*/
public int getWfcMode() {
- int setting = android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_MODE, getIntCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT));
- if (DBG) log("getWfcMode - setting=" + setting);
- return setting;
+ return getWfcMode(false);
}
/**
@@ -778,8 +779,9 @@
*/
public void setWfcMode(int wfcMode) {
if (DBG) log("setWfcMode(i) - setting=" + wfcMode);
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_MODE, wfcMode);
+
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.WFC_IMS_MODE, Integer.toString(wfcMode));
setWfcModeInternal(wfcMode);
}
@@ -813,22 +815,35 @@
}
/**
- * Returns the user configuration of WFC preference setting for slot
+ * Returns the user configuration of WFC preference setting for slot. If not set, it
+ * queries CarrierConfig value as default.
*
* @param roaming {@code false} for home network setting, {@code true} for roaming setting
*/
public int getWfcMode(boolean roaming) {
int setting = 0;
if (!roaming) {
- setting = android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_MODE, getIntCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT));
+ setting = SubscriptionManager.getIntegerSubscriptionProperty(
+ getSubId(), SubscriptionManager.WFC_IMS_MODE,
+ SUB_PROPERTY_NOT_INITIALIZED, mContext);
+
+ // SUB_PROPERTY_NOT_INITIALIZED indicates it's never set in sub db.
+ if (setting == SUB_PROPERTY_NOT_INITIALIZED) {
+ setting = getIntCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT);
+ }
if (DBG) log("getWfcMode - setting=" + setting);
} else {
- setting = android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_ROAMING_MODE,
- getIntCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT));
+ setting = SubscriptionManager.getIntegerSubscriptionProperty(
+ getSubId(), SubscriptionManager.WFC_IMS_ROAMING_MODE,
+ SUB_PROPERTY_NOT_INITIALIZED, mContext);
+
+ // SUB_PROPERTY_NOT_INITIALIZED indicates it's never set in sub db.
+ if (setting == SUB_PROPERTY_NOT_INITIALIZED) {
+ setting = getIntCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT);
+ }
+
if (DBG) log("getWfcMode (roaming) - setting=" + setting);
}
return setting;
@@ -859,15 +874,14 @@
public void setWfcMode(int wfcMode, boolean roaming) {
if (!roaming) {
if (DBG) log("setWfcMode(i,b) - setting=" + wfcMode);
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_MODE, wfcMode);
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.WFC_IMS_MODE, Integer.toString(wfcMode));
} else {
if (DBG) log("setWfcMode(i,b) (roaming) - setting=" + wfcMode);
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_ROAMING_MODE, wfcMode);
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.WFC_IMS_ROAMING_MODE, Integer.toString(wfcMode));
}
-
TelephonyManager tm = (TelephonyManager)
mContext.getSystemService(Context.TELEPHONY_SERVICE);
if (roaming == tm.isNetworkRoaming(getSubId())) {
@@ -907,13 +921,12 @@
private void setWfcModeInternal(int wfcMode) {
final int value = wfcMode;
Thread thread = new Thread(() -> {
- try {
- getConfigInterface().setProvisionedValue(
- ImsConfig.ConfigConstants.VOICE_OVER_WIFI_MODE,
- value);
- } catch (ImsException e) {
- // do nothing
- }
+ try {
+ getConfigInterface().setProvisionedValue(
+ ImsConfig.ConfigConstants.VOICE_OVER_WIFI_MODE, value);
+ } catch (ImsException e) {
+ // do nothing
+ }
});
thread.start();
}
@@ -935,15 +948,19 @@
}
/**
- * Returns the user configuration of WFC roaming setting for slot
+ * Returns the user configuration of WFC roaming setting for slot. If not set, it
+ * queries CarrierConfig value as default.
*/
public boolean isWfcRoamingEnabledByUser() {
- int enabled = android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_ROAMING_ENABLED,
- getBooleanCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL) ?
- ImsConfig.FeatureValueConstants.ON : ImsConfig.FeatureValueConstants.OFF);
- return (enabled == 1);
+ int setting = SubscriptionManager.getIntegerSubscriptionProperty(
+ getSubId(), SubscriptionManager.WFC_IMS_ROAMING_ENABLED,
+ SUB_PROPERTY_NOT_INITIALIZED, mContext);
+ if (setting == SUB_PROPERTY_NOT_INITIALIZED) {
+ return getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL);
+ } else {
+ return (setting == 1);
+ }
}
/**
@@ -962,10 +979,9 @@
* Change persistent WFC roaming enabled setting
*/
public void setWfcRoamingSetting(boolean enabled) {
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_ROAMING_ENABLED,
- enabled ? ImsConfig.FeatureValueConstants.ON
- : ImsConfig.FeatureValueConstants.OFF);
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.WFC_IMS_ROAMING_ENABLED, booleanToPropertyString(enabled)
+ );
setWfcRoamingSettingInternal(enabled);
}
@@ -975,13 +991,12 @@
? ImsConfig.FeatureValueConstants.ON
: ImsConfig.FeatureValueConstants.OFF;
Thread thread = new Thread(() -> {
- try {
- getConfigInterface().setProvisionedValue(
- ImsConfig.ConfigConstants.VOICE_OVER_WIFI_ROAMING,
- value);
- } catch (ImsException e) {
- // do nothing
- }
+ try {
+ getConfigInterface().setProvisionedValue(
+ ImsConfig.ConfigConstants.VOICE_OVER_WIFI_ROAMING, value);
+ } catch (ImsException e) {
+ // do nothing
+ }
});
thread.start();
}
@@ -2383,34 +2398,30 @@
*/
public void factoryReset() {
// Set VoLTE to default
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED,
- ImsConfig.FeatureValueConstants.ON);
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.ENHANCED_4G_MODE_ENABLED, booleanToPropertyString(true));
// Set VoWiFi to default
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_ENABLED,
- getBooleanCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL) ?
- ImsConfig.FeatureValueConstants.ON : ImsConfig.FeatureValueConstants.OFF);
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.WFC_IMS_ENABLED,
+ booleanToPropertyString(getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL)));
// Set VoWiFi mode to default
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_MODE,
- getIntCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT));
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.WFC_IMS_MODE,
+ Integer.toString(getIntCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT)));
// Set VoWiFi roaming to default
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.WFC_IMS_ROAMING_ENABLED,
- getBooleanCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL) ?
- ImsConfig.FeatureValueConstants.ON : ImsConfig.FeatureValueConstants.OFF);
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.WFC_IMS_ROAMING_ENABLED,
+ booleanToPropertyString(getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL)));
// Set VT to default
- android.provider.Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.VT_IMS_ENABLED,
- ImsConfig.FeatureValueConstants.ON);
+ SubscriptionManager.setSubscriptionProperty(getSubId(),
+ SubscriptionManager.VT_IMS_ENABLED, booleanToPropertyString(true));
// Push settings to ImsConfig
updateImsServiceConfig(true);
@@ -2453,6 +2464,11 @@
SystemProperties.set(VT_PROVISIONED_PROP, provisioned ? TRUE : FALSE);
}
+ private static String booleanToPropertyString(boolean bool) {
+ return bool ? "1" : "0";
+ }
+
+
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("ImsManager:");
pw.println(" mPhoneId = " + mPhoneId);