summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMaurice Lam <yukl@google.com>2014-07-18 19:07:09 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-07-17 21:58:28 +0000
commitb3f69cd10435fdf2d799bafdde4949e70c1f84f1 (patch)
treede1a692b965ca2973eedf305ac8b4ec7487f9cfa /src
parent772cf2061685e5c7df4b1ebedd1249243cde6f74 (diff)
parent6a627652cbac48a7d5bea5bc81772f90d7d82af9 (diff)
downloadpackages_apps_Settings-b3f69cd10435fdf2d799bafdde4949e70c1f84f1.zip
packages_apps_Settings-b3f69cd10435fdf2d799bafdde4949e70c1f84f1.tar.gz
packages_apps_Settings-b3f69cd10435fdf2d799bafdde4949e70c1f84f1.tar.bz2
Merge "[WifiSetup] Mechanism for suspending auto finish" into lmp-dev
Diffstat (limited to 'src')
-rw-r--r--src/com/android/settings/wifi/WifiSettings.java21
-rw-r--r--src/com/android/settings/wifi/WifiSettingsForSetupWizard.java95
-rw-r--r--src/com/android/settings/wifi/WifiSetupActivity.java150
3 files changed, 145 insertions, 121 deletions
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 0721248..04fc6ae 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -560,13 +560,11 @@ public class WifiSettings extends RestrictedSettingsFragment
switch (item.getItemId()) {
case MENU_ID_CONNECT: {
if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
- mWifiManager.connect(mSelectedAccessPoint.networkId,
- mConnectListener);
+ connect(mSelectedAccessPoint.networkId);
} else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
/** Bypass dialog for unsecured networks */
mSelectedAccessPoint.generateOpenNetworkConfig();
- mWifiManager.connect(mSelectedAccessPoint.getConfig(),
- mConnectListener);
+ connect(mSelectedAccessPoint.getConfig());
} else {
showDialog(mSelectedAccessPoint, true);
}
@@ -600,7 +598,7 @@ public class WifiSettings extends RestrictedSettingsFragment
savedNetworksExist = true;
getActivity().invalidateOptionsMenu();
}
- mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener);
+ connect(mSelectedAccessPoint.getConfig());
} else {
showDialog(mSelectedAccessPoint, false);
}
@@ -930,8 +928,7 @@ public class WifiSettings extends RestrictedSettingsFragment
if (config == null) {
if (mSelectedAccessPoint != null
&& mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
- mWifiManager.connect(mSelectedAccessPoint.networkId,
- mConnectListener);
+ connect(mSelectedAccessPoint.networkId);
}
} else if (config.networkId != INVALID_NETWORK_ID) {
if (mSelectedAccessPoint != null) {
@@ -941,7 +938,7 @@ public class WifiSettings extends RestrictedSettingsFragment
if (configController.isEdit()) {
mWifiManager.save(config, mSaveListener);
} else {
- mWifiManager.connect(config, mConnectListener);
+ connect(config);
}
}
@@ -969,6 +966,14 @@ public class WifiSettings extends RestrictedSettingsFragment
changeNextButtonState(false);
}
+ protected void connect(final WifiConfiguration config) {
+ mWifiManager.connect(config, mConnectListener);
+ }
+
+ protected void connect(final int networkId) {
+ mWifiManager.connect(networkId, mConnectListener);
+ }
+
/**
* Refreshes acccess points and ask Wifi module to scan networks again.
*/
diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
index ea884e1..b52aaa7 100644
--- a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
+++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
@@ -16,17 +16,10 @@
package com.android.settings.wifi;
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.res.TypedArray;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.wifi.WifiManager;
+import android.net.wifi.WifiConfiguration;
import android.os.Bundle;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -51,40 +44,9 @@ public class WifiSettingsForSetupWizard extends WifiSettings {
private static final String TAG = "WifiSettingsForSetupWizard";
- /* Used in Wifi Setup context */
-
- // this boolean extra specifies whether to auto finish when connection is established
- private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect";
-
// show a text regarding data charges when wifi connection is required during setup wizard
protected static final String EXTRA_SHOW_WIFI_REQUIRED_INFO = "wifi_show_wifi_required_info";
- // should activity finish once we have a connection?
- private boolean mAutoFinishOnConnection;
-
- private final IntentFilter mFilter;
- private final BroadcastReceiver mReceiver;
-
- public WifiSettingsForSetupWizard() {
- super();
-
- mFilter = new IntentFilter();
- mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
-
- mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
- WifiManager.EXTRA_NETWORK_INFO);
- if (mAutoFinishOnConnection && info.isConnected()) {
- Log.d(TAG, "mReceiver.onReceive context=" + context + " intent=" + intent);
- WifiSetupActivity activity = (WifiSetupActivity) getActivity();
- activity.finishOrNext(Activity.RESULT_OK);
- }
- }
- };
- }
-
@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -127,49 +89,12 @@ public class WifiSettingsForSetupWizard extends WifiSettings {
View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS |
View.STATUS_BAR_DISABLE_CLOCK);
- final WifiSetupActivity activity = (WifiSetupActivity) getActivity();
- final Intent intent = activity.getIntent();
-
- // first if we're supposed to finish once we have a connection
- mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
-
- if (mAutoFinishOnConnection) {
- // Hide the next button
- if (hasNextButton()) {
- getNextButton().setVisibility(View.GONE);
- }
-
- /*
- * When entering with a savedInstanceState, we may be returning from a later activity in
- * the setup flow. It's not clear yet if there are other possible circumstances. It's
- * not appropriate to refire our activity results, so we skip that here.
- */
- if (savedInstanceState == null) {
- final ConnectivityManager connectivity = (ConnectivityManager)
- activity.getSystemService(Context.CONNECTIVITY_SERVICE);
- if (connectivity != null &&
- connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
- Log.d(TAG, "onActivityCreated Auto-finishing");
- activity.finishOrNext(Activity.RESULT_OK);
- return;
- }
- }
+ if (hasNextButton()) {
+ getNextButton().setVisibility(View.GONE);
}
}
@Override
- public void onResume() {
- super.onResume();
- getActivity().registerReceiver(mReceiver, mFilter);
- }
-
- @Override
- public void onPause() {
- super.onPause();
- getActivity().unregisterReceiver(mReceiver);
- }
-
- @Override
public void registerForContextMenu(View view) {
// Suppressed during setup wizard
}
@@ -194,4 +119,18 @@ public class WifiSettingsForSetupWizard extends WifiSettings {
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
ta.recycle();
}
+
+ @Override
+ protected void connect(final WifiConfiguration config) {
+ WifiSetupActivity activity = (WifiSetupActivity) getActivity();
+ activity.networkSelected();
+ super.connect(config);
+ }
+
+ @Override
+ protected void connect(final int networkId) {
+ WifiSetupActivity activity = (WifiSetupActivity) getActivity();
+ activity.networkSelected();
+ super.connect(networkId);
+ }
}
diff --git a/src/com/android/settings/wifi/WifiSetupActivity.java b/src/com/android/settings/wifi/WifiSetupActivity.java
index d92e81f..be2c7f1 100644
--- a/src/com/android/settings/wifi/WifiSetupActivity.java
+++ b/src/com/android/settings/wifi/WifiSetupActivity.java
@@ -19,15 +19,15 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.preference.PreferenceFragment;
@@ -45,6 +45,13 @@ public class WifiSetupActivity extends WifiPickerActivity
private static final String EXTRA_ALLOW_SKIP = "allowSkip";
private static final String EXTRA_USE_IMMERSIVE_MODE = "useImmersiveMode";
+ // this boolean extra specifies whether to auto finish when connection is established
+ private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect";
+
+ // Whether auto finish is suspended until user connects to an access point
+ private static final String EXTRA_REQUIRE_USER_NETWORK_SELECTION =
+ "wifi_require_user_network_selection";
+
// Extra containing the resource name of the theme to be used
private static final String EXTRA_THEME = "theme";
private static final String THEME_HOLO = "holo";
@@ -62,6 +69,85 @@ public class WifiSetupActivity extends WifiPickerActivity
private static final String EXTRA_RESULT_CODE = "com.android.setupwizard.ResultCode";
private static final int NEXT_REQUEST = 10000;
+ // Whether we allow skipping without a valid network connection
+ private boolean mAllowSkip = true;
+ // Whether to auto finish when the user selected a network and successfully connected
+ private boolean mAutoFinishOnConnection;
+ // Whether the user connected to a network. This excludes the auto-connecting by the system.
+ private boolean mUserSelectedNetwork;
+ // Whether the device is connected to WiFi
+ private boolean mWifiConnected;
+
+ private SetupWizardNavBar mNavigationBar;
+
+ private final IntentFilter mFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
+ WifiManager.EXTRA_NETWORK_INFO);
+ refreshConnectionState(info.isConnected());
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final Intent intent = getIntent();
+
+ mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
+ mAllowSkip = intent.getBooleanExtra(EXTRA_ALLOW_SKIP, true);
+ // Behave like the user already selected a network if we do not require selection
+ mUserSelectedNetwork = !intent.getBooleanExtra(EXTRA_REQUIRE_USER_NETWORK_SELECTION, false);
+
+ refreshConnectionState();
+ }
+
+ private void refreshConnectionState() {
+ final ConnectivityManager connectivity = (ConnectivityManager)
+ getSystemService(Context.CONNECTIVITY_SERVICE);
+ boolean connected = connectivity != null &&
+ connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected();
+ refreshConnectionState(connected);
+ }
+
+ private void refreshConnectionState(boolean connected) {
+ mWifiConnected = connected;
+ if (connected) {
+ if (mAutoFinishOnConnection && mUserSelectedNetwork) {
+ Log.d(TAG, "Auto-finishing with connection");
+ finishOrNext(Activity.RESULT_OK);
+ }
+ if (mNavigationBar != null) {
+ mNavigationBar.getNextButton().setText(R.string.setup_wizard_next_button_label);
+ mNavigationBar.getNextButton().setEnabled(true);
+ }
+ } else {
+ if (mNavigationBar != null) {
+ mNavigationBar.getNextButton().setText(R.string.skip_label);
+ mNavigationBar.getNextButton().setEnabled(mAllowSkip);
+ }
+ }
+ }
+
+ /* package */ void networkSelected() {
+ Log.d(TAG, "Network selected by user");
+ mUserSelectedNetwork = true;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ registerReceiver(mReceiver, mFilter);
+ }
+
+ @Override
+ public void onPause() {
+ unregisterReceiver(mReceiver);
+ super.onPause();
+ }
+
@Override
protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
String themeName = getIntent().getStringExtra(EXTRA_THEME);
@@ -86,22 +172,12 @@ public class WifiSetupActivity extends WifiPickerActivity
}
@Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_CANCELED) {
- // Before returning to the settings panel, forget any current access point so it will
- // not attempt to automatically reconnect and advance
- // FIXME: when coming back, it would be better to keep the current connection and
- // override the auto-advance feature
- final WifiManager wifiManager = (WifiManager)(getSystemService(Context.WIFI_SERVICE));
- if (wifiManager != null) {
- final WifiInfo info = wifiManager.getConnectionInfo();
- if (info != null) {
- int netId = info.getNetworkId();
- if (netId != WifiConfiguration.INVALID_NETWORK_ID) {
- wifiManager.forget(netId, null);
- }
- }
- }
+ Log.d(TAG, "Back into WifiSetupActivity. Requiring user selection.");
+ // Require a user selection before we auto advance again. Or the user can press the
+ // next button if there is a valid WiFi connection.
+ mUserSelectedNetwork = false;
}
super.onActivityResult(requestCode, resultCode, data);
}
@@ -142,6 +218,7 @@ public class WifiSetupActivity extends WifiPickerActivity
@Override
public void onNavigationBarCreated(final SetupWizardNavBar bar) {
+ mNavigationBar = bar;
final boolean useImmersiveMode =
getIntent().getBooleanExtra(EXTRA_USE_IMMERSIVE_MODE, false);
bar.setUseImmersiveMode(useImmersiveMode);
@@ -149,11 +226,7 @@ public class WifiSetupActivity extends WifiPickerActivity
getWindow().setNavigationBarColor(Color.TRANSPARENT);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
- bar.getNextButton().setText(R.string.skip_label);
-
- if (!getIntent().getBooleanExtra(EXTRA_ALLOW_SKIP, true)) {
- bar.getNextButton().setEnabled(false);
- }
+ refreshConnectionState();
}
@Override
@@ -163,22 +236,29 @@ public class WifiSetupActivity extends WifiPickerActivity
@Override
public void onNavigateNext() {
- boolean isConnected = false;
+ if (mWifiConnected) {
+ finishOrNext(RESULT_OK);
+ } else {
+ // Warn of possible data charges if there is a network connection, or lack of updates
+ // if there is none.
+ final int message = isNetworkConnected() ? R.string.wifi_skipped_message :
+ R.string.wifi_and_mobile_skipped_message;
+ WifiSkipDialog.newInstance(message).show(getFragmentManager(), "dialog");
+ }
+ }
+
+ /**
+ * @return True if there is a valid network connection, whether it is via WiFi, mobile data or
+ * other means.
+ */
+ private boolean isNetworkConnected() {
final ConnectivityManager connectivity = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
- if (connectivity != null) {
- final NetworkInfo info = connectivity.getActiveNetworkInfo();
- isConnected = (info != null) && info.isConnected();
- }
- if (isConnected) {
- // Warn of possible data charges
- WifiSkipDialog.newInstance(R.string.wifi_skipped_message)
- .show(getFragmentManager(), "dialog");
- } else {
- // Warn of lack of updates
- WifiSkipDialog.newInstance(R.string.wifi_and_mobile_skipped_message)
- .show(getFragmentManager(), "dialog");
+ if (connectivity == null) {
+ return false;
}
+ final NetworkInfo info = connectivity.getActiveNetworkInfo();
+ return info != null && info.isConnected();
}
public static class WifiSkipDialog extends DialogFragment {