1b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb/* 2b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * Copyright (C) 2012 The Android Open Source Project 3b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * 4b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 5b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * you may not use this file except in compliance with the License. 6b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * You may obtain a copy of the License at 7b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * 8b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * http://www.apache.org/licenses/LICENSE-2.0 9b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * 10b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * Unless required by applicable law or agreed to in writing, software 11b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 12b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * See the License for the specific language governing permissions and 14b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb * limitations under the License. 15b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb */ 16b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolbpackage com.android.settings.wifi; 17b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb 186776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.app.Activity; 196776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.app.AlertDialog; 206776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.app.Dialog; 216776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.app.DialogFragment; 226a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lamimport android.content.BroadcastReceiver; 236776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.content.Context; 246776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.content.DialogInterface; 256776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.content.Intent; 266a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lamimport android.content.IntentFilter; 276776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.content.res.Resources; 286776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.graphics.Color; 296776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.net.ConnectivityManager; 306776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.net.NetworkInfo; 316776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.net.wifi.WifiManager; 326776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.os.Bundle; 336776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.preference.PreferenceFragment; 346776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport android.util.Log; 356776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 36b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolbimport com.android.settings.ButtonBarHandler; 376776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport com.android.settings.R; 386776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport com.android.setupwizard.navigationbar.SetupWizardNavBar; 396776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lamimport com.android.setupwizard.navigationbar.SetupWizardNavBar.NavigationBarListener; 40b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb 416776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lampublic class WifiSetupActivity extends WifiPickerActivity 426776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam implements ButtonBarHandler, NavigationBarListener { 436776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String TAG = "WifiSetupActivity"; 44e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner 456776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String EXTRA_ALLOW_SKIP = "allowSkip"; 466776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String EXTRA_USE_IMMERSIVE_MODE = "useImmersiveMode"; 476776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 486a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // this boolean extra specifies whether to auto finish when connection is established 496a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect"; 506a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 516a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // Whether auto finish is suspended until user connects to an access point 526a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private static final String EXTRA_REQUIRE_USER_NETWORK_SELECTION = 536a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam "wifi_require_user_network_selection"; 546a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 55e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner // Extra containing the resource name of the theme to be used 56e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner private static final String EXTRA_THEME = "theme"; 57e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner private static final String THEME_HOLO = "holo"; 58e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner private static final String THEME_HOLO_LIGHT = "holo_light"; 596776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String THEME_MATERIAL = "material"; 606776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String THEME_MATERIAL_LIGHT = "material_light"; 616776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 62569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam // Key for whether the user selected network in saved instance state bundle 63569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam private static final String PARAM_USER_SELECTED_NETWORK = "userSelectedNetwork"; 64569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam 656776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam // Activity result when pressing the Skip button 666776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final int RESULT_SKIP = Activity.RESULT_FIRST_USER; 67e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner 686776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam // From WizardManager (must match constants maintained there) 696776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String ACTION_NEXT = "com.android.wizard.NEXT"; 706776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String EXTRA_SCRIPT_URI = "scriptUri"; 716776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String EXTRA_ACTION_ID = "actionId"; 726776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final String EXTRA_RESULT_CODE = "com.android.setupwizard.ResultCode"; 736776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private static final int NEXT_REQUEST = 10000; 74b5f006bf971e9a3390cc8b9a2fb4ee2861f6dbefMichael Kolb 756a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // Whether we allow skipping without a valid network connection 766a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private boolean mAllowSkip = true; 776a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // Whether to auto finish when the user selected a network and successfully connected 786a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private boolean mAutoFinishOnConnection; 796a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // Whether the user connected to a network. This excludes the auto-connecting by the system. 806a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private boolean mUserSelectedNetwork; 816a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // Whether the device is connected to WiFi 826a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private boolean mWifiConnected; 836a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 846a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private SetupWizardNavBar mNavigationBar; 856a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 866a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private final IntentFilter mFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION); 876a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 886a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam @Override 896a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam public void onReceive(Context context, Intent intent) { 90610fdf334338ad68e22e0c23224ed6bcdad9bac5Maurice Lam // Refresh the connection state with the latest connection info. Use the connection info 91610fdf334338ad68e22e0c23224ed6bcdad9bac5Maurice Lam // from ConnectivityManager instead of the one attached in the intent to make sure 92610fdf334338ad68e22e0c23224ed6bcdad9bac5Maurice Lam // we have the most up-to-date connection state. b/17511772 93610fdf334338ad68e22e0c23224ed6bcdad9bac5Maurice Lam refreshConnectionState(); 946a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 956a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam }; 966a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 976a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam @Override 986a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam protected void onCreate(Bundle savedInstanceState) { 996a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam super.onCreate(savedInstanceState); 1006a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 1016a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam final Intent intent = getIntent(); 1026a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 1036a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false); 1046a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mAllowSkip = intent.getBooleanExtra(EXTRA_ALLOW_SKIP, true); 1056a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // Behave like the user already selected a network if we do not require selection 1066a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mUserSelectedNetwork = !intent.getBooleanExtra(EXTRA_REQUIRE_USER_NETWORK_SELECTION, false); 107569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam } 1086a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 109569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam @Override 110569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam protected void onSaveInstanceState(Bundle outState) { 111569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam super.onSaveInstanceState(outState); 112569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam outState.putBoolean(PARAM_USER_SELECTED_NETWORK, mUserSelectedNetwork); 113569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam } 114569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam 115569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam @Override 116569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam protected void onRestoreInstanceState(Bundle savedInstanceState) { 117569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam super.onRestoreInstanceState(savedInstanceState); 118569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam mUserSelectedNetwork = savedInstanceState.getBoolean(PARAM_USER_SELECTED_NETWORK, true); 1196a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1206a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 1216a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private void refreshConnectionState() { 1226a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam final ConnectivityManager connectivity = (ConnectivityManager) 1236a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam getSystemService(Context.CONNECTIVITY_SERVICE); 1246a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam boolean connected = connectivity != null && 1256a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected(); 1266a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam refreshConnectionState(connected); 1276a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1286a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 1296a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private void refreshConnectionState(boolean connected) { 1306a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mWifiConnected = connected; 1316a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam if (connected) { 1326a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam if (mAutoFinishOnConnection && mUserSelectedNetwork) { 1336a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam Log.d(TAG, "Auto-finishing with connection"); 1346a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam finishOrNext(Activity.RESULT_OK); 135569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam // Require a user selection before auto-finishing next time we are here. The user 136569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam // can either connect to a different network or press "next" to proceed. 137569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam mUserSelectedNetwork = false; 1386a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1396a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam if (mNavigationBar != null) { 1406a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mNavigationBar.getNextButton().setText(R.string.setup_wizard_next_button_label); 1416a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mNavigationBar.getNextButton().setEnabled(true); 1426a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1436a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } else { 1446a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam if (mNavigationBar != null) { 1456a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mNavigationBar.getNextButton().setText(R.string.skip_label); 1466a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mNavigationBar.getNextButton().setEnabled(mAllowSkip); 1476a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1486a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1496a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1506a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 1516a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam /* package */ void networkSelected() { 1526a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam Log.d(TAG, "Network selected by user"); 1536a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mUserSelectedNetwork = true; 1546a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1556a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 1566a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam @Override 1576a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam public void onResume() { 1586a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam super.onResume(); 1596a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam registerReceiver(mReceiver, mFilter); 160569aec7b4d6cc9e5268a059d9f18f271afadb706Maurice Lam refreshConnectionState(); 1616a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1626a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 1636a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam @Override 1646a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam public void onPause() { 1656a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam unregisterReceiver(mReceiver); 1666a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam super.onPause(); 1676a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 1686a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 169e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner @Override 170e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) { 171e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner String themeName = getIntent().getStringExtra(EXTRA_THEME); 1726776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam if (THEME_HOLO_LIGHT.equalsIgnoreCase(themeName) || 1736776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam THEME_MATERIAL_LIGHT.equalsIgnoreCase(themeName)) { 1746776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam resid = R.style.SetupWizardWifiTheme_Light; 1756776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } else if (THEME_HOLO.equalsIgnoreCase(themeName) || 1766776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam THEME_MATERIAL.equalsIgnoreCase(themeName)) { 1776776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam resid = R.style.SetupWizardWifiTheme; 178e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner } 179e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner super.onApplyThemeResource(theme, resid, first); 180e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner } 181d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner 182d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner @Override 1836776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam protected boolean isValidFragment(String fragmentName) { 1846776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam return WifiSettingsForSetupWizard.class.getName().equals(fragmentName); 1856776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 1866776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 1876776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam @Override 1886776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam /* package */ Class<? extends PreferenceFragment> getWifiSettingsClass() { 189d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner return WifiSettingsForSetupWizard.class; 190d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner } 1916776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 1926776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam /** 1936776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam * Complete this activity and return the results to the caller. If using WizardManager, this 1946776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam * will invoke the next scripted action; otherwise, we simply finish. 1956776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam */ 1966776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public void finishOrNext(int resultCode) { 1976776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam Log.d(TAG, "finishOrNext resultCode=" + resultCode 1986776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam + " isUsingWizardManager=" + isUsingWizardManager()); 1996776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam if (isUsingWizardManager()) { 2006776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam sendResultsToSetupWizard(resultCode); 2016776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } else { 2026776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam setResult(resultCode); 2036776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam finish(); 2046776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2056776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2066776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 2076776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private boolean isUsingWizardManager() { 2086776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam return getIntent().hasExtra(EXTRA_SCRIPT_URI); 2096776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2106776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 2116776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam /** 2126776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam * Send the results of this activity to WizardManager, which will then send out the next 2136776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam * scripted activity. WizardManager does not actually return an activity result, but if we 2146776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam * invoke WizardManager without requesting a result, the framework will choose not to issue a 2156776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam * call to onActivityResult with RESULT_CANCELED when navigating backward. 2166776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam */ 2176776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam private void sendResultsToSetupWizard(int resultCode) { 2186776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam final Intent intent = getIntent(); 2196776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam final Intent nextIntent = new Intent(ACTION_NEXT); 2206776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam nextIntent.putExtra(EXTRA_SCRIPT_URI, intent.getStringExtra(EXTRA_SCRIPT_URI)); 2216776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam nextIntent.putExtra(EXTRA_ACTION_ID, intent.getStringExtra(EXTRA_ACTION_ID)); 2227a77a8b2a43ed3a7a8ba3cd2623e4dfdbdcf6e23Maurice Lam nextIntent.putExtra(EXTRA_THEME, intent.getStringExtra(EXTRA_THEME)); 2236776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam nextIntent.putExtra(EXTRA_RESULT_CODE, resultCode); 2246776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam startActivityForResult(nextIntent, NEXT_REQUEST); 2256776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2266776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 2276776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam @Override 2286776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public void onNavigationBarCreated(final SetupWizardNavBar bar) { 2296a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam mNavigationBar = bar; 2306776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam final boolean useImmersiveMode = 2316776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam getIntent().getBooleanExtra(EXTRA_USE_IMMERSIVE_MODE, false); 2326776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam bar.setUseImmersiveMode(useImmersiveMode); 2336776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam if (useImmersiveMode) { 2346776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam getWindow().setNavigationBarColor(Color.TRANSPARENT); 2356776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam getWindow().setStatusBarColor(Color.TRANSPARENT); 2366776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2376776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2386776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 2396776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam @Override 2406776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public void onNavigateBack() { 2416776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam onBackPressed(); 2426776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2436776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 2446776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam @Override 2456776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public void onNavigateNext() { 2466a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam if (mWifiConnected) { 2476a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam finishOrNext(RESULT_OK); 2486a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } else { 2496a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // Warn of possible data charges if there is a network connection, or lack of updates 2506a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam // if there is none. 2516a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam final int message = isNetworkConnected() ? R.string.wifi_skipped_message : 2526a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam R.string.wifi_and_mobile_skipped_message; 2536a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam WifiSkipDialog.newInstance(message).show(getFragmentManager(), "dialog"); 2546a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 2556a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam } 2566a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam 2576a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam /** 2586a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam * @return True if there is a valid network connection, whether it is via WiFi, mobile data or 2596a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam * other means. 2606a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam */ 2616a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam private boolean isNetworkConnected() { 2626776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam final ConnectivityManager connectivity = (ConnectivityManager) 2636776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam getSystemService(Context.CONNECTIVITY_SERVICE); 2646a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam if (connectivity == null) { 2656a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam return false; 2666776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2676a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam final NetworkInfo info = connectivity.getActiveNetworkInfo(); 2686a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam return info != null && info.isConnected(); 2696776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2706776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 2713c9ca35ebc238b5aff028a1270fe84beb120bc56Maurice Lam public static class WifiSkipDialog extends DialogFragment { 2726776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public static WifiSkipDialog newInstance(int messageRes) { 2736776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam final Bundle args = new Bundle(); 2746776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam args.putInt("messageRes", messageRes); 2756776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam final WifiSkipDialog dialog = new WifiSkipDialog(); 2766776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam dialog.setArguments(args); 2776776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam return dialog; 2786776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2796776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 2806776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public WifiSkipDialog() { 2816776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam // no-arg constructor for fragment 2826776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2836776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam 2846776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam @Override 2856776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public Dialog onCreateDialog(Bundle savedInstanceState) { 2866776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam int messageRes = getArguments().getInt("messageRes"); 2876776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam return new AlertDialog.Builder(getActivity()) 2886776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam .setMessage(messageRes) 2896776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam .setCancelable(false) 2906776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam .setNegativeButton(R.string.wifi_skip_anyway, 2916776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam new DialogInterface.OnClickListener() { 2926776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam @Override 2936776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public void onClick(DialogInterface dialog, int id) { 2946776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam WifiSetupActivity activity = (WifiSetupActivity) getActivity(); 2956776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam activity.finishOrNext(RESULT_SKIP); 2966776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 2976776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam }) 2986776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam .setPositiveButton(R.string.wifi_dont_skip, 2996776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam new DialogInterface.OnClickListener() { 3006776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam @Override 3016776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam public void onClick(DialogInterface dialog, int id) { 3026776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 3036776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam }) 3046776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam .create(); 3056776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 3066776c67ac12161b3e5e25c8848b46656ea91be1dMaurice Lam } 307e8a80b5db3418ee9824e457420c3536f0eb71139Russell Brenner} 308