From 90e8e4713c7710f765868ed90f69e2424eb19fe5 Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Wed, 25 May 2016 17:12:27 -0700 Subject: [PATCH] Launch E911 address management activity at turning on Wifi Calling Bug: 28404126 Change-Id: Id551d784d151e5f24cfcec96e6cf4b999f39ce0f --- res/values/strings.xml | 2 + res/xml/wifi_calling_settings.xml | 6 ++ .../android/settings/WifiCallingSettings.java | 91 ++++++++++++++++++- 3 files changed, 96 insertions(+), 3 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 63cdcb66339..2cff1981804 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1983,6 +1983,8 @@ When Wi-Fi calling is on, your phone can route calls via Wi-Fi networks or your carrier\u2019s network, depending on your preference and which signal is stronger. Before turning on this feature, check with your carrier regarding fees and other details. + Update Emergency Address + diff --git a/res/xml/wifi_calling_settings.xml b/res/xml/wifi_calling_settings.xml index ca4e560e422..57e9efba5cd 100644 --- a/res/xml/wifi_calling_settings.xml +++ b/res/xml/wifi_calling_settings.xml @@ -26,4 +26,10 @@ android:entryValues="@array/wifi_calling_mode_values" android:dialogTitle="@string/wifi_calling_mode_dialog_title" /> + + + diff --git a/src/com/android/settings/WifiCallingSettings.java b/src/com/android/settings/WifiCallingSettings.java index 36022958d00..0d8202d0ccd 100644 --- a/src/com/android/settings/WifiCallingSettings.java +++ b/src/com/android/settings/WifiCallingSettings.java @@ -19,6 +19,7 @@ package com.android.settings; import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -26,10 +27,12 @@ import android.os.Bundle; import android.os.PersistableBundle; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; +import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.PreferenceScreen; import android.telephony.CarrierConfigManager; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.Log; import android.widget.Switch; import android.widget.TextView; @@ -53,6 +56,9 @@ public class WifiCallingSettings extends SettingsPreferenceFragment //String keys for preference lookup private static final String BUTTON_WFC_MODE = "wifi_calling_mode"; + private static final String PREFERENCE_EMERGENCY_ADDRESS = "emergency_address_key"; + + private static final int REQUEST_CHECK_WFC_EMERGENCY_ADDRESS = 1; //UI objects private SwitchBar mSwitchBar; @@ -90,6 +96,22 @@ public class WifiCallingSettings extends SettingsPreferenceFragment } }; + private final OnPreferenceClickListener mUpdateAddressListener = + new OnPreferenceClickListener() { + /* + * Launch carrier emergency address managemnent activity + */ + @Override + public boolean onPreferenceClick(Preference preference) { + final Context context = getActivity(); + Intent carrierAppIntent = getCarrierActivityIntent(context); + if (carrierAppIntent != null) { + startActivity(carrierAppIntent); + } + return true; + } + }; + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -163,6 +185,9 @@ public class WifiCallingSettings extends SettingsPreferenceFragment mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE); mButtonWfcMode.setOnPreferenceChangeListener(this); + Preference mUpdateAddress = (Preference) findPreference(PREFERENCE_EMERGENCY_ADDRESS); + mUpdateAddress.setOnPreferenceClickListener(mUpdateAddressListener); + mIntentFilter = new IntentFilter(); mIntentFilter.addAction(ImsManager.ACTION_IMS_REGISTRATION_ERROR); @@ -239,18 +264,78 @@ public class WifiCallingSettings extends SettingsPreferenceFragment @Override public void onSwitchChanged(Switch switchView, boolean isChecked) { final Context context = getActivity(); + Log.d(TAG, "onSwitchChanged(" + isChecked + ")"); - ImsManager.setWfcSetting(context, isChecked); + if (!isChecked) { + updateWfcMode(context, false); + return; + } + + // Call address management activity before turning on WFC + Intent carrierAppIntent = getCarrierActivityIntent(context); + if (carrierAppIntent != null) { + startActivityForResult(carrierAppIntent, REQUEST_CHECK_WFC_EMERGENCY_ADDRESS); + } else { + updateWfcMode(context, true); + } + } + + /* + * Get the Intent to launch carrier emergency address management activity. + * Return null when no activity found. + */ + private static Intent getCarrierActivityIntent(Context context) { + // Retrive component name from carrirt config + CarrierConfigManager configManager = context.getSystemService(CarrierConfigManager.class); + if (configManager == null) return null; + + PersistableBundle bundle = configManager.getConfig(); + if (bundle == null) return null; + + String carrierApp = bundle.getString( + CarrierConfigManager.KEY_WFC_EMERGENCY_ADDRESS_CARRIER_APP_STRING); + if (TextUtils.isEmpty(carrierApp)) return null; + + ComponentName componentName = ComponentName.unflattenFromString(carrierApp); + if (componentName == null) return null; + + // Build and return intent + Intent intent = new Intent(); + intent.setComponent(componentName); + return intent; + } + + /* + * Turn on/off WFC mode with ImsManager and update UI accordingly + */ + private void updateWfcMode(Context context, boolean wfcEnabled) { + Log.i(TAG, "updateWfcMode(" + wfcEnabled + ")"); + ImsManager.setWfcSetting(context, wfcEnabled); int wfcMode = ImsManager.getWfcMode(context); - updateButtonWfcMode(context, isChecked, wfcMode); - if (isChecked) { + updateButtonWfcMode(context, wfcEnabled, wfcMode); + if (wfcEnabled) { MetricsLogger.action(getActivity(), getMetricsCategory(), wfcMode); } else { MetricsLogger.action(getActivity(), getMetricsCategory(), -1); } } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + final Context context = getActivity(); + + if (requestCode == REQUEST_CHECK_WFC_EMERGENCY_ADDRESS) { + Log.d(TAG, "WFC emergency address activity result = " + resultCode); + + if (resultCode == Activity.RESULT_OK) { + updateWfcMode(context, true); + } + } + } + private void updateButtonWfcMode(Context context, boolean wfcEnabled, int wfcMode) { mButtonWfcMode.setSummary(getWfcModeSummary(context, wfcMode)); mButtonWfcMode.setEnabled(wfcEnabled);