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