WifiSettings.java revision b0b37ae21c172491bc170659b5f429601858ddc1
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
21e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.app.ActionBar;
229c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.app.Activity;
23e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriffimport android.app.AlertDialog;
243d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasaniimport android.app.Dialog;
2548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver;
2648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context;
2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface;
2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent;
2948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter;
3079470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager;
3148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo;
32af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState;
3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult;
3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState;
3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration;
36e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.net.wifi.WifiConfiguration.KeyMgmt;
3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo;
3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager;
3990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriffimport android.net.wifi.WpsInfo;
4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle;
4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler;
4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message;
4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference;
449e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.preference.PreferenceActivity;
4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen;
4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials;
4748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore;
48590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log;
4948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu;
50e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo;
51e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.Gravity;
5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu;
539c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater;
5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem;
5548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View;
569e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo;
57e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch;
5818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView;
59e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast;
6048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
61590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R;
62590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment;
636ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriffimport com.android.settings.wifi.p2p.WifiP2pSettings;
64590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
6552727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList;
66d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection;
67fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.Collections;
68fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.HashMap;
6948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List;
70582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean;
7148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * This currently provides three types of UI.
74d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
75d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Two are for phones with relatively small screens: "for SetupWizard" and "for usual Settings".
76d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Users just need to launch WifiSettings Activity as usual. The request will be appropriately
77d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * handled by ActivityManager, and they will have appropriate look-and-feel with this fragment.
78d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
79d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Third type is for Setup Wizard with X-Large, landscape UI. Users need to launch
80d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * {@link WifiSettingsForSetupWizardXL} Activity, which contains this fragment but also has
81d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * other decorations specific to that screen.
82d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
839c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment
84e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        implements DialogInterface.OnClickListener  {
85590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private static final String TAG = "WifiSettings";
8690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PBC = Menu.FIRST;
8790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
886ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_P2P = Menu.FIRST + 2;
896ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3;
906ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADVANCED = Menu.FIRST + 4;
916ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_SCAN = Menu.FIRST + 5;
926ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
936ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_FORGET = Menu.FIRST + 7;
946ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
9548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
963d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final int WIFI_DIALOG_ID = 1;
9790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PBC_DIALOG_ID = 2;
9890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PIN_DIALOG_ID = 3;
993d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
100fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    // Combo scans can take 5-6s to complete - set to 10s.
101fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
102fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
1033d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Instance state keys
1043d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode";
1053d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
1063d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
10748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final IntentFilter mFilter;
10848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final BroadcastReceiver mReceiver;
10948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final Scanner mScanner;
11048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
11148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiManager mWifiManager;
1128f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.Channel mChannel;
1138f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mConnectListener;
1148f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mSaveListener;
1158f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mForgetListener;
11690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
1178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
11848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiEnabler mWifiEnabler;
119d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    // An access point being editted is stored here.
120d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private AccessPoint mSelectedAccessPoint;
12148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
122af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private DetailedState mLastState;
12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiInfo mLastInfo;
12448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
125582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff    private AtomicBoolean mConnected = new AtomicBoolean(false);
126582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff
127b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff    private int mKeyStoreNetworkId = INVALID_NETWORK_ID;
12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
12958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiDialog mDialog;
130d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
13118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne    private TextView mEmptyView;
13218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
13358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* Used in Wifi Setup context */
134d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
13558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // this boolean extra specifies whether to disable the Next button when not connected
13658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect";
137d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
13858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // should Next button only be enabled when we have a connection?
13958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mEnableNextOnConnection;
14058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mInXlSetupWizard;
14186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
1423d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Save the dialog details
1433d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private boolean mDlgEdit;
1443d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private AccessPoint mDlgAccessPoint;
1453d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private Bundle mAccessPointSavedState;
1463d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
14758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* End of "used in Wifi Setup context" */
14879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
149065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh    public WifiSettings() {
15048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter = new IntentFilter();
15148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
15248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
15348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
15448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
155afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
156afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
15748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
15848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
15948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
16048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mReceiver = new BroadcastReceiver() {
16148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            @Override
16248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            public void onReceive(Context context, Intent intent) {
1636377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                handleEvent(context, intent);
16448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
16548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        };
16648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
16748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner = new Scanner();
16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
16948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
1710688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    public void onAttach(Activity activity) {
1720688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa        super.onAttach(activity);
1730688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa
1740688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa        mInXlSetupWizard = (activity instanceof WifiSettingsForSetupWizardXL);
1750688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    }
1760688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa
1770688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    @Override
1789c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
1799c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // We don't call super.onActivityCreated() here, since it assumes we already set up
1809c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // Preference (probably in onCreate()), while WifiSettings exceptionally set it up in
1819c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // this method.
18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
18348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
1848f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mChannel = mWifiManager.initialize(getActivity(), getActivity().getMainLooper(), null);
1858f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
1868f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mConnectListener = new WifiManager.ActionListener() {
1878f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
1888f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
1898f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
1908f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                        Toast.makeText(getActivity(),
1918f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                            R.string.wifi_failed_connect_message,
1928f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                            Toast.LENGTH_SHORT).show();
1938f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
1948f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
1958f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
1968f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mSaveListener = new WifiManager.ActionListener() {
1978f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onSuccess() {
1988f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
1998f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onFailure(int reason) {
2008f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                    Toast.makeText(getActivity(),
2018f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                        R.string.wifi_failed_save_message,
2028f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                        Toast.LENGTH_SHORT).show();
2038f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
2048f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            };
2058f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2068f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mForgetListener = new WifiManager.ActionListener() {
2078f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
2088f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2098f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
2108f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                        Toast.makeText(getActivity(),
2118f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                            R.string.wifi_failed_forget_message,
2128f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                            Toast.LENGTH_SHORT).show();
2138f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2148f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
2158f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2163d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (savedInstanceState != null
2173d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
2183d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
2193d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
2203d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
2229c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Activity activity = getActivity();
2239c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Intent intent = activity.getIntent();
2249c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa
22579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // if we're supposed to enable/disable the Next button based on our current connection
22679470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // state, start it off in the right state
2279c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
228d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
229e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (mEnableNextOnConnection) {
230e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (hasNextButton()) {
231e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final ConnectivityManager connectivity = (ConnectivityManager)
232e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                        getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
233e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (connectivity != null) {
234e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    NetworkInfo info = connectivity.getNetworkInfo(
235e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ConnectivityManager.TYPE_WIFI);
236e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    changeNextButtonState(info.isConnected());
237d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
23879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            }
239e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        }
24079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
241e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (mInXlSetupWizard) {
242e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            addPreferencesFromResource(R.xml.wifi_access_points_for_wifi_setup_xl);
243e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        } else {
244e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            addPreferencesFromResource(R.xml.wifi_settings);
245e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
246e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Switch actionBarSwitch = new Switch(activity);
247e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
248e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (activity instanceof PreferenceActivity) {
249e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
250e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
251e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    final int padding = activity.getResources().getDimensionPixelSize(
252e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            R.dimen.action_bar_switch_padding);
253e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    actionBarSwitch.setPadding(0, 0, padding, 0);
254e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
255e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.DISPLAY_SHOW_CUSTOM);
256e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
257e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
258e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
259e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            Gravity.CENTER_VERTICAL | Gravity.RIGHT));
2600f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani                }
261a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa            }
2627bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff
263e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);
26448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
26548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
266dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey        mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
26718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getListView().setEmptyView(mEmptyView);
26818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
269e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        registerForContextMenu(getListView());
270e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        setHasOptionsMenu(true);
271e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
2729c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // After confirming PreferenceScreen is available, we call super.
2739c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onActivityCreated(savedInstanceState);
27448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
27548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
27648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
2779c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onResume() {
27848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
27948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
28048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.resume();
28148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
282590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
2839c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().registerReceiver(mReceiver, mFilter);
284b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        if (mKeyStoreNetworkId != INVALID_NETWORK_ID &&
285d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) {
2868f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff            mWifiManager.connect(mChannel, mKeyStoreNetworkId, mConnectListener);
28748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
288b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        mKeyStoreNetworkId = INVALID_NETWORK_ID;
289e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
29058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
29148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
29248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
29348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
2949c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onPause() {
29548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
29648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
29748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
29848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
2999c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().unregisterReceiver(mReceiver);
30048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
30148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
30248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
30348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
3049c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
305d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        // We don't want menus in Setup Wizard XL.
306d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (!mInXlSetupWizard) {
307e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
30890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
309dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
310dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
3116ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_P2P, 0, R.string.wifi_menu_p2p)
3126ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    .setEnabled(wifiIsEnabled)
3136ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
314e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
315dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
316dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
31790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
31890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    //.setIcon(R.drawable.ic_menu_scan_network)
31990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
32090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
32190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin)
32290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
32390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
324d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
325dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    //.setIcon(android.R.drawable.ic_menu_manage)
326348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
32790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff       }
3289c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onCreateOptionsMenu(menu, inflater);
32948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
33048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
33148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
3323d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public void onSaveInstanceState(Bundle outState) {
3333d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        super.onSaveInstanceState(outState);
3343d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
3353d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // If the dialog is showing, save its state.
3363d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (mDialog != null && mDialog.isShowing()) {
3373d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit);
3383d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            if (mDlgAccessPoint != null) {
3393d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mAccessPointSavedState = new Bundle();
3403d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mDlgAccessPoint.saveWifiState(mAccessPointSavedState);
3413d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
3423d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            }
3433d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
3443d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
3453d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
3463d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
34748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
34848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
34990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PBC:
35090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PBC_DIALOG_ID);
35190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
3526ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff            case MENU_ID_P2P:
3536ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                if (getActivity() instanceof PreferenceActivity) {
3546ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    ((PreferenceActivity) getActivity()).startPreferencePanel(
3556ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            WifiP2pSettings.class.getCanonicalName(),
3566ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            null,
3576ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            R.string.wifi_p2p_settings_title, null,
3586ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            this, 0);
3596ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                } else {
3606ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    startFragment(this, WifiP2pSettings.class.getCanonicalName(), -1, null);
3616ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                }
3626ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                return true;
36390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PIN:
36490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PIN_DIALOG_ID);
36590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
3672215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                if (mWifiManager.isWifiEnabled()) {
368c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff                    mScanner.forceScan();
3692215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                }
37048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
371e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case MENU_ID_ADD_NETWORK:
372e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mWifiManager.isWifiEnabled()) {
373e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    onAddNetworkPressed();
374e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
375e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                return true;
37648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
3779eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                if (getActivity() instanceof PreferenceActivity) {
3789eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                    ((PreferenceActivity) getActivity()).startPreferencePanel(
379dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                            AdvancedWifiSettings.class.getCanonicalName(),
3809eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            null,
3819eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            R.string.wifi_advanced_titlebar, null,
3829eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            this, 0);
3839eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                } else {
384dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                    startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null);
3859eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                }
38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
38848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
38948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
39048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
39148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
39248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
393267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa        if (mInXlSetupWizard) {
394267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).onCreateContextMenu(menu, view, info);
395267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa        } else if (info instanceof AdapterContextMenuInfo) {
39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
39848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
39948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
400d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mSelectedAccessPoint = (AccessPoint) preference;
401d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                menu.setHeaderTitle(mSelectedAccessPoint.ssid);
402d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mSelectedAccessPoint.getLevel() != -1
403d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        && mSelectedAccessPoint.getState() == null) {
40448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
40548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
406b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
40748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
408f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
40948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
41048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
41148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
41248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
41348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
41448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
41548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
416d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mSelectedAccessPoint == null) {
41748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
41948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
420d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_CONNECT: {
421b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
422d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    if (!requireKeyStore(mSelectedAccessPoint.getConfig())) {
4238f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                        mWifiManager.connect(mChannel, mSelectedAccessPoint.networkId,
4248f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                mConnectListener);
42548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
426d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
42722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    /** Bypass dialog for unsecured networks */
42822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.generateOpenNetworkConfig();
4298f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                    mWifiManager.connect(mChannel, mSelectedAccessPoint.getConfig(),
4308f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            mConnectListener);
43148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
432d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    showConfigUi(mSelectedAccessPoint, true);
43348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
43448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
435d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
436d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_FORGET: {
4378f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                mWifiManager.forget(mChannel, mSelectedAccessPoint.networkId, mForgetListener);
43848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
439d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
440d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_MODIFY: {
441d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                showConfigUi(mSelectedAccessPoint, true);
44248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
443d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
44448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
44548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
44648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
44748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
451d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mSelectedAccessPoint = (AccessPoint) preference;
45222d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            /** Bypass dialog for unsecured, unsaved networks */
45322d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE &&
45422d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
45522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                mSelectedAccessPoint.generateOpenNetworkConfig();
4568f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                mWifiManager.connect(mChannel, mSelectedAccessPoint.getConfig(), mConnectListener);
45722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            } else {
45822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                showConfigUi(mSelectedAccessPoint, false);
45922d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            }
46048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
46148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
46248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
46348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
46448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
46548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
466d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
46758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Shows an appropriate Wifi configuration component.
46858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when a user clicks "Add network" preference or one of available networks is selected.
469d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
470d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void showConfigUi(AccessPoint accessPoint, boolean edit) {
471d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mInXlSetupWizard) {
47258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).showConfigUi(accessPoint, edit);
473d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else {
474d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            showDialog(accessPoint, edit);
475d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
476d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
477d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
4803d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            removeDialog(WIFI_DIALOG_ID);
4813d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDialog = null;
4823d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
4833d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4843d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // Save the access point and edit mode
4853d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgAccessPoint = accessPoint;
4863d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgEdit = edit;
4873d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4883d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        showDialog(WIFI_DIALOG_ID);
4893d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
4903d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4913d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
4923d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public Dialog onCreateDialog(int dialogId) {
49390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        switch (dialogId) {
49490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WIFI_DIALOG_ID:
49590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                AccessPoint ap = mDlgAccessPoint; // For manual launch
49690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                if (ap == null) { // For re-launch from saved state
49790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    if (mAccessPointSavedState != null) {
49890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        ap = new AccessPoint(getActivity(), mAccessPointSavedState);
49990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        // For repeated orientation changes
50090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mDlgAccessPoint = ap;
50190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    }
50290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                }
50390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                // If it's still null, fine, it's for Add Network
50490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mSelectedAccessPoint = ap;
50590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit);
50690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return mDialog;
50790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PBC_DIALOG_ID:
50890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.PBC);
50990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PIN_DIALOG_ID:
51090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
51190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        }
51290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        return super.onCreateDialog(dialogId);
51348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
51448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
51548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private boolean requireKeyStore(WifiConfiguration config) {
516d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (WifiConfigController.requireKeyStore(config) &&
517d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                KeyStore.getInstance().state() != KeyStore.State.UNLOCKED) {
51848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mKeyStoreNetworkId = config.networkId;
5199c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa            Credentials.getInstance().unlock(getActivity());
52048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return true;
52148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
52248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return false;
52348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
52448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
525d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
526d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * Shows the latest access points available with supplimental information like
527d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * the strength of network and the security for it.
528d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
52948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
530e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final int wifiState = mWifiManager.getWifiState();
531e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
532e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (wifiState) {
533e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
534e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                // AccessPoints are automatically sorted with TreeSet.
535e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final Collection<AccessPoint> accessPoints = constructAccessPoints();
536fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                getPreferenceScreen().removeAll();
537e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mInXlSetupWizard) {
538e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    ((WifiSettingsForSetupWizardXL)getActivity()).onAccessPointsUpdated(
539e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            getPreferenceScreen(), accessPoints);
540e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                } else {
5416243e8e466fae6d1828e1862586c07fc4eabf4c7Vishal Mahaveer                    if(accessPoints.size() == 0) {
5426243e8e466fae6d1828e1862586c07fc4eabf4c7Vishal Mahaveer                        addMessagePreference(R.string.wifi_empty_list_wifi_on);
5436243e8e466fae6d1828e1862586c07fc4eabf4c7Vishal Mahaveer                    }
544e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    for (AccessPoint accessPoint : accessPoints) {
545e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                        getPreferenceScreen().addPreference(accessPoint);
546e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    }
547e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
548e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
54986eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
55018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
55118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                getPreferenceScreen().removeAll();
55218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                break;
55318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
554e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLING:
555e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_stopping);
556e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
557e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
558e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
559e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_empty_list_wifi_off);
560e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
561d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
562d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
56348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
564e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private void addMessagePreference(int messageId) {
56518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        if (mEmptyView != null) mEmptyView.setText(messageId);
56618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getPreferenceScreen().removeAll();
567e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    }
568e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
569fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** Returns sorted list of access points */
570fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private List<AccessPoint> constructAccessPoints() {
571fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
572fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        /** Lookup table to more quickly update AccessPoints by only considering objects with the
573fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy         * correct SSID.  Maps SSID -> List of AccessPoints with the given SSID.  */
574fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
575d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
576d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
57748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
57848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
5799c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                AccessPoint accessPoint = new AccessPoint(getActivity(), config);
58048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoint.update(mLastInfo, mLastState);
58148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
582fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                apMap.put(accessPoint.ssid, accessPoint);
58348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
58448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
58548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
586d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<ScanResult> results = mWifiManager.getScanResults();
58748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
58848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
58948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
59048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
59148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
59248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
59348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
59548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
596cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                for (AccessPoint accessPoint : apMap.getAll(result.SSID)) {
597cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                    if (accessPoint.update(result))
598cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                        found = true;
59948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
60048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
601fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    AccessPoint accessPoint = new AccessPoint(getActivity(), result);
602fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    accessPoints.add(accessPoint);
603fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    apMap.put(accessPoint.ssid, accessPoint);
60448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
60548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
60648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
60748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
608cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        // Pre-sort accessPoints to speed preference insertion
609fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Collections.sort(accessPoints);
610d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return accessPoints;
61148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
61248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
613fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** A restricted multimap for use in constructAccessPoints */
614fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private class Multimap<K,V> {
615fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        private HashMap<K,List<V>> store = new HashMap<K,List<V>>();
616cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        /** retrieve a non-null list of values with key K */
617fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        List<V> getAll(K key) {
618cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            List<V> values = store.get(key);
619cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            return values != null ? values : Collections.<V>emptyList();
620fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
621fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
622fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        void put(K key, V val) {
623fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            List<V> curVals = store.get(key);
624fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            if (curVals == null) {
625fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                curVals = new ArrayList<V>(3);
626fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                store.put(key, curVals);
627fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            }
628fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            curVals.add(val);
629fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
630fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    }
631fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
6326377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff    private void handleEvent(Context context, Intent intent) {
63348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
63448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
63548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
63648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
637d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
638afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
639afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
640d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                updateAccessPoints();
64148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
642582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //Ignore supplicant state changes when network is connected
643582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and
644582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //introduce a broadcast that combines the supplicant and network
645582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //network state change events so the apps dont have to worry about
646582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //ignoring supplicant state change when network is connected
647582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //to get more fine grained information.
64809a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            SupplicantState state = (SupplicantState) intent.getParcelableExtra(
64909a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                    WifiManager.EXTRA_NEW_STATE);
65009a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            if (!mConnected.get() && SupplicantState.isHandshakeState(state)) {
65109a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                updateConnectionState(WifiInfo.getDetailedStateOf(state));
652582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            }
653cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
654cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            if (mInXlSetupWizard) {
655cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                ((WifiSettingsForSetupWizardXL)getActivity()).onSupplicantStateChanged(intent);
656cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            }
65748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
65879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
65979470d1a66f479919c13e27546391439cafa0ee7Freeman Ng                    WifiManager.EXTRA_NETWORK_INFO);
660582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            mConnected.set(info.isConnected());
661d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            changeNextButtonState(info.isConnected());
662317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff            updateAccessPoints();
66379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            updateConnectionState(info.getDetailedState());
66448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
66548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(null);
66648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
66748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
66848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
669af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private void updateConnectionState(DetailedState state) {
6702215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff        /* sticky broadcasts can call this when wifi is disabled */
671e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        if (!mWifiManager.isWifiEnabled()) {
672e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff            mScanner.pause();
6732215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff            return;
674e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        }
6752215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff
676af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh        if (state == DetailedState.OBTAINING_IPADDR) {
67748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
67848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
67948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
68048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
68148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
68248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
68348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state != null) {
68448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastState = state;
68548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
68648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
687e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) {
688d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // Maybe there's a WifiConfigPreference
689e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Preference preference = getPreferenceScreen().getPreference(i);
690d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (preference instanceof AccessPoint) {
69186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                final AccessPoint accessPoint = (AccessPoint) preference;
69286eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                accessPoint.update(mLastInfo, mLastState);
693d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
694d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
695d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
69658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mInXlSetupWizard) {
69758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).updateConnectionState(mLastState);
69848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
69948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
70048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
70148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
702e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getActivity().invalidateOptionsMenu();
703e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
704e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (state) {
705e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
706e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                mScanner.resume();
70718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                return; // not break, to avoid the call to pause() below
708e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
709e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
710e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_starting);
711e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
712e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
713e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
714e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_empty_list_wifi_off);
715e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
71648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
717e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
718c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastInfo = null;
719c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastState = null;
720e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        mScanner.pause();
72148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
72248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
72348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private class Scanner extends Handler {
72448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        private int mRetry = 0;
72548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
72648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void resume() {
72748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (!hasMessages(0)) {
72848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                sendEmptyMessage(0);
72948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
73048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
73148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
732c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        void forceScan() {
73322d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            removeMessages(0);
734c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff            sendEmptyMessage(0);
735c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        }
736c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff
73748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void pause() {
73848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mRetry = 0;
73948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            removeMessages(0);
74048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
74148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
74248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        @Override
74348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        public void handleMessage(Message message) {
74448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (mWifiManager.startScanActive()) {
74548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
74648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (++mRetry >= 3) {
74748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
7489c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                Toast.makeText(getActivity(), R.string.wifi_fail_to_scan,
74948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        Toast.LENGTH_LONG).show();
750e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff                return;
75148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
752fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);
75348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
75448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
755d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
75658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
75758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Renames/replaces "Next" button when appropriate. "Next" button usually exists in
75858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Wifi setup screens, not in usual wifi settings screen.
75958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     *
76058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a wifi network.
76158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
76258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void changeNextButtonState(boolean connected) {
763d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mInXlSetupWizard) {
76458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).changeNextButtonState(connected);
765d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else if (mEnableNextOnConnection && hasNextButton()) {
76658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            getNextButton().setEnabled(connected);
767d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
768d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
769d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
770d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(DialogInterface dialogInterface, int button) {
77158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mInXlSetupWizard) {
77258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
77314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                forget();
77458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            } else if (button == WifiDialog.BUTTON_SUBMIT) {
77558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                ((WifiSettingsForSetupWizardXL)getActivity()).onConnectButtonPressed();
77658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            }
77758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else {
77858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
77958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                forget();
78058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            } else if (button == WifiDialog.BUTTON_SUBMIT) {
78158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                submit(mDialog.getController());
7828b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa            }
783d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
784d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
78558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
786d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
78758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void submit(WifiConfigController configController) {
788b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff
78990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        final WifiConfiguration config = configController.getConfig();
79090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
79190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        if (config == null) {
79290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null
79390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && !requireKeyStore(mSelectedAccessPoint.getConfig())
79490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
79590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mWifiManager.connect(mChannel, mSelectedAccessPoint.networkId,
79690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mConnectListener);
79790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
79890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else if (config.networkId != INVALID_NETWORK_ID) {
79990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null) {
80090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                saveNetwork(config);
80190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
80290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else {
80390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (configController.isEdit() || requireKeyStore(config)) {
80490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                saveNetwork(config);
80590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            } else {
80690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mWifiManager.connect(mChannel, config, mConnectListener);
80790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
808d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
809d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
81058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
81158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
81286eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        }
81358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
814d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
815d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
816cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private void saveNetwork(WifiConfiguration config) {
817cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (mInXlSetupWizard) {
818cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).onSaveNetwork(config);
819cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        } else {
8208f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff            mWifiManager.save(mChannel, config, mSaveListener);
821cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
822cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
823cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
824d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void forget() {
8258f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mWifiManager.forget(mChannel, mSelectedAccessPoint.networkId, mForgetListener);
826d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
82758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
82858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
82958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
83058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
831d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
83258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We need to rename/replace "Next" button in wifi setup context.
833d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        changeNextButtonState(false);
834d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
835d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
83658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
83758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Refreshes acccess points and ask Wifi module to scan networks again.
83858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
839d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void refreshAccessPoints() {
840d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
841d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mScanner.resume();
842d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
843d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
844e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getPreferenceScreen().removeAll();
845d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
846d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
84758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
84858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when "add network" button is pressed.
84958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
850d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void onAddNetworkPressed() {
85158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // No exact access point is selected.
852d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mSelectedAccessPoint = null;
853d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        showConfigUi(null, true);
854d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
855b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa
856b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    /* package */ int getAccessPointsCount() {
857e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
858e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (wifiIsEnabled) {
859e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            return getPreferenceScreen().getPreferenceCount();
860b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        } else {
861b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return 0;
862b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
863b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    }
86455de702961642521e247f155963644df81756215Daisuke Miyakawa
86558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
86658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
86758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
86858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void pauseWifiScan() {
86958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
87058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.pause();
87158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
87258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
87358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
87458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
87558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
87658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
87758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void resumeWifiScan() {
87858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
87958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
88058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
88155de702961642521e247f155963644df81756215Daisuke Miyakawa    }
882b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
883b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    @Override
884b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    protected int getHelpResource() {
885b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        return R.string.help_url_wifi;
886b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    }
88748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
888