From 3d13110d40b972a44c80558e0179323f9b330b2f Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Wed, 3 Aug 2011 15:06:10 -0700 Subject: [PATCH] Save and restore wifi dialogs on screen rotation. Bug: 4981732 Change-Id: If065f9af93af405d954fde044351e473d62ea91b --- .../android/settings/wifi/AccessPoint.java | 69 +++++++++++++++---- .../android/settings/wifi/WifiSettings.java | 63 +++++++++++++++-- 2 files changed, 113 insertions(+), 19 deletions(-) diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java index 774ac58330c..818174641f1 100644 --- a/src/com/android/settings/wifi/AccessPoint.java +++ b/src/com/android/settings/wifi/AccessPoint.java @@ -25,6 +25,7 @@ import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration.KeyMgmt; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.os.Bundle; import android.preference.Preference; import android.view.View; import android.widget.ImageView; @@ -32,6 +33,12 @@ import android.widget.ImageView; import java.util.Comparator; class AccessPoint extends Preference { + + private static final String KEY_DETAILEDSTATE = "key_detailedstate"; + private static final String KEY_WIFIINFO = "key_wifiinfo"; + private static final String KEY_SCANRESULT = "key_scanresult"; + private static final String KEY_CONFIG = "key_config"; + private static final int[] STATE_SECURED = {R.attr.state_encrypted}; private static final int[] STATE_NONE = {}; @@ -41,13 +48,15 @@ class AccessPoint extends Preference { static final int SECURITY_PSK = 2; static final int SECURITY_EAP = 3; - final String ssid; - final String bssid; - final int security; - final int networkId; + String ssid; + String bssid; + int security; + int networkId; boolean wpsAvailable = false; private WifiConfiguration mConfig; + /*package*/ScanResult mScanResult; + private int mRssi; private WifiInfo mInfo; private DetailedState mState; @@ -78,24 +87,60 @@ class AccessPoint extends Preference { AccessPoint(Context context, WifiConfiguration config) { super(context); setWidgetLayoutResource(R.layout.preference_widget_wifi_signal); - ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID)); - bssid = config.BSSID; - security = getSecurity(config); - networkId = config.networkId; - mConfig = config; - mRssi = Integer.MAX_VALUE; + loadConfig(config); } AccessPoint(Context context, ScanResult result) { super(context); setWidgetLayoutResource(R.layout.preference_widget_wifi_signal); + loadResult(result); + } + + AccessPoint(Context context, Bundle savedState) { + super(context); + setWidgetLayoutResource(R.layout.preference_widget_wifi_signal); + + mConfig = savedState.getParcelable(KEY_CONFIG); + if (mConfig != null) { + loadConfig(mConfig); + } + mScanResult = (ScanResult) savedState.getParcelable(KEY_SCANRESULT); + if (mScanResult != null) { + loadResult(mScanResult); + } + mInfo = (WifiInfo) savedState.getParcelable(KEY_WIFIINFO); + if (savedState.containsKey(KEY_DETAILEDSTATE)) { + mState = DetailedState.valueOf(savedState.getString(KEY_DETAILEDSTATE)); + } + update(mInfo, mState); + } + + public void saveWifiState(Bundle savedState) { + savedState.putParcelable(KEY_CONFIG, mConfig); + savedState.putParcelable(KEY_SCANRESULT, mScanResult); + savedState.putParcelable(KEY_WIFIINFO, mInfo); + if (mState != null) { + savedState.putString(KEY_DETAILEDSTATE, mState.toString()); + } + } + + private void loadConfig(WifiConfiguration config) { + ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID)); + bssid = config.BSSID; + security = getSecurity(config); + networkId = config.networkId; + mRssi = Integer.MAX_VALUE; + mConfig = config; + } + + private void loadResult(ScanResult result) { ssid = result.SSID; bssid = result.BSSID; security = getSecurity(result); - wpsAvailable = security != SECURITY_EAP && - result.capabilities.contains("WPS"); + wpsAvailable = security != SECURITY_EAP && result.capabilities.contains("WPS"); networkId = -1; mRssi = result.level; + mScanResult = result; } @Override diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index af8398472ae..ef5e96afbfe 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -21,6 +21,7 @@ import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; +import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -89,6 +90,12 @@ public class WifiSettings extends SettingsPreferenceFragment private static final int MENU_ID_FORGET = Menu.FIRST + 4; private static final int MENU_ID_MODIFY = Menu.FIRST + 5; + private static final int WIFI_DIALOG_ID = 1; + + // Instance state keys + private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode"; + private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; + private final IntentFilter mFilter; private final BroadcastReceiver mReceiver; private final Scanner mScanner; @@ -119,6 +126,11 @@ public class WifiSettings extends SettingsPreferenceFragment private boolean mEnableNextOnConnection; private boolean mInXlSetupWizard; + // Save the dialog details + private boolean mDlgEdit; + private AccessPoint mDlgAccessPoint; + private Bundle mAccessPointSavedState; + /* End of "used in Wifi Setup context" */ public WifiSettings() { @@ -165,6 +177,11 @@ public class WifiSettings extends SettingsPreferenceFragment mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); mWifiManager.asyncConnect(getActivity(), new WifiServiceHandler()); + if (savedInstanceState != null + && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) { + mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE); + mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE); + } final Activity activity = getActivity(); final Intent intent = activity.getIntent(); @@ -245,10 +262,6 @@ public class WifiSettings extends SettingsPreferenceFragment } getActivity().unregisterReceiver(mReceiver); mScanner.pause(); - if (mDialog != null) { - mDialog.dismiss(); - mDialog = null; - } } @Override @@ -270,6 +283,21 @@ public class WifiSettings extends SettingsPreferenceFragment super.onCreateOptionsMenu(menu, inflater); } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + // If the dialog is showing, save its state. + if (mDialog != null && mDialog.isShowing()) { + outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit); + if (mDlgAccessPoint != null) { + mAccessPointSavedState = new Bundle(); + mDlgAccessPoint.saveWifiState(mAccessPointSavedState); + outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); + } + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -380,10 +408,31 @@ public class WifiSettings extends SettingsPreferenceFragment private void showDialog(AccessPoint accessPoint, boolean edit) { if (mDialog != null) { - mDialog.dismiss(); + removeDialog(WIFI_DIALOG_ID); + mDialog = null; } - mDialog = new WifiDialog(getActivity(), this, accessPoint, edit); - mDialog.show(); + + // Save the access point and edit mode + mDlgAccessPoint = accessPoint; + mDlgEdit = edit; + + showDialog(WIFI_DIALOG_ID); + } + + @Override + public Dialog onCreateDialog(int dialogId) { + AccessPoint ap = mDlgAccessPoint; // For manual launch + if (ap == null) { // For re-launch from saved state + if (mAccessPointSavedState != null) { + ap = new AccessPoint(getActivity(), mAccessPointSavedState); + // For repeated orientation changes + mDlgAccessPoint = ap; + } + } + // If it's still null, fine, it's for Add Network + mSelectedAccessPoint = ap; + mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit); + return mDialog; } private boolean requireKeyStore(WifiConfiguration config) {