WifiSettings.java revision 58b0291fe6e6e47bf3d7457d8cf2648b8ce4a1ae
148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh/*
248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Copyright (C) 2010 The Android Open Source Project
348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh *
448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License");
548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * you may not use this file except in compliance with the License.
648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * You may obtain a copy of the License at
748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh *
848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh *      http://www.apache.org/licenses/LICENSE-2.0
948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh *
1048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software
1148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS,
1248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * See the License for the specific language governing permissions and
1448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * limitations under the License.
1548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh */
1648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
1748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehpackage com.android.settings.wifi;
1848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
195d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawaimport static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
205d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa
215cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawaimport com.android.settings.ProgressCategoryBase;
225cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawaimport com.android.settings.R;
235cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawaimport com.android.settings.SettingsPreferenceFragment;
245cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawa
259c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.app.Activity;
26e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriffimport android.app.AlertDialog;
2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver;
2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context;
2948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface;
3048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent;
3148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter;
3279470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager;
3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo;
34af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState;
3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult;
3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState;
3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration;
3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration.KeyMgmt;
3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo;
4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager;
4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle;
4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler;
4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message;
4448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.CheckBoxPreference;
4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference;
4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen;
4748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.provider.Settings.Secure;
4848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials;
4948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore;
5048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu;
5148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu.ContextMenuInfo;
5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu;
539c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater;
5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem;
5548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View;
5648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.widget.AdapterView.AdapterContextMenuInfo;
5748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.widget.Toast;
5848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
59d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection;
6048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List;
61d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.TreeSet;
6248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
63d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
64d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * This currently provides three types of UI.
65d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
66d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Two are for phones with relatively small screens: "for SetupWizard" and "for usual Settings".
67d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Users just need to launch WifiSettings Activity as usual. The request will be appropriately
68d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * handled by ActivityManager, and they will have appropriate look-and-feel with this fragment.
69d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
70d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Third type is for Setup Wizard with X-Large, landscape UI. Users need to launch
71d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * {@link WifiSettingsForSetupWizardXL} Activity, which contains this fragment but also has
72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * other decorations specific to that screen.
73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
749c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment
759c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        implements DialogInterface.OnClickListener {
7648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_SCAN = Menu.FIRST;
7748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_ADVANCED = Menu.FIRST + 1;
7848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_CONNECT = Menu.FIRST + 2;
7948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_FORGET = Menu.FIRST + 3;
8048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_MODIFY = Menu.FIRST + 4;
8148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
8248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final IntentFilter mFilter;
8348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final BroadcastReceiver mReceiver;
8448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final Scanner mScanner;
8548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
8648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiManager mWifiManager;
8748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiEnabler mWifiEnabler;
8848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private CheckBoxPreference mNotifyOpenNetworks;
89d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private ProgressCategoryBase mAccessPoints;
9048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private Preference mAddNetwork;
91d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    // An access point being editted is stored here.
92d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private AccessPoint mSelectedAccessPoint;
931dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa    private boolean mEdit;
9448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
95af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private DetailedState mLastState;
9648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiInfo mLastInfo;
9748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
98b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff    private int mKeyStoreNetworkId = INVALID_NETWORK_ID;
9948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
10058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiDialog mDialog;
101d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
10258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* Used in Wifi Setup context */
103d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
10458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // this boolean extra specifies whether to disable the Next button when not connected
10558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect";
106d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
10758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // Indicates that this fragment is used as a part of Setup Wizard with XL screen settings.
10858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // This fragment should show information which has been shown as Dialog in combined UI
10958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // inside this fragment.
11058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ static final String IN_XL_SETUP_WIZARD = "in_setup_wizard";
11158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
11258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // should Next button only be enabled when we have a connection?
11358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mEnableNextOnConnection;
11458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mInXlSetupWizard;
11586eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
11658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* End of "used in Wifi Setup context" */
11779470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
118065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh    public WifiSettings() {
11948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter = new IntentFilter();
12048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
12148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
12248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
124d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        mFilter.addAction(WifiManager.SUPPLICANT_CONFIG_CHANGED_ACTION);
12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
12748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mReceiver = new BroadcastReceiver() {
12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            @Override
13048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            public void onReceive(Context context, Intent intent) {
13148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                handleEvent(intent);
13248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
13348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        };
13448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
13548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner = new Scanner();
13648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
13748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
13848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
1399c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
1409c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // We don't call super.onActivityCreated() here, since it assumes we already set up
1419c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // Preference (probably in onCreate()), while WifiSettings exceptionally set it up in
1429c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // this method.
14348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
14448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
14548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
1469c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Activity activity = getActivity();
1479c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Intent intent = activity.getIntent();
1489c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa
149d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
15079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // if we're supposed to enable/disable the Next button based on our current connection
15179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // state, start it off in the right state
1529c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
15358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mInXlSetupWizard = intent.getBooleanExtra(IN_XL_SETUP_WIZARD, false);
154d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
155d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mEnableNextOnConnection) {
156d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (mEnableNextOnConnection && hasNextButton()) {
157d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                final ConnectivityManager connectivity = (ConnectivityManager)
158d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
159d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (connectivity != null) {
160d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    NetworkInfo info = connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
161d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    changeNextButtonState(info.isConnected());
162d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
16379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            }
16479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        }
16579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
166d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mInXlSetupWizard) {
167d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            addPreferencesFromResource(R.xml.wifi_access_points_for_wifi_setup_xl);
168d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else if (intent.getBooleanExtra("only_access_points", false)) {
169065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh            addPreferencesFromResource(R.xml.wifi_access_points);
17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
171065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh            addPreferencesFromResource(R.xml.wifi_settings);
1729c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa            mWifiEnabler = new WifiEnabler(activity,
17348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    (CheckBoxPreference) findPreference("enable_wifi"));
17448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mNotifyOpenNetworks =
17548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    (CheckBoxPreference) findPreference("notify_open_networks");
17648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mNotifyOpenNetworks.setChecked(Secure.getInt(getContentResolver(),
17748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1);
17848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
17948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
1809c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // After confirming PreferenceScreen is available, we call super.
1819c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onActivityCreated(savedInstanceState);
1829c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa
183d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        // This may be either ProgressCategory or AccessPointCategoryForXL.
184d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final ProgressCategoryBase preference =
185d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                (ProgressCategoryBase) findPreference("access_points");
186d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mAccessPoints = preference;
187d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mAccessPoints.setOrderingAsAdded(true);
18848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mAddNetwork = findPreference("add_network");
18948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
19048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        registerForContextMenu(getListView());
1919c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        setHasOptionsMenu(true);
19248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
19348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
19448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
1959c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onResume() {
19648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
19748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
19848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.resume();
19948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
2009c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().registerReceiver(mReceiver, mFilter);
201b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        if (mKeyStoreNetworkId != INVALID_NETWORK_ID &&
202b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                KeyStore.getInstance().test() == KeyStore.NO_ERROR) {
203d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff            mWifiManager.connectNetwork(mKeyStoreNetworkId);
20448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
205b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        mKeyStoreNetworkId = INVALID_NETWORK_ID;
20658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
20748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
20848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
20948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
2109c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onPause() {
21148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
21248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
21348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
21448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
2159c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().unregisterReceiver(mReceiver);
21648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
21748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
21848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog.dismiss();
21948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog = null;
22048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
22248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
22348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
2249c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
225d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        // We don't want menus in Setup Wizard XL.
226d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (!mInXlSetupWizard) {
227d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
228d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    .setIcon(R.drawable.ic_menu_scan_network);
229d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
230d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    .setIcon(android.R.drawable.ic_menu_manage);
231d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
2329c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onCreateOptionsMenu(menu, inflater);
23348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
23448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
23548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
23648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
23748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
23848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
2392215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                if (mWifiManager.isWifiEnabled()) {
2402215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                    mScanner.resume();
2412215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                }
24248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
24348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
2447e7ae9e59d1d3b7f1346955ccb58f39f3ee769dbDaisuke Miyakawa                startFragment(this, AdvancedSettings.class.getCanonicalName(), -1, null);
24548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
24648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
24748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
24848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
24948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
25048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
25148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
25248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (info instanceof AdapterContextMenuInfo) {
25348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
25448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
25548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
25648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
257d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mSelectedAccessPoint = (AccessPoint) preference;
258d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                menu.setHeaderTitle(mSelectedAccessPoint.ssid);
259d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mSelectedAccessPoint.getLevel() != -1
260d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        && mSelectedAccessPoint.getState() == null) {
26148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
26248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
263b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
26448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
265f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
26648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
26748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
26848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
26948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
27048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
27148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
27248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
273d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mSelectedAccessPoint == null) {
27448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
27548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
27648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
277d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_CONNECT: {
278b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
279d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    if (!requireKeyStore(mSelectedAccessPoint.getConfig())) {
280d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        mWifiManager.connectNetwork(mSelectedAccessPoint.networkId);
28148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
282d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
28348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    // Shortcut for open networks.
28448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiConfiguration config = new WifiConfiguration();
285d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    config.SSID = AccessPoint.convertToQuotedString(mSelectedAccessPoint.ssid);
28648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.allowedKeyManagement.set(KeyMgmt.NONE);
287d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff                    mWifiManager.connectNetwork(config);
28848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
289d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    showConfigUi(mSelectedAccessPoint, true);
29048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
29148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
292d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
293d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_FORGET: {
294d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId);
29548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
296d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
297d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_MODIFY: {
298d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                showConfigUi(mSelectedAccessPoint, true);
29948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
300d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
30148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
30248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
30348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
30448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
30548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
30648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
30748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
308d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mSelectedAccessPoint = (AccessPoint) preference;
309d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            showConfigUi(mSelectedAccessPoint, false);
31048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (preference == mAddNetwork) {
311d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            onAddNetworkPressed();
31248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (preference == mNotifyOpenNetworks) {
31348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Secure.putInt(getContentResolver(),
31448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
31548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    mNotifyOpenNetworks.isChecked() ? 1 : 0);
31648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
31748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
31848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
31948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
32048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
32148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
322d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
32358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Shows an appropriate Wifi configuration component.
32458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when a user clicks "Add network" preference or one of available networks is selected.
325d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
326d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void showConfigUi(AccessPoint accessPoint, boolean edit) {
3271dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa        mEdit = edit;
328d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mInXlSetupWizard) {
32958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).showConfigUi(accessPoint, edit);
330d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else {
331d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            showDialog(accessPoint, edit);
332d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
333d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
334d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
33548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
33648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
33748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog.dismiss();
33848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
3399c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mDialog = new WifiDialog(getActivity(), this, accessPoint, edit);
34048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mDialog.show();
34148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
34248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
34358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
34458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called from {@link WifiSettingsForSetupWizardXL} when the object wants to open
34558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * {@link WifiDialog} anyway, though usually it prepares its own simplified UI for
34658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * configuring a wifi network.
34758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
3481dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa    /* package */ void showDialogForSelectedPreference() {
3491dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa        showDialog(mSelectedAccessPoint, mEdit);
3501dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa    }
3511dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa
35248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private boolean requireKeyStore(WifiConfiguration config) {
353d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (WifiConfigController.requireKeyStore(config) &&
35448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                KeyStore.getInstance().test() != KeyStore.NO_ERROR) {
35548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mKeyStoreNetworkId = config.networkId;
3569c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa            Credentials.getInstance().unlock(getActivity());
35748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return true;
35848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
35948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return false;
36048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
362d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
363d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * Shows the latest access points available with supplimental information like
364d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * the strength of network and the security for it.
365d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
36786eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        mAccessPoints.removeAll();
36886eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
36958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // AccessPoints are automatically sorted with TreeSet.
37058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        final Collection<AccessPoint> accessPoints = constructAccessPoints();
37158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mInXlSetupWizard) {
37258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).onAccessPointsUpdated(
37358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                    mAccessPoints, accessPoints);
37458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else {
37558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            for (AccessPoint accessPoint : accessPoints) {
37658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                mAccessPoints.addPreference(accessPoint);
377d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
378d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
379d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
38048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
381d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private Collection<AccessPoint> constructAccessPoints() {
382d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        Collection<AccessPoint> accessPoints =
383d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                new TreeSet<AccessPoint>(new AccessPoint.Comparater());
384d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
385d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
3889c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                AccessPoint accessPoint = new AccessPoint(getActivity(), config);
38948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoint.update(mLastInfo, mLastState);
39048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
39148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
39248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
39348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
394d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<ScanResult> results = mWifiManager.getScanResults();
39548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
39848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
39948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
40048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
40148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
40248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
40348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
40448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                for (AccessPoint accessPoint : accessPoints) {
40548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    if (accessPoint.update(result)) {
40648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        found = true;
40748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
40848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
40948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
4109c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                    accessPoints.add(new AccessPoint(getActivity(), result));
41148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
41248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
41348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
41448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
415d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return accessPoints;
41648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
41748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void handleEvent(Intent intent) {
41948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
42048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
42148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
42248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
423d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
424d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff                WifiManager.SUPPLICANT_CONFIG_CHANGED_ACTION.equals(action)) {
425d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                updateAccessPoints();
42648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
42748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState)
42848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
42948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
43079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
43179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng                    WifiManager.EXTRA_NETWORK_INFO);
432d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            changeNextButtonState(info.isConnected());
43379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            updateConnectionState(info.getDetailedState());
43448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
43548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(null);
43648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
43748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
43848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
439af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private void updateConnectionState(DetailedState state) {
4402215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff        /* sticky broadcasts can call this when wifi is disabled */
441e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        if (!mWifiManager.isWifiEnabled()) {
442e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff            mScanner.pause();
4432215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff            return;
444e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        }
4452215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff
446af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh        if (state == DetailedState.OBTAINING_IPADDR) {
44748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
45148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
45248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
45348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state != null) {
45448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastState = state;
45548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
45648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
45748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) {
458d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // Maybe there's a WifiConfigPreference
459d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            Preference preference = mAccessPoints.getPreference(i);
460d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (preference instanceof AccessPoint) {
46186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                final AccessPoint accessPoint = (AccessPoint) preference;
46286eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                accessPoint.update(mLastInfo, mLastState);
463d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
464d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
465d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
46658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mInXlSetupWizard) {
46758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).updateConnectionState(mLastState);
46848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
46948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
47048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
47248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state == WifiManager.WIFI_STATE_ENABLED) {
47348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
47448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
47548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
47648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mAccessPoints.removeAll();
47748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
48048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private class Scanner extends Handler {
48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        private int mRetry = 0;
48248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
48348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void resume() {
48448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (!hasMessages(0)) {
48548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                sendEmptyMessage(0);
48648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
48748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
48848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
48948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void pause() {
49048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mRetry = 0;
49148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mAccessPoints.setProgress(false);
49248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            removeMessages(0);
49348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
49448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
49548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        @Override
49648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        public void handleMessage(Message message) {
49748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (mWifiManager.startScanActive()) {
49848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
49948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (++mRetry >= 3) {
50048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
5019c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                Toast.makeText(getActivity(), R.string.wifi_fail_to_scan,
50248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        Toast.LENGTH_LONG).show();
503e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff                return;
50448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
50548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mAccessPoints.setProgress(mRetry != 0);
5067add00049ac150c4b8c0e473a9baca70cf5e8aa8Irfan Sheriff            // Combo scans can take 5-6s to complete. Increase interval to 10s.
5077add00049ac150c4b8c0e473a9baca70cf5e8aa8Irfan Sheriff            sendEmptyMessageDelayed(0, 10000);
50848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
50948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
510d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
51158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
51258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Renames/replaces "Next" button when appropriate. "Next" button usually exists in
51358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Wifi setup screens, not in usual wifi settings screen.
51458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     *
51558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a wifi network.
51658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
51758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void changeNextButtonState(boolean connected) {
518d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mInXlSetupWizard) {
51958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).changeNextButtonState(connected);
520d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else if (mEnableNextOnConnection && hasNextButton()) {
52158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            getNextButton().setEnabled(connected);
522d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
523d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
524d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
525d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(DialogInterface dialogInterface, int button) {
52658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mInXlSetupWizard) {
52758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
52858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                ((WifiSettingsForSetupWizardXL)getActivity()).onForgetButtonPressed();
52958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            } else if (button == WifiDialog.BUTTON_SUBMIT) {
53058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                ((WifiSettingsForSetupWizardXL)getActivity()).onConnectButtonPressed();
53158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            }
53258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else {
53358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
53458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                forget();
53558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            } else if (button == WifiDialog.BUTTON_SUBMIT) {
53658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                submit(mDialog.getController());
5378b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa            }
538d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
539d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
54058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
541d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
54258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void submit(WifiConfigController configController) {
543b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        switch(configController.chosenNetworkSetupMethod()) {
544b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff            case WifiConfigController.WPS_PBC:
545b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                mWifiManager.startWpsPbc(mSelectedAccessPoint.bssid);
546b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                break;
547e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff            case WifiConfigController.WPS_PIN_FROM_ACCESS_POINT:
548b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                int apPin = configController.getWpsPin();
549e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff                mWifiManager.startWpsWithPinFromAccessPoint(mSelectedAccessPoint.bssid, apPin);
550e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff                break;
551e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff            case WifiConfigController.WPS_PIN_FROM_DEVICE:
552e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff                int pin = mWifiManager.startWpsWithPinFromDevice(mSelectedAccessPoint.bssid);
553e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff                new AlertDialog.Builder(getActivity())
55458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                        .setTitle(R.string.wifi_wps_pin_method_configuration)
55558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                        .setMessage(getResources().getString(R.string.wifi_wps_pin_output, pin))
55658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                        .setPositiveButton(android.R.string.ok, null)
55758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                        .show();
558b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                break;
559b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff            case WifiConfigController.MANUAL:
560b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                final WifiConfiguration config = configController.getConfig();
561b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff
562b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (config == null) {
563b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    if (mSelectedAccessPoint != null
5645d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa                            && !requireKeyStore(mSelectedAccessPoint.getConfig())
5655d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa                            && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
566b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                        mWifiManager.connectNetwork(mSelectedAccessPoint.networkId);
567b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    }
568b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                } else if (config.networkId != INVALID_NETWORK_ID) {
569b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    if (mSelectedAccessPoint != null) {
570b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                        mWifiManager.saveNetwork(config);
571b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    }
572b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                } else {
57358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                    if (configController.isEdit() || requireKeyStore(config)) {
574b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                        mWifiManager.saveNetwork(config);
575b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    } else {
576b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                        mWifiManager.connectNetwork(config);
577b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    }
578b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                }
579b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                break;
580d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
581d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
58258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
58358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
58486eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        }
58558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
586d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
587d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
588d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void forget() {
589d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId);
590d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
59158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
59258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
59358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
59458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
595d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
59658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We need to rename/replace "Next" button in wifi setup context.
597d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        changeNextButtonState(false);
598d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
599d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
60058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
60158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Refreshes acccess points and ask Wifi module to scan networks again.
60258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
603d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void refreshAccessPoints() {
604d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
605d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mScanner.resume();
606d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
607d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
608d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mAccessPoints.removeAll();
609d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
610d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
61158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
61258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when "add network" button is pressed.
61358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
614d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void onAddNetworkPressed() {
61558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // No exact access point is selected.
616d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mSelectedAccessPoint = null;
617d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        showConfigUi(null, true);
618d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
619b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa
620b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    /* package */ int getAccessPointsCount() {
621b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        if (mAccessPoints != null) {
622b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return mAccessPoints.getPreferenceCount();
623b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        } else {
624b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return 0;
625b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
626b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    }
62755de702961642521e247f155963644df81756215Daisuke Miyakawa
62858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
62958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
63058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
63158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void pauseWifiScan() {
63258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
63358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.pause();
63458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
63558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
63658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
63758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
63858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
63958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
64058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void resumeWifiScan() {
64158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
64258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
64358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
64455de702961642521e247f155963644df81756215Daisuke Miyakawa    }
64548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
646