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