WifiSettings.java revision 852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fd
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;
233d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasaniimport android.app.Dialog;
2448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver;
2548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context;
2648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface;
2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent;
2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter;
29e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriffimport android.content.pm.PackageManager;
30fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.content.res.Resources;
3179470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager;
3248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo;
33af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState;
3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult;
3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState;
3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration;
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;
48fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.util.AttributeSet;
49590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log;
5048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu;
51e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo;
52e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.Gravity;
53fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.LayoutInflater;
5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu;
559c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater;
5648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem;
5748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View;
58fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.View.OnClickListener;
59fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.ViewGroup;
609e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo;
61fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.ImageButton;
629d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolbimport android.widget.PopupMenu;
639d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolbimport android.widget.PopupMenu.OnMenuItemClickListener;
64fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.RelativeLayout;
65e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch;
6618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView;
67e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast;
6848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
69590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R;
70590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment;
716ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriffimport com.android.settings.wifi.p2p.WifiP2pSettings;
72590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
7352727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList;
74d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection;
75fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.Collections;
76fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.HashMap;
7748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List;
78582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean;
7948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
80d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
81fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * Two types of UI are provided here.
82d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
83fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The first is for "usual Settings", appearing as any other Setup fragment.
84d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
85fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The second is for Setup Wizard, with a simplified interface that hides the action bar
86fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * and menus.
87d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
889c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment
89e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        implements DialogInterface.OnClickListener  {
90590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private static final String TAG = "WifiSettings";
9190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PBC = Menu.FIRST;
9290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
936ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_P2P = Menu.FIRST + 2;
946ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3;
956ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADVANCED = Menu.FIRST + 4;
966ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_SCAN = Menu.FIRST + 5;
976ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
986ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_FORGET = Menu.FIRST + 7;
996ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
10048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
1013d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final int WIFI_DIALOG_ID = 1;
10290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PBC_DIALOG_ID = 2;
10390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PIN_DIALOG_ID = 3;
1043d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
105fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    // Combo scans can take 5-6s to complete - set to 10s.
106fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
107fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
1083d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Instance state keys
1093d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode";
1103d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
1113d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
11248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final IntentFilter mFilter;
11348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final BroadcastReceiver mReceiver;
11448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final Scanner mScanner;
11548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
11648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiManager mWifiManager;
1178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mConnectListener;
1188f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mSaveListener;
1198f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mForgetListener;
120e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff    private boolean mP2pSupported;
12190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
1228f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiEnabler mWifiEnabler;
124d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    // An access point being editted is stored here.
125d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private AccessPoint mSelectedAccessPoint;
12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
127af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private DetailedState mLastState;
12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiInfo mLastInfo;
12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
130582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff    private AtomicBoolean mConnected = new AtomicBoolean(false);
131582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff
132b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff    private int mKeyStoreNetworkId = INVALID_NETWORK_ID;
13348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
13458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiDialog mDialog;
135d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
13618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne    private TextView mEmptyView;
13718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
13858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* Used in Wifi Setup context */
139d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
14058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // this boolean extra specifies whether to disable the Next button when not connected
14158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect";
1420575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
1430575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    // this boolean extra specifies whether to auto finish when connection is established
1440575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect";
1450575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
14644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    // this boolean extra is set if we are being invoked by the Setup Wizard
14744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    private static final String EXTRA_IS_FIRST_RUN = "firstRun";
14844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
14958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // should Next button only be enabled when we have a connection?
15058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mEnableNextOnConnection;
15186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
1520575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    // should activity finish once we have a connection?
1530575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    private boolean mAutoFinishOnConnection;
1540575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
1553d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Save the dialog details
1563d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private boolean mDlgEdit;
1573d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private AccessPoint mDlgAccessPoint;
1583d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private Bundle mAccessPointSavedState;
1593d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
16044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    // the action bar uses a different set of controls for Setup Wizard
16144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    private boolean mSetupWizardMode;
162fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner
16358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* End of "used in Wifi Setup context" */
16479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
165065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh    public WifiSettings() {
16648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter = new IntentFilter();
16748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
16948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
171afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
172afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
17348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
17448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
17548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
17648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mReceiver = new BroadcastReceiver() {
17748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            @Override
17848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            public void onReceive(Context context, Intent intent) {
1796377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                handleEvent(context, intent);
18048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
18148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        };
18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
18348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner = new Scanner();
18448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
18548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
18648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
18744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    public void onCreate(Bundle icicle) {
18844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        // Set this flag early, as it's needed by getHelpResource(), which is called by super
18944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        mSetupWizardMode = getActivity().getIntent().getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
19044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
19144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        super.onCreate(icicle);
19244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    }
19344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
19444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    @Override
1959d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb    public View onCreateView(final LayoutInflater inflater, ViewGroup container,
196fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            Bundle savedInstanceState) {
197fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        if (mSetupWizardMode) {
198fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            View view = inflater.inflate(R.layout.setup_preference, container, false);
1999d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            View other = view.findViewById(R.id.other_network);
2009d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            other.setOnClickListener(new OnClickListener() {
2019d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                @Override
2029d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                public void onClick(View v) {
2039d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                    if (mWifiManager.isWifiEnabled()) {
2049d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                        onAddNetworkPressed();
205fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    }
2069d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                }
2079d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            });
2089d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            final ImageButton b = (ImageButton) view.findViewById(R.id.more);
2099d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            if (b != null) {
2109d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                b.setOnClickListener(new OnClickListener() {
211fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    @Override
212fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    public void onClick(View v) {
213fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                        if (mWifiManager.isWifiEnabled()) {
2149d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            PopupMenu pm = new PopupMenu(inflater.getContext(), b);
2159d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.inflate(R.menu.wifi_setup);
2169d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {
2179d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                @Override
2189d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                public boolean onMenuItemClick(MenuItem item) {
2199d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    if (R.id.wifi_wps == item.getItemId()) {
2209d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                        showDialog(WPS_PBC_DIALOG_ID);
2219d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                        return true;
2229d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    }
2239d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    return false;
2249d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                }
2259d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            });
2269d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.show();
227fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                        }
228fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    }
229fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                });
230fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            }
231fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            return view;
232fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        } else {
233fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            return super.onCreateView(inflater, container, savedInstanceState);
234fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
235fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    }
236fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
237fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    @Override
2389c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
239852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner        super.onActivityCreated(savedInstanceState);
240852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner
241e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff        mP2pSupported = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT);
24248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
2438f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2448f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mConnectListener = new WifiManager.ActionListener() {
2458f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
2468f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2478f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
2488f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                        Toast.makeText(getActivity(),
2498f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                            R.string.wifi_failed_connect_message,
2508f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                            Toast.LENGTH_SHORT).show();
2518f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2528f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
2538f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2548f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mSaveListener = new WifiManager.ActionListener() {
2558f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onSuccess() {
2568f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
2578f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onFailure(int reason) {
2588f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                    Toast.makeText(getActivity(),
2598f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                        R.string.wifi_failed_save_message,
2608f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                        Toast.LENGTH_SHORT).show();
2618f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
2628f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            };
2638f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2648f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mForgetListener = new WifiManager.ActionListener() {
2658f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
2668f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2678f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
2688f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                        Toast.makeText(getActivity(),
2698f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                            R.string.wifi_failed_forget_message,
2708f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                            Toast.LENGTH_SHORT).show();
2718f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2728f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
2738f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2743d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (savedInstanceState != null
2753d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
2763d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
2773d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
2783d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
27948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
2809c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Activity activity = getActivity();
2819c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Intent intent = activity.getIntent();
2829c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa
2830575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        // first if we're supposed to finish once we have a connection
2840575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
2850575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
2860575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        if (mAutoFinishOnConnection) {
2870575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            // Hide the next button
2880575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (hasNextButton()) {
2890575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                getNextButton().setVisibility(View.GONE);
2900575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
2910575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
2920575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            final ConnectivityManager connectivity = (ConnectivityManager)
2930575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                    getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
2940575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (connectivity != null
2950575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                    && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
2960575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                activity.finish();
2970575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                return;
2980575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
2990575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        }
3000575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
30179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // if we're supposed to enable/disable the Next button based on our current connection
30279470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // state, start it off in the right state
3039c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
304d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
305e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (mEnableNextOnConnection) {
306e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (hasNextButton()) {
307e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final ConnectivityManager connectivity = (ConnectivityManager)
308e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                        getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
309e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (connectivity != null) {
310e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    NetworkInfo info = connectivity.getNetworkInfo(
311e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ConnectivityManager.TYPE_WIFI);
312e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    changeNextButtonState(info.isConnected());
313d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
31479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            }
315e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        }
31679470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
317fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        addPreferencesFromResource(R.xml.wifi_settings);
318e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
31958d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner        if (mSetupWizardMode) {
32058d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner            getView().setSystemUiVisibility(
32158d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_BACK |
32258d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_HOME |
32358d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_RECENT |
32458d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS |
32558d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_CLOCK);
326bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn        }
327bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn
32844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        // On/off switch is hidden for Setup Wizard
32944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (!mSetupWizardMode) {
330e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Switch actionBarSwitch = new Switch(activity);
331e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
332e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (activity instanceof PreferenceActivity) {
333e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
334e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
335e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    final int padding = activity.getResources().getDimensionPixelSize(
336e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            R.dimen.action_bar_switch_padding);
337e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    actionBarSwitch.setPadding(0, 0, padding, 0);
338e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
339e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.DISPLAY_SHOW_CUSTOM);
340e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
341e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
342e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
34379d8e80a304922c34a6bd344f1fa49dd7dfd106dFabrice Di Meglio                            Gravity.CENTER_VERTICAL | Gravity.END));
3440f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani                }
345a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa            }
3467bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff
347e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);
34848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
34948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
350dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey        mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
35118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getListView().setEmptyView(mEmptyView);
35218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
35344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (!mSetupWizardMode) {
354fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            registerForContextMenu(getListView());
355fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
356cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        setHasOptionsMenu(true);
35748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
35848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
35948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
3609c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onResume() {
36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
36248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
36348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.resume();
36448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
365590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
3669c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().registerReceiver(mReceiver, mFilter);
367b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        if (mKeyStoreNetworkId != INVALID_NETWORK_ID &&
368d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) {
3695cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff            mWifiManager.connect(mKeyStoreNetworkId, mConnectListener);
37048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
371b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        mKeyStoreNetworkId = INVALID_NETWORK_ID;
372e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
37358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
37448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
37548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
37648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
3779c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onPause() {
37848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
37948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
38048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
38148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
3829c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().unregisterReceiver(mReceiver);
38348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
38448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
38548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
3879c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
388cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
38944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (mSetupWizardMode) {
39044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            // FIXME: add setIcon() when graphics are available
39144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
392fc1281e6a80951321d9bc46c8eee27da1a4ba3edRussell Brenner                    .setIcon(R.drawable.ic_wps)
39344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setEnabled(wifiIsEnabled)
39444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
39544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
39644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setEnabled(wifiIsEnabled)
39744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
39844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        } else {
39990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
4004837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff                    .setIcon(R.drawable.ic_wps)
401dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
402dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
403e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
4044837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff                    .setIcon(R.drawable.ic_menu_add)
405dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
406dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
40790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
40890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    //.setIcon(R.drawable.ic_menu_scan_network)
40990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
4100c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
41190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin)
41290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
41390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4140c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff            if (mP2pSupported) {
4150c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                menu.add(Menu.NONE, MENU_ID_P2P, 0, R.string.wifi_menu_p2p)
4160c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                        .setEnabled(wifiIsEnabled)
4170c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                        .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4180c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff            }
419d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
420dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    //.setIcon(android.R.drawable.ic_menu_manage)
421348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
422fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
4239c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onCreateOptionsMenu(menu, inflater);
42448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
42548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
42648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4273d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public void onSaveInstanceState(Bundle outState) {
4283d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        super.onSaveInstanceState(outState);
4293d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4303d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // If the dialog is showing, save its state.
4313d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (mDialog != null && mDialog.isShowing()) {
4323d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit);
4333d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            if (mDlgAccessPoint != null) {
4343d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mAccessPointSavedState = new Bundle();
4353d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mDlgAccessPoint.saveWifiState(mAccessPointSavedState);
4363d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
4373d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            }
4383d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
4393d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
4403d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4413d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
44248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
44348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
44490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PBC:
44590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PBC_DIALOG_ID);
44690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
4476ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff            case MENU_ID_P2P:
4486ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                if (getActivity() instanceof PreferenceActivity) {
4496ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    ((PreferenceActivity) getActivity()).startPreferencePanel(
4506ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            WifiP2pSettings.class.getCanonicalName(),
4516ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            null,
4526ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            R.string.wifi_p2p_settings_title, null,
4536ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            this, 0);
4546ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                } else {
4556ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    startFragment(this, WifiP2pSettings.class.getCanonicalName(), -1, null);
4566ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                }
4576ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                return true;
45890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PIN:
45990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PIN_DIALOG_ID);
46090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
46148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
4622215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                if (mWifiManager.isWifiEnabled()) {
463c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff                    mScanner.forceScan();
4642215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                }
46548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
466e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case MENU_ID_ADD_NETWORK:
467e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mWifiManager.isWifiEnabled()) {
468e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    onAddNetworkPressed();
469e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
470e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                return true;
47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
4729eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                if (getActivity() instanceof PreferenceActivity) {
4739eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                    ((PreferenceActivity) getActivity()).startPreferencePanel(
474dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                            AdvancedWifiSettings.class.getCanonicalName(),
4759eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            null,
4769eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            R.string.wifi_advanced_titlebar, null,
4779eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            this, 0);
4789eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                } else {
479dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                    startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null);
4809eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                }
48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
48248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
48348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
48448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
48548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
48648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
48748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
488fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (info instanceof AdapterContextMenuInfo) {
48948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
49048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
49148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
49248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
493d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mSelectedAccessPoint = (AccessPoint) preference;
494d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                menu.setHeaderTitle(mSelectedAccessPoint.ssid);
495d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mSelectedAccessPoint.getLevel() != -1
496d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        && mSelectedAccessPoint.getState() == null) {
49748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
49848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
499b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
50048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
501f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
50248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
50348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
50448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
50548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
50648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
50748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
50848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
509d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mSelectedAccessPoint == null) {
51048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
51148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
51248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
513d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_CONNECT: {
514b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
515d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    if (!requireKeyStore(mSelectedAccessPoint.getConfig())) {
5165cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                        mWifiManager.connect(mSelectedAccessPoint.networkId,
5178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                mConnectListener);
51848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
519d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
52022d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    /** Bypass dialog for unsecured networks */
52122d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.generateOpenNetworkConfig();
5225cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                    mWifiManager.connect(mSelectedAccessPoint.getConfig(),
5238f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            mConnectListener);
52448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
525fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    showDialog(mSelectedAccessPoint, true);
52648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
52748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
528d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
529d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_FORGET: {
5305cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
53148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
532d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
533d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_MODIFY: {
534fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, true);
53548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
536d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
53748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
53848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
53948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
54048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
54148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
54248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
54348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
544d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mSelectedAccessPoint = (AccessPoint) preference;
54522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            /** Bypass dialog for unsecured, unsaved networks */
54622d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE &&
54722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
54822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                mSelectedAccessPoint.generateOpenNetworkConfig();
5495cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener);
55022d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            } else {
551fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, false);
55222d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            }
55348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
55448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
55548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
55648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
55748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
55848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
55948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
56048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
5613d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            removeDialog(WIFI_DIALOG_ID);
5623d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDialog = null;
5633d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
5643d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
5653d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // Save the access point and edit mode
5663d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgAccessPoint = accessPoint;
5673d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgEdit = edit;
5683d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
5693d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        showDialog(WIFI_DIALOG_ID);
5703d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
5713d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
5723d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
5733d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public Dialog onCreateDialog(int dialogId) {
57490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        switch (dialogId) {
57590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WIFI_DIALOG_ID:
57690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                AccessPoint ap = mDlgAccessPoint; // For manual launch
57790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                if (ap == null) { // For re-launch from saved state
57890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    if (mAccessPointSavedState != null) {
57990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        ap = new AccessPoint(getActivity(), mAccessPointSavedState);
58090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        // For repeated orientation changes
58190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mDlgAccessPoint = ap;
58290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    }
58390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                }
58490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                // If it's still null, fine, it's for Add Network
58590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mSelectedAccessPoint = ap;
58690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit);
58790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return mDialog;
58890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PBC_DIALOG_ID:
58990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.PBC);
59090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PIN_DIALOG_ID:
59190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
59290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        }
59390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        return super.onCreateDialog(dialogId);
59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
59548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
59648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private boolean requireKeyStore(WifiConfiguration config) {
597d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (WifiConfigController.requireKeyStore(config) &&
598d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                KeyStore.getInstance().state() != KeyStore.State.UNLOCKED) {
59948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mKeyStoreNetworkId = config.networkId;
6009c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa            Credentials.getInstance().unlock(getActivity());
60148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return true;
60248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
60348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return false;
60448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
60548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
606d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
607d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * Shows the latest access points available with supplimental information like
608d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * the strength of network and the security for it.
609d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
61048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
6119da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        // Safeguard from some delayed event handling
6129da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        if (getActivity() == null) return;
6139da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani
614e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final int wifiState = mWifiManager.getWifiState();
615e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
616e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (wifiState) {
617e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
618e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                // AccessPoints are automatically sorted with TreeSet.
619e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final Collection<AccessPoint> accessPoints = constructAccessPoints();
620fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                getPreferenceScreen().removeAll();
621fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                if(accessPoints.size() == 0) {
622fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    addMessagePreference(R.string.wifi_empty_list_wifi_on);
623fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                }
624fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                for (AccessPoint accessPoint : accessPoints) {
625fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    getPreferenceScreen().addPreference(accessPoint);
626e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
627e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
62886eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
62918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
63018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                getPreferenceScreen().removeAll();
63118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                break;
63218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
633e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLING:
634e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_stopping);
635e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
636e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
637e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
638e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_empty_list_wifi_off);
639e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
640d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
641d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
64248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
643e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private void addMessagePreference(int messageId) {
64418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        if (mEmptyView != null) mEmptyView.setText(messageId);
64518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getPreferenceScreen().removeAll();
646e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    }
647e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
648fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** Returns sorted list of access points */
649fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private List<AccessPoint> constructAccessPoints() {
650fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
651fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        /** Lookup table to more quickly update AccessPoints by only considering objects with the
652fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy         * correct SSID.  Maps SSID -> List of AccessPoints with the given SSID.  */
653fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
654d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
655d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
65648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
65748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
6589c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                AccessPoint accessPoint = new AccessPoint(getActivity(), config);
65948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoint.update(mLastInfo, mLastState);
66048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
661fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                apMap.put(accessPoint.ssid, accessPoint);
66248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
66348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
66448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
665d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<ScanResult> results = mWifiManager.getScanResults();
66648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
66748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
66848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
66948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
67048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
67148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
67248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
67348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
67448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
675cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                for (AccessPoint accessPoint : apMap.getAll(result.SSID)) {
676cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                    if (accessPoint.update(result))
677cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                        found = true;
67848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
67948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
680fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    AccessPoint accessPoint = new AccessPoint(getActivity(), result);
681fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    accessPoints.add(accessPoint);
682fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    apMap.put(accessPoint.ssid, accessPoint);
68348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
68448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
68548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
68648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
687cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        // Pre-sort accessPoints to speed preference insertion
688fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Collections.sort(accessPoints);
689d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return accessPoints;
69048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
69148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
692fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** A restricted multimap for use in constructAccessPoints */
693fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private class Multimap<K,V> {
694fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        private HashMap<K,List<V>> store = new HashMap<K,List<V>>();
695cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        /** retrieve a non-null list of values with key K */
696fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        List<V> getAll(K key) {
697cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            List<V> values = store.get(key);
698cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            return values != null ? values : Collections.<V>emptyList();
699fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
700fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
701fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        void put(K key, V val) {
702fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            List<V> curVals = store.get(key);
703fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            if (curVals == null) {
704fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                curVals = new ArrayList<V>(3);
705fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                store.put(key, curVals);
706fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            }
707fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            curVals.add(val);
708fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
709fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    }
710fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
7116377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff    private void handleEvent(Context context, Intent intent) {
71248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
71348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
71448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
71548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
716d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
717afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
718afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
719d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                updateAccessPoints();
72048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
721582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //Ignore supplicant state changes when network is connected
722582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and
723582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //introduce a broadcast that combines the supplicant and network
724582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //network state change events so the apps dont have to worry about
725582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //ignoring supplicant state change when network is connected
726582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //to get more fine grained information.
72709a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            SupplicantState state = (SupplicantState) intent.getParcelableExtra(
72809a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                    WifiManager.EXTRA_NEW_STATE);
72909a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            if (!mConnected.get() && SupplicantState.isHandshakeState(state)) {
73009a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                updateConnectionState(WifiInfo.getDetailedStateOf(state));
731582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            }
73248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
73379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
73479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng                    WifiManager.EXTRA_NETWORK_INFO);
735582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            mConnected.set(info.isConnected());
736d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            changeNextButtonState(info.isConnected());
737317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff            updateAccessPoints();
73879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            updateConnectionState(info.getDetailedState());
7390575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (mAutoFinishOnConnection && info.isConnected()) {
7400575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                getActivity().finish();
7410575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                return;
7420575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
74348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
74448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(null);
74548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
74648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
74748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
748af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private void updateConnectionState(DetailedState state) {
7492215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff        /* sticky broadcasts can call this when wifi is disabled */
750e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        if (!mWifiManager.isWifiEnabled()) {
751e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff            mScanner.pause();
7522215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff            return;
753e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        }
7542215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff
755af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh        if (state == DetailedState.OBTAINING_IPADDR) {
75648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
75748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
75848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
75948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
76048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
76148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
76248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state != null) {
76348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastState = state;
76448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
76548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
766e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) {
767d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // Maybe there's a WifiConfigPreference
768e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Preference preference = getPreferenceScreen().getPreference(i);
769d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (preference instanceof AccessPoint) {
77086eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                final AccessPoint accessPoint = (AccessPoint) preference;
77186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                accessPoint.update(mLastInfo, mLastState);
772d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
773d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
77448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
77548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
77648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
777e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getActivity().invalidateOptionsMenu();
778e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
779e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (state) {
780e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
781e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                mScanner.resume();
78218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                return; // not break, to avoid the call to pause() below
783e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
784e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
785e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_starting);
786e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
787e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
788e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
789e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_empty_list_wifi_off);
790e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
79148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
792e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
793c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastInfo = null;
794c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastState = null;
795e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        mScanner.pause();
79648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
79748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
79848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private class Scanner extends Handler {
79948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        private int mRetry = 0;
80048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
80148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void resume() {
80248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (!hasMessages(0)) {
80348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                sendEmptyMessage(0);
80448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
80548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
80648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
807c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        void forceScan() {
80822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            removeMessages(0);
809c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff            sendEmptyMessage(0);
810c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        }
811c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff
81248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void pause() {
81348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mRetry = 0;
81448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            removeMessages(0);
81548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
81648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
81748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        @Override
81848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        public void handleMessage(Message message) {
81948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (mWifiManager.startScanActive()) {
82048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
82148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (++mRetry >= 3) {
82248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
8239c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                Toast.makeText(getActivity(), R.string.wifi_fail_to_scan,
82448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        Toast.LENGTH_LONG).show();
825e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff                return;
82648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
827fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);
82848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
82948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
830d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
83158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
83258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Renames/replaces "Next" button when appropriate. "Next" button usually exists in
83358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Wifi setup screens, not in usual wifi settings screen.
83458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     *
83558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a wifi network.
83658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
83758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void changeNextButtonState(boolean connected) {
838fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (mEnableNextOnConnection && hasNextButton()) {
83958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            getNextButton().setEnabled(connected);
840d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
841d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
842d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
843d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(DialogInterface dialogInterface, int button) {
844fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
845fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            forget();
846fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        } else if (button == WifiDialog.BUTTON_SUBMIT) {
847fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            submit(mDialog.getController());
848d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
84958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
850d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
85158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void submit(WifiConfigController configController) {
852b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff
85390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        final WifiConfiguration config = configController.getConfig();
85490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
85590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        if (config == null) {
85690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null
85790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && !requireKeyStore(mSelectedAccessPoint.getConfig())
85890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
8595cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(mSelectedAccessPoint.networkId,
86090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mConnectListener);
86190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
86290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else if (config.networkId != INVALID_NETWORK_ID) {
86390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null) {
8645cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
86590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
86690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else {
86790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (configController.isEdit() || requireKeyStore(config)) {
8685cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
86990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            } else {
8705cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(config, mConnectListener);
87190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
872d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
873d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
87458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
87558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
87686eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        }
87758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
878d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
879d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
880d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void forget() {
8813ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
8823ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            // Should not happen, but a monkey seems to triger it
8833ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig());
8843ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            return;
8853ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        }
8863ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff
8875cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff        mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
888d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
88958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
89058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
89158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
89258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
893d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
89458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We need to rename/replace "Next" button in wifi setup context.
895d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        changeNextButtonState(false);
896d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
897d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
89858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
89958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Refreshes acccess points and ask Wifi module to scan networks again.
90058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
901d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void refreshAccessPoints() {
902d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
903d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mScanner.resume();
904d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
905d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
906e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getPreferenceScreen().removeAll();
907d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
908d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
90958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
91058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when "add network" button is pressed.
91158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
912d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void onAddNetworkPressed() {
91358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // No exact access point is selected.
914d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mSelectedAccessPoint = null;
915fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        showDialog(null, true);
916d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
917b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa
918b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    /* package */ int getAccessPointsCount() {
919e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
920e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (wifiIsEnabled) {
921e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            return getPreferenceScreen().getPreferenceCount();
922b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        } else {
923b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return 0;
924b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
925b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    }
92655de702961642521e247f155963644df81756215Daisuke Miyakawa
92758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
92858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
92958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
93058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void pauseWifiScan() {
93158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
93258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.pause();
93358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
93458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
93558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
93658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
93758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
93858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
93958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void resumeWifiScan() {
94058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
94158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
94258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
94355de702961642521e247f155963644df81756215Daisuke Miyakawa    }
944b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
945b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    @Override
946b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    protected int getHelpResource() {
94744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (mSetupWizardMode) {
94844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            return 0;
949fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
95044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        return R.string.help_url_wifi;
951b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    }
952fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
953fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    /**
954fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     * Used as the outer frame of all setup wizard pages that need to adjust their margins based
955fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     * on the total size of the available display. (e.g. side margins set to 10% of total width.)
956fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     */
957fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    public static class ProportionalOuterFrame extends RelativeLayout {
958fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context) {
959fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context);
960fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
961fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context, AttributeSet attrs) {
962fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context, attrs);
963fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
964fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context, AttributeSet attrs, int defStyle) {
965fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context, attrs, defStyle);
966fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
967fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
968fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        /**
969fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner         * Set our margins and title area height proportionally to the available display size
970fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner         */
971fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        @Override
972fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
973fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
974fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
975fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            final Resources resources = getContext().getResources();
976fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            float titleHeight = resources.getFraction(R.dimen.setup_title_height, 1, 1);
977fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            float sideMargin = resources.getFraction(R.dimen.setup_border_width, 1, 1);
978fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int bottom = resources.getDimensionPixelSize(R.dimen.setup_margin_bottom);
979fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            setPadding(
980fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    (int) (parentWidth * sideMargin),
981fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    0,
982fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    (int) (parentWidth * sideMargin),
983fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    bottom);
984fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            View title = findViewById(R.id.title_area);
985fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            if (title != null) {
986fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                title.setMinimumHeight((int) (parentHeight * titleHeight));
987fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            }
988fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
989fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
990fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    }
991fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
99248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
993