Merge "Save and restore wifi dialogs on screen rotation."

This commit is contained in:
Mike Cleron
2011-08-04 15:30:57 -07:00
committed by Android (Google) Code Review
2 changed files with 113 additions and 19 deletions

View File

@@ -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

View File

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