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