WFC configuration: add GUI for Wi-Fi calling settings.

Change-Id: I6d388cb3fbc76bb16218b28f34cbffe67ac5ef36
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c47db4f..a1dd09a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -427,6 +427,36 @@
     <string name="enhanced_4g_lte_mode_title">Enhanced 4G LTE Mode</string>
     <!-- Cellular network 4G summary [CHAR LIMIT=80] -->
     <string name="enhanced_4g_lte_mode_summary">Use LTE services to improve voice and other communications (recommended)</string>
+
+    <!-- WFC enable/disable [CHAR LIMIT=30] -->
+    <string name="wfc_title">Wi-Fi calling</string>
+    <!-- WFC summary [CHAR LIMIT=80] -->
+    <string name="wfc_summary">Allow voice calls to use Wi-Fi (recommended)</string>
+    <!-- WFC mode [CHAR LIMIT=30] -->
+    <string name="wfc_mode_title">Wi-Fi calling mode</string>
+    <!-- WFC mode dialog [CHAR LIMIT=30] -->
+    <string name="wfc_mode_dialog_title">Wi-Fi calling mode</string>
+    <string-array name="wfc_mode_choices">
+        <item>Wi-Fi preferred</item>
+        <item>Cellular preferred</item>
+        <item>Wi-Fi only</item>
+    </string-array>
+    <string-array name="wfc_mode_values">
+        <item>"2"</item>
+        <item>"1"</item>
+        <item>"0"</item>
+    </string-array>
+    <!-- WFC, summary for Wi-Fi Preferred [CHAR LIMIT=100] -->
+    <string name="wfc_mode_wifi_preferred_summary">Wi-Fi preferred (Uses cell network only if Wi-Fi isn\'t available)</string>
+    <!-- WFC, summary for Cellular Preferred [CHAR LIMIT=100] -->
+    <string name="wfc_mode_cellular_preferred_summary">Cellular preferred (Uses Wi-Fi only if cell network isn\'t available)</string>
+    <!-- WFC, summary for Wi-Fi Only [CHAR LIMIT=100] -->
+    <string name="wfc_mode_wifi_only_summary">Wi-Fi only (Never uses cell network. Can\'t make or receive calls if Wi-Fi isn\'t available)</string>
+    <!-- WFC roam enable/disable [CHAR LIMIT=30] -->
+    <string name="wfc_roam_title">WFC handoff while roaming</string>
+    <!-- WFC roam summary [CHAR LIMIT=80] -->
+    <string name="wfc_roam_summary">Allow Wi-Fi voice calls handoff to cell network when roaming</string>
+
     <!-- Mobile network settings screen, data enabling checkbox name -->
     <string name="data_enabled">Data enabled</string>
     <!-- Mobile network settings screen, setting summary text when check box is not selected (explains what selecting it would do) [CHAR LIMITS=40] -->
diff --git a/res/xml/network_setting.xml b/res/xml/network_setting.xml
index fcd4439..399e514 100644
--- a/res/xml/network_setting.xml
+++ b/res/xml/network_setting.xml
@@ -51,4 +51,22 @@
         android:persistent="false"
         android:summary="@string/enhanced_4g_lte_mode_summary"/>
 
+    <SwitchPreference
+        android:key="wfc_enable"
+        android:title="@string/wfc_title"
+        android:persistent="false"/>
+
+    <ListPreference
+        android:key="wfc_mode"
+        android:title="@string/wfc_mode_title"
+        android:summary="@string/wfc_mode_title"
+        android:entries="@array/wfc_mode_choices"
+        android:entryValues="@array/wfc_mode_values"
+        android:dialogTitle="@string/wfc_mode_dialog_title" />
+
+    <SwitchPreference
+        android:key="wfc_roam"
+        android:title="@string/wfc_roam_title"
+        android:persistent="false"/>
+
 </PreferenceScreen>
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 3e43ba1..f036584 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -16,6 +16,7 @@
 
 package com.android.phone;
 
+import com.android.ims.ImsConfig;
 import com.android.ims.ImsManager;
 import com.android.ims.ImsException;
 import com.android.internal.telephony.Phone;
@@ -95,6 +96,9 @@
     private static final String BUTTON_CDMA_LTE_DATA_SERVICE_KEY = "cdma_lte_data_service_key";
     private static final String BUTTON_ENABLED_NETWORKS_KEY = "enabled_networks_key";
     private static final String BUTTON_4G_LTE_KEY = "enhanced_4g_lte";
+    private static final String BUTTON_WFC = "wfc_enable";
+    private static final String BUTTON_WFC_MODE = "wfc_mode";
+    private static final String BUTTON_WFC_ROAM = "wfc_roam";
     private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
     private static final String BUTTON_APN_EXPAND_KEY = "button_apn_key";
     private static final String BUTTON_OPERATOR_SELECTION_EXPAND_KEY = "button_carrier_sel_key";
@@ -115,6 +119,9 @@
     private ListPreference mButtonEnabledNetworks;
     private SwitchPreference mButtonDataRoam;
     private SwitchPreference mButton4glte;
+    private SwitchPreference mButtonWfc;
+    private ListPreference mButtonWfcMode;
+    private SwitchPreference mButtonWfcRoam;
     private Preference mLteDataServicePref;
 
     private static final String iface = "rmnet0"; //TODO: this will go away
@@ -148,10 +155,34 @@
         public void onCallStateChanged(int state, String incomingNumber) {
             if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
             Preference pref = getPreferenceScreen().findPreference(BUTTON_4G_LTE_KEY);
+            boolean isEnhanced4gModeEnabled = false;
             if (pref != null) {
+                isEnhanced4gModeEnabled = ((SwitchPreference) pref).isChecked() &&
+                        ImsManager.isNonTtyOrTtyOnVolteEnabled(getApplicationContext());
                 pref.setEnabled((state == TelephonyManager.CALL_STATE_IDLE) &&
                         ImsManager.isNonTtyOrTtyOnVolteEnabled(getApplicationContext()));
             }
+            pref = getPreferenceScreen().findPreference(BUTTON_WFC);
+            boolean isWfcEnabled = false;
+            if (pref != null) {
+                isWfcEnabled = ((SwitchPreference) pref).isChecked();
+                pref.setEnabled(
+                        isEnhanced4gModeEnabled && (state == TelephonyManager.CALL_STATE_IDLE));
+            }
+            pref = getPreferenceScreen().findPreference(BUTTON_WFC_MODE);
+            int wfcMode = ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
+            if (pref != null) {
+                pref.setEnabled(isEnhanced4gModeEnabled && isWfcEnabled
+                        && (state == TelephonyManager.CALL_STATE_IDLE));
+                ListPreference prefWfcMode = (ListPreference)pref;
+                wfcMode = Integer.valueOf(prefWfcMode.getValue()).intValue();
+            }
+            pref = getPreferenceScreen().findPreference(BUTTON_WFC_ROAM);
+            if (pref != null) {
+                pref.setEnabled(isEnhanced4gModeEnabled && isWfcEnabled
+                        && (wfcMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY)
+                        && (state == TelephonyManager.CALL_STATE_IDLE));
+            }
         }
     };
 
@@ -195,7 +226,8 @@
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         /** TODO: Refactor and get rid of the if's using subclasses */
         final int phoneSubId = mPhone.getSubId();
-        if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) {
+        if (preference.getKey().equals(BUTTON_4G_LTE_KEY) || preference.getKey().equals(BUTTON_WFC)
+                || preference.getKey().equals(BUTTON_WFC_ROAM)) {
             return true;
         } else if (mGsmUmtsOptions != null &&
                 mGsmUmtsOptions.preferenceTreeClick(preference) == true) {
@@ -221,6 +253,8 @@
                     preferredNetworkMode);
             mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
             return true;
+        } else if (preference == mButtonWfcMode) {
+            return true;
         } else if (preference == mLteDataServicePref) {
             String tmpl = android.provider.Settings.Global.getString(getContentResolver(),
                         android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL);
@@ -436,9 +470,17 @@
         addPreferencesFromResource(R.xml.network_setting);
 
         mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
-
         mButton4glte.setOnPreferenceChangeListener(this);
 
+        mButtonWfc = (SwitchPreference) findPreference(BUTTON_WFC);
+        mButtonWfc.setOnPreferenceChangeListener(this);
+
+        mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE);
+        mButtonWfcMode.setOnPreferenceChangeListener(this);
+
+        mButtonWfcRoam = (SwitchPreference) findPreference(BUTTON_WFC_ROAM);
+        mButtonWfcRoam.setOnPreferenceChangeListener(this);
+
         try {
             Context con = createPackageContext("com.android.systemui", 0);
             int id = con.getResources().getIdentifier("config_show4GForLTE",
@@ -508,9 +550,17 @@
             tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
         }
 
-        mButton4glte.setChecked(ImsManager.isEnhanced4gLteModeSettingEnabledByUser(this)
-                && ImsManager.isNonTtyOrTtyOnVolteEnabled(this));
-        // NOTE: The button will be enabled/disabled in mPhoneStateListener
+        // NOTE: Buttons will be enabled/disabled in mPhoneStateListener
+        boolean enh4glteMode = ImsManager.isEnhanced4gLteModeSettingEnabledByUser(this)
+                && ImsManager.isNonTtyOrTtyOnVolteEnabled(this);
+        mButton4glte.setChecked(enh4glteMode);
+        boolean wfcEnabled = ImsManager.isWfcEnabledByUser(this);
+        mButtonWfc.setChecked(enh4glteMode && wfcEnabled);
+        int wfcMode = ImsManager.getWfcMode(mPhone.getContext());
+        mButtonWfcMode.setValue(Integer.toString(wfcMode));
+        mButtonWfcRoam.setChecked(enh4glteMode && wfcEnabled &&
+                (wfcMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY) &&
+                ImsManager.isWfcRoamingEnabledByUser(this));
 
         mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
 
@@ -534,6 +584,26 @@
             prefSet.addPreference(mButtonPreferredNetworkMode);
             prefSet.addPreference(mButtonEnabledNetworks);
             prefSet.addPreference(mButton4glte);
+            prefSet.addPreference(mButtonWfc);
+            prefSet.addPreference(mButtonWfcMode);
+            UpdateWfcModeSummary(ImsManager.getWfcMode(mPhone.getContext()));
+            prefSet.addPreference(mButtonWfcRoam);
+
+            if (!ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())) {
+                mButtonWfc.setEnabled(false);
+                mButtonWfcMode.setEnabled(false);
+                mButtonWfcRoam.setEnabled(false);
+            }
+
+            if (!ImsManager.isWfcEnabledByUser(mPhone.getContext())) {
+                mButtonWfcMode.setEnabled(false);
+                mButtonWfcRoam.setEnabled(false);
+            }
+
+            if (ImsManager.getWfcMode(mPhone.getContext())
+                    == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY) {
+                mButtonWfcRoam.setEnabled(false);
+            }
         }
 
         int settingsNetworkMode = android.provider.Settings.Global.getInt(
@@ -669,6 +739,22 @@
             }
         }
 
+        // Enable WFC settings depending on whether exists on platform
+        if (!ImsManager.isWfcEnabledByPlatform(this)) {
+            Preference pref = prefSet.findPreference(BUTTON_WFC);
+            if (pref != null) {
+                prefSet.removePreference(pref);
+            }
+            pref = prefSet.findPreference(BUTTON_WFC_MODE);
+            if (pref != null) {
+                prefSet.removePreference(pref);
+            }
+            pref = prefSet.findPreference(BUTTON_WFC_ROAM);
+            if (pref != null) {
+                prefSet.removePreference(pref);
+            }
+        }
+
         ActionBar actionBar = getActionBar();
         if (actionBar != null) {
             // android.R.id.home will be triggered in onOptionsItemSelected()
@@ -843,9 +929,51 @@
                         .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
             }
         } else if (preference == mButton4glte) {
-            SwitchPreference ltePref = (SwitchPreference)preference;
-            ltePref.setChecked(!ltePref.isChecked());
-            ImsManager.setEnhanced4gLteModeSetting(this, ltePref.isChecked());
+            SwitchPreference enhanced4gModePref = (SwitchPreference) preference;
+            boolean enhanced4gMode = !enhanced4gModePref.isChecked();
+            enhanced4gModePref.setChecked(enhanced4gMode);
+            ImsManager.setEnhanced4gLteModeSetting(this, enhanced4gModePref.isChecked());
+
+            mButtonWfc.setEnabled(enhanced4gMode);
+            boolean wfcEnabled = ImsManager.isWfcEnabledByUser(this);
+            mButtonWfc.setChecked(enhanced4gMode && wfcEnabled);
+            mButtonWfcMode.setEnabled(enhanced4gMode && wfcEnabled);
+            boolean wfcHandoffEnabled = (ImsManager.getWfcMode(mPhone.getContext())
+                    != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY);
+            mButtonWfcRoam.setEnabled(enhanced4gMode && wfcEnabled && wfcHandoffEnabled);
+            mButtonWfcRoam.setChecked(enhanced4gMode && wfcEnabled && wfcHandoffEnabled &&
+                    ImsManager.isWfcRoamingEnabledByUser(this));
+        } else if (preference == mButtonWfc) {
+            SwitchPreference wfcPref = (SwitchPreference) preference;
+            boolean wfcEnabled = !wfcPref.isChecked();
+            wfcPref.setChecked(wfcEnabled);
+            ImsManager.setWfcSetting(this, wfcPref.isChecked());
+
+            mButtonWfcMode.setEnabled(wfcEnabled);
+            boolean wfcHandoffEnabled = (ImsManager.getWfcMode(mPhone.getContext())
+                    != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY);
+            mButtonWfcRoam.setEnabled(wfcEnabled && wfcHandoffEnabled);
+            mButtonWfcRoam.setChecked(wfcEnabled && wfcHandoffEnabled &&
+                    ImsManager.isWfcRoamingEnabledByUser(this));
+        } else if (preference == mButtonWfcMode) {
+            mButtonWfcMode.setValue((String) objValue);
+            int buttonMode = Integer.valueOf((String) objValue).intValue();
+            int currentMode = ImsManager.getWfcMode(mPhone.getContext());
+            if (DBG)
+                log("Setting WFC Mode: buttonMode=" + buttonMode + ", currentMode=" + currentMode);
+            if (buttonMode != currentMode) {
+                ImsManager.setWfcMode(mPhone.getContext(), buttonMode);
+                UpdateWfcModeSummary(buttonMode);
+            }
+            boolean wfcHandoffEnabled =
+                    (buttonMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY);
+            mButtonWfcRoam.setEnabled(wfcHandoffEnabled);
+            mButtonWfcRoam.setChecked(wfcHandoffEnabled &&
+                    ImsManager.isWfcRoamingEnabledByUser(this));
+        } else if (preference == mButtonWfcRoam) {
+            SwitchPreference wfcRoamPref = (SwitchPreference) preference;
+            wfcRoamPref.setChecked(!wfcRoamPref.isChecked());
+            ImsManager.setWfcRoamingSetting(this, wfcRoamPref.isChecked());
         } else if (preference == mButtonDataRoam) {
             if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
 
@@ -1157,6 +1285,22 @@
         }
     }
 
+    private void UpdateWfcModeSummary(int wfcMode) {
+        switch (wfcMode) {
+            case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
+                mButtonWfcMode.setSummary(R.string.wfc_mode_wifi_only_summary);
+                break;
+            case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED:
+                mButtonWfcMode.setSummary(R.string.wfc_mode_cellular_preferred_summary);
+                break;
+            case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED:
+                mButtonWfcMode.setSummary(R.string.wfc_mode_wifi_preferred_summary);
+                break;
+            default:
+                // do nothing
+        }
+    }
+
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         switch(requestCode) {