Save and restore wifi dialogs on screen rotation.
Bug: 4981732 Change-Id: If065f9af93af405d954fde044351e473d62ea91b
This commit is contained in:
@@ -25,6 +25,7 @@ import android.net.wifi.WifiConfiguration;
|
|||||||
import android.net.wifi.WifiConfiguration.KeyMgmt;
|
import android.net.wifi.WifiConfiguration.KeyMgmt;
|
||||||
import android.net.wifi.WifiInfo;
|
import android.net.wifi.WifiInfo;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
@@ -32,6 +33,12 @@ import android.widget.ImageView;
|
|||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
|
||||||
class AccessPoint extends Preference {
|
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_SECURED = {R.attr.state_encrypted};
|
||||||
private static final int[] STATE_NONE = {};
|
private static final int[] STATE_NONE = {};
|
||||||
|
|
||||||
@@ -41,13 +48,15 @@ class AccessPoint extends Preference {
|
|||||||
static final int SECURITY_PSK = 2;
|
static final int SECURITY_PSK = 2;
|
||||||
static final int SECURITY_EAP = 3;
|
static final int SECURITY_EAP = 3;
|
||||||
|
|
||||||
final String ssid;
|
String ssid;
|
||||||
final String bssid;
|
String bssid;
|
||||||
final int security;
|
int security;
|
||||||
final int networkId;
|
int networkId;
|
||||||
boolean wpsAvailable = false;
|
boolean wpsAvailable = false;
|
||||||
|
|
||||||
private WifiConfiguration mConfig;
|
private WifiConfiguration mConfig;
|
||||||
|
/*package*/ScanResult mScanResult;
|
||||||
|
|
||||||
private int mRssi;
|
private int mRssi;
|
||||||
private WifiInfo mInfo;
|
private WifiInfo mInfo;
|
||||||
private DetailedState mState;
|
private DetailedState mState;
|
||||||
@@ -78,24 +87,60 @@ class AccessPoint extends Preference {
|
|||||||
AccessPoint(Context context, WifiConfiguration config) {
|
AccessPoint(Context context, WifiConfiguration config) {
|
||||||
super(context);
|
super(context);
|
||||||
setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
|
setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
|
||||||
ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID));
|
loadConfig(config);
|
||||||
bssid = config.BSSID;
|
|
||||||
security = getSecurity(config);
|
|
||||||
networkId = config.networkId;
|
|
||||||
mConfig = config;
|
|
||||||
mRssi = Integer.MAX_VALUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessPoint(Context context, ScanResult result) {
|
AccessPoint(Context context, ScanResult result) {
|
||||||
super(context);
|
super(context);
|
||||||
setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
|
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;
|
ssid = result.SSID;
|
||||||
bssid = result.BSSID;
|
bssid = result.BSSID;
|
||||||
security = getSecurity(result);
|
security = getSecurity(result);
|
||||||
wpsAvailable = security != SECURITY_EAP &&
|
wpsAvailable = security != SECURITY_EAP && result.capabilities.contains("WPS");
|
||||||
result.capabilities.contains("WPS");
|
|
||||||
networkId = -1;
|
networkId = -1;
|
||||||
mRssi = result.level;
|
mRssi = result.level;
|
||||||
|
mScanResult = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -21,6 +21,7 @@ import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
|
|||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
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_FORGET = Menu.FIRST + 4;
|
||||||
private static final int MENU_ID_MODIFY = Menu.FIRST + 5;
|
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 IntentFilter mFilter;
|
||||||
private final BroadcastReceiver mReceiver;
|
private final BroadcastReceiver mReceiver;
|
||||||
private final Scanner mScanner;
|
private final Scanner mScanner;
|
||||||
@@ -119,6 +126,11 @@ public class WifiSettings extends SettingsPreferenceFragment
|
|||||||
private boolean mEnableNextOnConnection;
|
private boolean mEnableNextOnConnection;
|
||||||
private boolean mInXlSetupWizard;
|
private boolean mInXlSetupWizard;
|
||||||
|
|
||||||
|
// Save the dialog details
|
||||||
|
private boolean mDlgEdit;
|
||||||
|
private AccessPoint mDlgAccessPoint;
|
||||||
|
private Bundle mAccessPointSavedState;
|
||||||
|
|
||||||
/* End of "used in Wifi Setup context" */
|
/* End of "used in Wifi Setup context" */
|
||||||
|
|
||||||
public WifiSettings() {
|
public WifiSettings() {
|
||||||
@@ -165,6 +177,11 @@ public class WifiSettings extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
|
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
|
||||||
mWifiManager.asyncConnect(getActivity(), new WifiServiceHandler());
|
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 Activity activity = getActivity();
|
||||||
final Intent intent = activity.getIntent();
|
final Intent intent = activity.getIntent();
|
||||||
@@ -245,10 +262,6 @@ public class WifiSettings extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
getActivity().unregisterReceiver(mReceiver);
|
getActivity().unregisterReceiver(mReceiver);
|
||||||
mScanner.pause();
|
mScanner.pause();
|
||||||
if (mDialog != null) {
|
|
||||||
mDialog.dismiss();
|
|
||||||
mDialog = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -270,6 +283,21 @@ public class WifiSettings extends SettingsPreferenceFragment
|
|||||||
super.onCreateOptionsMenu(menu, inflater);
|
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
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
@@ -380,10 +408,31 @@ public class WifiSettings extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
private void showDialog(AccessPoint accessPoint, boolean edit) {
|
private void showDialog(AccessPoint accessPoint, boolean edit) {
|
||||||
if (mDialog != null) {
|
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) {
|
private boolean requireKeyStore(WifiConfiguration config) {
|
||||||
|
Reference in New Issue
Block a user