diff options
author | Maurice Lam <yukl@google.com> | 2014-07-18 19:07:09 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-07-17 21:58:28 +0000 |
commit | b3f69cd10435fdf2d799bafdde4949e70c1f84f1 (patch) | |
tree | de1a692b965ca2973eedf305ac8b4ec7487f9cfa /src | |
parent | 772cf2061685e5c7df4b1ebedd1249243cde6f74 (diff) | |
parent | 6a627652cbac48a7d5bea5bc81772f90d7d82af9 (diff) | |
download | packages_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.java | 21 | ||||
-rw-r--r-- | src/com/android/settings/wifi/WifiSettingsForSetupWizard.java | 95 | ||||
-rw-r--r-- | src/com/android/settings/wifi/WifiSetupActivity.java | 150 |
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 { |