WFC configuration: add API to get and set user settings.

Change-Id: Ia6ab8e5941b707d77321059450e6235f27ecbf38
diff --git a/src/java/com/android/ims/ImsConfig.java b/src/java/com/android/ims/ImsConfig.java
index 29ebaad..00552b1 100644
--- a/src/java/com/android/ims/ImsConfig.java
+++ b/src/java/com/android/ims/ImsConfig.java
@@ -216,9 +216,20 @@
          * Value is in Integer format.
          */
         public static final int EAB_SETTING_ENABLED = 24;
+        /**
+         * Wi-Fi calling roaming status.
+         * Value is in Integer format. ON (1), OFF(0).
+         */
+        public static final int VOICE_OVER_WIFI_ROAMING = 25;
+        /**
+         * Wi-Fi calling modem - WfcModeFeatureValueConstants.
+         * Value is in Integer format.
+         */
+        public static final int VOICE_OVER_WIFI_MODE = 26;
+
         // Expand the operator config items as needed here, need to change
         // PROVISIONED_CONFIG_END after that.
-        public static final int PROVISIONED_CONFIG_END = EAB_SETTING_ENABLED;
+        public static final int PROVISIONED_CONFIG_END = VOICE_OVER_WIFI_MODE;
 
         // Expand the operator config items as needed here.
     }
@@ -243,6 +254,15 @@
         public static final int ON = 1;
     }
 
+    /**
+     * Defines IMS feature value.
+     */
+    public static class WfcModeFeatureValueConstants {
+        public static final int WIFI_ONLY = 0;
+        public static final int CELLULAR_PREFERRED = 1;
+        public static final int WIFI_PREFERRED = 2;
+    }
+
     public ImsConfig(IImsConfig iconfig, Context context) {
         if (DBG) Rlog.d(TAG, "ImsConfig creates");
         miConfig = iconfig;
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 0cdf66d..62680e3 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -17,6 +17,7 @@
 package com.android.ims;
 
 import android.app.PendingIntent;
+import android.app.QueuedWork;
 import android.content.Context;
 import android.content.Intent;
 import android.os.IBinder;
@@ -58,6 +59,8 @@
     public static final int PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE_DEFAULT = 0;
     public static final String PROPERTY_DBG_VT_AVAIL_OVERRIDE = "persist.dbg.vt_avail_ovr";
     public static final int PROPERTY_DBG_VT_AVAIL_OVERRIDE_DEFAULT = 0;
+    public static final String PROPERTY_DBG_WFC_AVAIL_OVERRIDE = "persist.dbg.wfc_avail_ovr";
+    public static final int PROPERTY_DBG_WFC_AVAIL_OVERRIDE_DEFAULT = 0;
 
     /**
      * For accessing the IMS related service.
@@ -171,7 +174,7 @@
         int enabled = android.provider.Settings.Global.getInt(
                     context.getContentResolver(),
                     android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, ImsConfig.FeatureValueConstants.ON);
-        return (enabled == 1)? true:false;
+        return (enabled == 1) ? true : false;
     }
 
     /**
@@ -274,6 +277,133 @@
                         com.android.internal.R.bool.config_carrier_vt_available);
     }
 
+    /**
+     * Returns the user configuration of WFC setting
+     */
+    public static boolean isWfcEnabledByUser(Context context) {
+        int enabled = android.provider.Settings.Global.getInt(context.getContentResolver(),
+                android.provider.Settings.Global.WFC_IMS_ENABLED,
+                ImsConfig.FeatureValueConstants.ON);
+        return (enabled == 1) ? true : false;
+    }
+
+    /**
+     * Change persistent WFC enabled setting
+     */
+    public static void setWfcSetting(Context context, boolean enabled) {
+        int value = enabled ? 1 : 0;
+        android.provider.Settings.Global.putInt(context.getContentResolver(),
+                android.provider.Settings.Global.WFC_IMS_ENABLED, value);
+
+        ImsManager imsManager = ImsManager.getInstance(context,
+                SubscriptionManager.getDefaultVoicePhoneId());
+        if (imsManager != null) {
+            try {
+                ImsConfig config = imsManager.getConfigInterface();
+                // FIXME: replace NETWORK_TYPE_LTE with NETWORK_TYPE_IWLAN
+                // when available
+                config.setFeatureValue(ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI,
+                        TelephonyManager.NETWORK_TYPE_LTE,
+                        enabled ? ImsConfig.FeatureValueConstants.ON
+                                : ImsConfig.FeatureValueConstants.OFF, null);
+            } catch (ImsException e) {
+                // do nothing
+            }
+        }
+    }
+
+    /**
+     * Returns the user configuration of WFC modem setting
+     */
+    public static int getWfcMode(Context context) {
+        int setting = android.provider.Settings.Global.getInt(context.getContentResolver(),
+                android.provider.Settings.Global.WFC_IMS_MODE,
+                ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED);
+        if (DBG) log("getWfcMode - setting=" + setting);
+        return setting;
+    }
+
+    /**
+     * Returns the user configuration of WFC modem setting
+     */
+    public static void setWfcMode(Context context, int wfcMode) {
+        if (DBG) log("setWfcMode - setting=" + wfcMode);
+        android.provider.Settings.Global.putInt(context.getContentResolver(),
+                android.provider.Settings.Global.WFC_IMS_MODE, wfcMode);
+
+        final ImsManager imsManager = ImsManager.getInstance(context,
+                SubscriptionManager.getDefaultVoicePhoneId());
+        if (imsManager != null) {
+            final int value = wfcMode;
+            QueuedWork.singleThreadExecutor().submit(new Runnable() {
+                public void run() {
+                    try {
+                        imsManager.getConfigInterface().setProvisionedValue(
+                                ImsConfig.ConfigConstants.VOICE_OVER_WIFI_MODE,
+                                value);
+                    } catch (ImsException e) {
+                        // do nothing
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * Returns the user configuration of WFC roaming setting
+     */
+    public static boolean isWfcRoamingEnabledByUser(Context context) {
+        int enabled = android.provider.Settings.Global.getInt(context.getContentResolver(),
+                android.provider.Settings.Global.WFC_IMS_ROAMING_ENABLED,
+                ImsConfig.FeatureValueConstants.ON);
+        return (enabled == 1) ? true : false;
+    }
+
+    /**
+     * Change persistent WFC roaming enabled setting
+     */
+    public static void setWfcRoamingSetting(Context context, boolean enabled) {
+        final int value = enabled
+                ? ImsConfig.FeatureValueConstants.ON
+                : ImsConfig.FeatureValueConstants.OFF;
+        android.provider.Settings.Global.putInt(context.getContentResolver(),
+                android.provider.Settings.Global.WFC_IMS_ROAMING_ENABLED, value);
+
+        final ImsManager imsManager = ImsManager.getInstance(context,
+                SubscriptionManager.getDefaultVoicePhoneId());
+        if (imsManager != null) {
+            QueuedWork.singleThreadExecutor().submit(new Runnable() {
+                public void run() {
+                    try {
+                        imsManager.getConfigInterface().setProvisionedValue(
+                                ImsConfig.ConfigConstants.VOICE_OVER_WIFI_ROAMING,
+                                value);
+                    } catch (ImsException e) {
+                        // do nothing
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * Returns a platform configuration for WFC which may override the user
+     * setting. Note: WFC presumes that VoLTE is enabled (these are
+     * configuration settings which must be done correctly).
+     */
+    public static boolean isWfcEnabledByPlatform(Context context) {
+        if (SystemProperties.getInt(PROPERTY_DBG_WFC_AVAIL_OVERRIDE,
+                PROPERTY_DBG_WFC_AVAIL_OVERRIDE_DEFAULT) == 1) {
+            return true;
+        }
+
+        return
+               context.getResources().getBoolean(
+                       com.android.internal.R.bool.config_device_wfc_ims_available) &&
+               context.getResources().getBoolean(
+                       com.android.internal.R.bool.config_carrier_wfc_ims_available);
+    }
+
     private ImsManager(Context context, int phoneId) {
         mContext = context;
         mPhoneId = phoneId;
@@ -699,15 +829,15 @@
         return proxy;
     }
 
-    private void log(String s) {
+    private static void log(String s) {
         Rlog.d(TAG, s);
     }
 
-    private void loge(String s) {
+    private static void loge(String s) {
         Rlog.e(TAG, s);
     }
 
-    private void loge(String s, Throwable t) {
+    private static void loge(String s, Throwable t) {
         Rlog.e(TAG, s, t);
     }