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;
2388c9f2889fafb53a2875418317ecd197d9aae883Russell Brennerimport android.app.AlertDialog;
2488c9f2889fafb53a2875418317ecd197d9aae883Russell Brennerimport android.app.AlertDialog.Builder;
253d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasaniimport android.app.Dialog;
2648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver;
2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context;
2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface;
2948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent;
3048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter;
31e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriffimport android.content.pm.PackageManager;
32fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.content.res.Resources;
3379470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager;
3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo;
35af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState;
3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult;
3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState;
3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration;
3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo;
4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager;
4190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriffimport android.net.wifi.WpsInfo;
4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle;
4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler;
4448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message;
4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference;
469e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.preference.PreferenceActivity;
4748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen;
4848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials;
4948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore;
5088c9f2889fafb53a2875418317ecd197d9aae883Russell Brennerimport android.telephony.TelephonyManager;
51fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.util.AttributeSet;
52590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log;
5348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu;
54e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo;
55e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.Gravity;
56fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.LayoutInflater;
5748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu;
589c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater;
5948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem;
6048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View;
61fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.View.OnClickListener;
62fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.ViewGroup;
639e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo;
6488c9f2889fafb53a2875418317ecd197d9aae883Russell Brennerimport android.widget.Button;
65fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.ImageButton;
669d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolbimport android.widget.PopupMenu;
679d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolbimport android.widget.PopupMenu.OnMenuItemClickListener;
68fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.RelativeLayout;
69e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch;
7018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView;
71e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast;
7248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
73590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R;
74590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment;
756ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriffimport com.android.settings.wifi.p2p.WifiP2pSettings;
76590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
7752727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList;
78d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection;
79fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.Collections;
80fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.HashMap;
8148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List;
82582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean;
8348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
84d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
85fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * Two types of UI are provided here.
86d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
87fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The first is for "usual Settings", appearing as any other Setup fragment.
88d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
89fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The second is for Setup Wizard, with a simplified interface that hides the action bar
90fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * and menus.
91d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
929c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment
93e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        implements DialogInterface.OnClickListener  {
94590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private static final String TAG = "WifiSettings";
9590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PBC = Menu.FIRST;
9690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
976ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_P2P = Menu.FIRST + 2;
986ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3;
996ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADVANCED = Menu.FIRST + 4;
1006ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_SCAN = Menu.FIRST + 5;
1016ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
1026ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_FORGET = Menu.FIRST + 7;
1036ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
10448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
1053d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final int WIFI_DIALOG_ID = 1;
10690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PBC_DIALOG_ID = 2;
10790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PIN_DIALOG_ID = 3;
10888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    private static final int WIFI_SKIPPED_DIALOG_ID = 4;
10988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    private static final int WIFI_AND_MOBILE_SKIPPED_DIALOG_ID = 5;
1103d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
111fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    // Combo scans can take 5-6s to complete - set to 10s.
112fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
113fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
1143d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Instance state keys
1153d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode";
1163d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
1173d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
11848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final IntentFilter mFilter;
11948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final BroadcastReceiver mReceiver;
12048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final Scanner mScanner;
12148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
12248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiManager mWifiManager;
1238f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mConnectListener;
1248f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mSaveListener;
1258f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mForgetListener;
126e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff    private boolean mP2pSupported;
12790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
1288f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiEnabler mWifiEnabler;
130d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    // An access point being editted is stored here.
131d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private AccessPoint mSelectedAccessPoint;
13248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
133af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private DetailedState mLastState;
13448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiInfo mLastInfo;
13548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
136582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff    private AtomicBoolean mConnected = new AtomicBoolean(false);
137582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff
138b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff    private int mKeyStoreNetworkId = INVALID_NETWORK_ID;
13948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
14058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiDialog mDialog;
141d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
14218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne    private TextView mEmptyView;
14318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
14458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* Used in Wifi Setup context */
145d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
14658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // this boolean extra specifies whether to disable the Next button when not connected
14758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect";
1480575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
1490575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    // this boolean extra specifies whether to auto finish when connection is established
1500575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect";
1510575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
15288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    // this boolean extra shows a custom button that we can control
15388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    protected static final String EXTRA_SHOW_CUSTOM_BUTTON = "wifi_show_custom_button";
15488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
15556a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner    // show a text regarding data charges when wifi connection is required during setup wizard
15656a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner    protected static final String EXTRA_SHOW_WIFI_REQUIRED_INFO = "wifi_show_wifi_required_info";
15756a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner
15844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    // this boolean extra is set if we are being invoked by the Setup Wizard
15944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    private static final String EXTRA_IS_FIRST_RUN = "firstRun";
16044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
16158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // should Next button only be enabled when we have a connection?
16258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mEnableNextOnConnection;
16386eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
1640575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    // should activity finish once we have a connection?
1650575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    private boolean mAutoFinishOnConnection;
1660575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
1673d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Save the dialog details
1683d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private boolean mDlgEdit;
1693d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private AccessPoint mDlgAccessPoint;
1703d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private Bundle mAccessPointSavedState;
1713d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
17244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    // the action bar uses a different set of controls for Setup Wizard
17344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    private boolean mSetupWizardMode;
174fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner
17558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* End of "used in Wifi Setup context" */
17679470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
177065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh    public WifiSettings() {
17848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter = new IntentFilter();
17948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
18048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
18148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
183afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
184afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
18548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
18648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
18748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
18848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mReceiver = new BroadcastReceiver() {
18948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            @Override
19048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            public void onReceive(Context context, Intent intent) {
1916377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                handleEvent(context, intent);
19248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
19348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        };
19448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
19548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner = new Scanner();
19648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
19748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
19848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
19944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    public void onCreate(Bundle icicle) {
20044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        // Set this flag early, as it's needed by getHelpResource(), which is called by super
20144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        mSetupWizardMode = getActivity().getIntent().getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
20244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
20344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        super.onCreate(icicle);
20444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    }
20544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
20644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    @Override
2079d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb    public View onCreateView(final LayoutInflater inflater, ViewGroup container,
208fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            Bundle savedInstanceState) {
209fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        if (mSetupWizardMode) {
210fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            View view = inflater.inflate(R.layout.setup_preference, container, false);
2119d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            View other = view.findViewById(R.id.other_network);
2129d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            other.setOnClickListener(new OnClickListener() {
2139d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                @Override
2149d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                public void onClick(View v) {
2159d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                    if (mWifiManager.isWifiEnabled()) {
2169d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                        onAddNetworkPressed();
217fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    }
2189d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                }
2199d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            });
2209d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            final ImageButton b = (ImageButton) view.findViewById(R.id.more);
2219d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            if (b != null) {
2229d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                b.setOnClickListener(new OnClickListener() {
223fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    @Override
224fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    public void onClick(View v) {
225fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                        if (mWifiManager.isWifiEnabled()) {
2269d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            PopupMenu pm = new PopupMenu(inflater.getContext(), b);
2279d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.inflate(R.menu.wifi_setup);
2289d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {
2299d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                @Override
2309d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                public boolean onMenuItemClick(MenuItem item) {
2319d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    if (R.id.wifi_wps == item.getItemId()) {
2329d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                        showDialog(WPS_PBC_DIALOG_ID);
2339d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                        return true;
2349d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    }
2359d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    return false;
2369d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                }
2379d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            });
2389d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.show();
239fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                        }
240fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    }
241fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                });
242fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            }
24388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
24456a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            Intent intent = getActivity().getIntent();
24556a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            if (intent.getBooleanExtra(EXTRA_SHOW_CUSTOM_BUTTON, false)) {
24688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                view.findViewById(R.id.button_bar).setVisibility(View.VISIBLE);
24788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                view.findViewById(R.id.back_button).setVisibility(View.INVISIBLE);
24888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                view.findViewById(R.id.skip_button).setVisibility(View.INVISIBLE);
24988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                view.findViewById(R.id.next_button).setVisibility(View.INVISIBLE);
25088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
25188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                Button customButton = (Button) view.findViewById(R.id.custom_button);
25288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                customButton.setVisibility(View.VISIBLE);
25388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                customButton.setOnClickListener(new OnClickListener() {
25488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                    @Override
25588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                    public void onClick(View v) {
25688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                        if (isPhone() && !hasSimProblem()) {
25788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            showDialog(WIFI_SKIPPED_DIALOG_ID);
25888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                        } else {
25988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            showDialog(WIFI_AND_MOBILE_SKIPPED_DIALOG_ID);
26088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                        }
26188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                    }
26288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                });
26388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            }
26488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
26556a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            if (intent.getBooleanExtra(EXTRA_SHOW_WIFI_REQUIRED_INFO, false)) {
26656a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner                view.findViewById(R.id.wifi_required_info).setVisibility(View.VISIBLE);
26756a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            }
26856a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner
269fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            return view;
270fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        } else {
271fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            return super.onCreateView(inflater, container, savedInstanceState);
272fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
273fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    }
274fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
275fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    @Override
2769c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
277852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner        super.onActivityCreated(savedInstanceState);
278852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner
279e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff        mP2pSupported = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT);
28048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
2818f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2828f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mConnectListener = new WifiManager.ActionListener() {
2838f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
2848f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2858f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
286001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       Activity activity = getActivity();
287001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       if (activity != null) {
288001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                           Toast.makeText(activity,
289001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                                R.string.wifi_failed_connect_message,
290001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                                Toast.LENGTH_SHORT).show();
291001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       }
2928f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2938f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
2948f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2958f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mSaveListener = new WifiManager.ActionListener() {
2968f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onSuccess() {
2978f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
2988f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onFailure(int reason) {
299001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    Activity activity = getActivity();
300001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    if (activity != null) {
301001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                        Toast.makeText(activity,
302001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                            R.string.wifi_failed_save_message,
303001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                            Toast.LENGTH_SHORT).show();
304001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    }
3058f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
3068f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            };
3078f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
3088f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mForgetListener = new WifiManager.ActionListener() {
3098f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
3108f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
3118f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
312001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       Activity activity = getActivity();
313001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       if (activity != null) {
314001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                           Toast.makeText(activity,
315001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                               R.string.wifi_failed_forget_message,
316001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                               Toast.LENGTH_SHORT).show();
317001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       }
3188f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
3198f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
3208f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
3213d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (savedInstanceState != null
3223d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
3233d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
3243d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
3253d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
32648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
3279c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Activity activity = getActivity();
3289c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Intent intent = activity.getIntent();
3299c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa
3300575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        // first if we're supposed to finish once we have a connection
3310575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
3320575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
3330575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        if (mAutoFinishOnConnection) {
3340575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            // Hide the next button
3350575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (hasNextButton()) {
3360575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                getNextButton().setVisibility(View.GONE);
3370575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
3380575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
3390575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            final ConnectivityManager connectivity = (ConnectivityManager)
340001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    activity.getSystemService(Context.CONNECTIVITY_SERVICE);
3410575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (connectivity != null
3420575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                    && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
3433067fbce2ebd74432cba03313a15fd4ead56265dRussell Brenner                activity.setResult(Activity.RESULT_OK);
3440575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                activity.finish();
3450575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                return;
3460575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
3470575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        }
3480575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
34979470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // if we're supposed to enable/disable the Next button based on our current connection
35079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // state, start it off in the right state
3519c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
352d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
353e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (mEnableNextOnConnection) {
354e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (hasNextButton()) {
355e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final ConnectivityManager connectivity = (ConnectivityManager)
356001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                        activity.getSystemService(Context.CONNECTIVITY_SERVICE);
357e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (connectivity != null) {
358e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    NetworkInfo info = connectivity.getNetworkInfo(
359e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ConnectivityManager.TYPE_WIFI);
360e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    changeNextButtonState(info.isConnected());
361d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
36279470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            }
363e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        }
36479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
365fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        addPreferencesFromResource(R.xml.wifi_settings);
366e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
36758d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner        if (mSetupWizardMode) {
36858d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner            getView().setSystemUiVisibility(
36958d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_BACK |
37058d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_HOME |
37158d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_RECENT |
37258d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS |
37358d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_CLOCK);
374bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn        }
375bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn
37644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        // On/off switch is hidden for Setup Wizard
37744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (!mSetupWizardMode) {
378e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Switch actionBarSwitch = new Switch(activity);
379e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
380e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (activity instanceof PreferenceActivity) {
381e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
382e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
383e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    final int padding = activity.getResources().getDimensionPixelSize(
384e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            R.dimen.action_bar_switch_padding);
385e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    actionBarSwitch.setPadding(0, 0, padding, 0);
386e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
387e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.DISPLAY_SHOW_CUSTOM);
388e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
389e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
390e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
39179d8e80a304922c34a6bd344f1fa49dd7dfd106dFabrice Di Meglio                            Gravity.CENTER_VERTICAL | Gravity.END));
3920f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani                }
393a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa            }
3947bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff
395e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);
39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
398dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey        mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
39918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getListView().setEmptyView(mEmptyView);
40018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
40144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (!mSetupWizardMode) {
402fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            registerForContextMenu(getListView());
403fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
404cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        setHasOptionsMenu(true);
40548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
40648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
40748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4089c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onResume() {
40948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
41048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
41148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.resume();
41248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
413590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
4149c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().registerReceiver(mReceiver, mFilter);
415b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        if (mKeyStoreNetworkId != INVALID_NETWORK_ID &&
416d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) {
4175cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff            mWifiManager.connect(mKeyStoreNetworkId, mConnectListener);
41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
419b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        mKeyStoreNetworkId = INVALID_NETWORK_ID;
420e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
42158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
42248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
42348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
42448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4259c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onPause() {
42648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
42748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
42848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
42948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
4309c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().unregisterReceiver(mReceiver);
43148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
43248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
43348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
43448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4359c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
436cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
43744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (mSetupWizardMode) {
43844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            // FIXME: add setIcon() when graphics are available
43944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
440fc1281e6a80951321d9bc46c8eee27da1a4ba3edRussell Brenner                    .setIcon(R.drawable.ic_wps)
44144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setEnabled(wifiIsEnabled)
44244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
44344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
44444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setEnabled(wifiIsEnabled)
44544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
44644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        } else {
44790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
4484837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff                    .setIcon(R.drawable.ic_wps)
449dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
450dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
451e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
4524837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff                    .setIcon(R.drawable.ic_menu_add)
453dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
454dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
45590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
45690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    //.setIcon(R.drawable.ic_menu_scan_network)
45790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
4580c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
45990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin)
46090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
46190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4620c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff            if (mP2pSupported) {
4630c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                menu.add(Menu.NONE, MENU_ID_P2P, 0, R.string.wifi_menu_p2p)
4640c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                        .setEnabled(wifiIsEnabled)
4650c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                        .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4660c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff            }
467d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
468dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    //.setIcon(android.R.drawable.ic_menu_manage)
469348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
470fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
4719c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onCreateOptionsMenu(menu, inflater);
47248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
47348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
47448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4753d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public void onSaveInstanceState(Bundle outState) {
4763d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        super.onSaveInstanceState(outState);
4773d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4783d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // If the dialog is showing, save its state.
4793d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (mDialog != null && mDialog.isShowing()) {
4803d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit);
4813d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            if (mDlgAccessPoint != null) {
4823d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mAccessPointSavedState = new Bundle();
4833d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mDlgAccessPoint.saveWifiState(mAccessPointSavedState);
4843d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
4853d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            }
4863d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
4873d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
4883d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4893d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
49048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
49148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
49290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PBC:
49390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PBC_DIALOG_ID);
49490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
4956ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff            case MENU_ID_P2P:
4966ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                if (getActivity() instanceof PreferenceActivity) {
4976ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    ((PreferenceActivity) getActivity()).startPreferencePanel(
4986ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            WifiP2pSettings.class.getCanonicalName(),
4996ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            null,
5006ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            R.string.wifi_p2p_settings_title, null,
5016ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            this, 0);
5026ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                } else {
5036ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    startFragment(this, WifiP2pSettings.class.getCanonicalName(), -1, null);
5046ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                }
5056ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                return true;
50690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PIN:
50790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PIN_DIALOG_ID);
50890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
50948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
5102215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                if (mWifiManager.isWifiEnabled()) {
511c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff                    mScanner.forceScan();
5122215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                }
51348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
514e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case MENU_ID_ADD_NETWORK:
515e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mWifiManager.isWifiEnabled()) {
516e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    onAddNetworkPressed();
517e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
518e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                return true;
51948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
5209eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                if (getActivity() instanceof PreferenceActivity) {
5219eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                    ((PreferenceActivity) getActivity()).startPreferencePanel(
522dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                            AdvancedWifiSettings.class.getCanonicalName(),
5239eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            null,
5249eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            R.string.wifi_advanced_titlebar, null,
5259eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            this, 0);
5269eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                } else {
527dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                    startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null);
5289eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                }
52948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
53048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
53148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
53248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
53348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
53448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
53548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
536fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (info instanceof AdapterContextMenuInfo) {
53748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
53848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
53948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
54048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
541d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mSelectedAccessPoint = (AccessPoint) preference;
542d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                menu.setHeaderTitle(mSelectedAccessPoint.ssid);
543d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mSelectedAccessPoint.getLevel() != -1
544d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        && mSelectedAccessPoint.getState() == null) {
54548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
54648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
547b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
54848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
549f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
55048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
55148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
55248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
55348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
55448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
55548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
55648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
557d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mSelectedAccessPoint == null) {
55848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
55948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
56048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
561d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_CONNECT: {
562b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
563d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    if (!requireKeyStore(mSelectedAccessPoint.getConfig())) {
5645cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                        mWifiManager.connect(mSelectedAccessPoint.networkId,
5658f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                mConnectListener);
56648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
567d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
56822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    /** Bypass dialog for unsecured networks */
56922d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.generateOpenNetworkConfig();
5705cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                    mWifiManager.connect(mSelectedAccessPoint.getConfig(),
5718f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            mConnectListener);
57248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
573fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    showDialog(mSelectedAccessPoint, true);
57448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
57548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
576d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
577d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_FORGET: {
5785cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
57948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
580d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
581d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_MODIFY: {
582fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, true);
58348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
584d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
58548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
58648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
58748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
58848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
58948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
59048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
59148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
592d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mSelectedAccessPoint = (AccessPoint) preference;
59322d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            /** Bypass dialog for unsecured, unsaved networks */
59422d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE &&
59522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
59622d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                mSelectedAccessPoint.generateOpenNetworkConfig();
5975cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener);
59822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            } else {
599fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, false);
60022d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            }
60148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
60248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
60348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
60448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
60548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
60648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
60748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
60848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
6093d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            removeDialog(WIFI_DIALOG_ID);
6103d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDialog = null;
6113d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
6123d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6133d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // Save the access point and edit mode
6143d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgAccessPoint = accessPoint;
6153d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgEdit = edit;
6163d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6173d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        showDialog(WIFI_DIALOG_ID);
6183d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
6193d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6203d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
6213d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public Dialog onCreateDialog(int dialogId) {
62290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        switch (dialogId) {
62390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WIFI_DIALOG_ID:
62490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                AccessPoint ap = mDlgAccessPoint; // For manual launch
62590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                if (ap == null) { // For re-launch from saved state
62690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    if (mAccessPointSavedState != null) {
62790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        ap = new AccessPoint(getActivity(), mAccessPointSavedState);
62890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        // For repeated orientation changes
62990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mDlgAccessPoint = ap;
63090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    }
63190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                }
63290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                // If it's still null, fine, it's for Add Network
63390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mSelectedAccessPoint = ap;
63490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit);
63590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return mDialog;
63690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PBC_DIALOG_ID:
63790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.PBC);
63890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PIN_DIALOG_ID:
63990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
64088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            case WIFI_SKIPPED_DIALOG_ID:
64188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                return new AlertDialog.Builder(getActivity())
64288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setMessage(R.string.wifi_skipped_message)
64388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setCancelable(false)
64488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setNegativeButton(R.string.wifi_skip_anyway,
64588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
64688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
64788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
64888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    getActivity().setResult(Activity.RESULT_CANCELED);
64988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    getActivity().finish();
65088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
65188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
65288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setPositiveButton(R.string.wifi_dont_skip,
65388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
65488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
65588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
65688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
65788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
65888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .create();
65988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            case WIFI_AND_MOBILE_SKIPPED_DIALOG_ID:
66088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                return new AlertDialog.Builder(getActivity())
66188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setMessage(R.string.wifi_and_mobile_skipped_message)
66288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setCancelable(false)
66388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setNegativeButton(R.string.wifi_skip_anyway,
66488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
66588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
66688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
66788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    getActivity().setResult(Activity.RESULT_CANCELED);
66888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    getActivity().finish();
66988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
67088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
67188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setPositiveButton(R.string.wifi_dont_skip,
67288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
67388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
67488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
67588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
67688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
67788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .create();
67888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
67990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        }
68090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        return super.onCreateDialog(dialogId);
68148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
68248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
68388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    private boolean isPhone() {
68488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner        final TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(
68588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                Context.TELEPHONY_SERVICE);
68688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner        return telephonyManager != null
68788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                && telephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE;
68888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    }
68988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
69088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    /**
69188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    * Return true if there's any SIM related impediment to connectivity.
69288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    * Treats Unknown as OK. (Only returns true if we're sure of a SIM problem.)
69388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    */
69488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner   protected boolean hasSimProblem() {
69588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner       final TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(
69688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner               Context.TELEPHONY_SERVICE);
69788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner       return telephonyManager != null
69888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner               && telephonyManager.getCurrentPhoneType() == TelephonyManager.PHONE_TYPE_GSM
69988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner               && telephonyManager.getSimState() != TelephonyManager.SIM_STATE_READY
70088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner               && telephonyManager.getSimState() != TelephonyManager.SIM_STATE_UNKNOWN;
70188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner   }
70288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
70348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private boolean requireKeyStore(WifiConfiguration config) {
704d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (WifiConfigController.requireKeyStore(config) &&
705d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                KeyStore.getInstance().state() != KeyStore.State.UNLOCKED) {
70648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mKeyStoreNetworkId = config.networkId;
7079c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa            Credentials.getInstance().unlock(getActivity());
70848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return true;
70948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
71048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return false;
71148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
71248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
713d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
714d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * Shows the latest access points available with supplimental information like
715d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * the strength of network and the security for it.
716d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
71748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
7189da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        // Safeguard from some delayed event handling
7199da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        if (getActivity() == null) return;
7209da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani
721e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final int wifiState = mWifiManager.getWifiState();
722e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
723e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (wifiState) {
724e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
725e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                // AccessPoints are automatically sorted with TreeSet.
726e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final Collection<AccessPoint> accessPoints = constructAccessPoints();
727fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                getPreferenceScreen().removeAll();
728fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                if(accessPoints.size() == 0) {
729fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    addMessagePreference(R.string.wifi_empty_list_wifi_on);
730fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                }
731fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                for (AccessPoint accessPoint : accessPoints) {
732fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    getPreferenceScreen().addPreference(accessPoint);
733e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
734e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
73586eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
73618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
73718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                getPreferenceScreen().removeAll();
73818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                break;
73918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
740e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLING:
741e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_stopping);
742e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
743e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
744e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
745e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_empty_list_wifi_off);
746e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
747d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
748d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
74948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
750e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private void addMessagePreference(int messageId) {
75118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        if (mEmptyView != null) mEmptyView.setText(messageId);
75218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getPreferenceScreen().removeAll();
753e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    }
754e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
755fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** Returns sorted list of access points */
756fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private List<AccessPoint> constructAccessPoints() {
757fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
758fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        /** Lookup table to more quickly update AccessPoints by only considering objects with the
759fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy         * correct SSID.  Maps SSID -> List of AccessPoints with the given SSID.  */
760fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
761d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
762d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
76348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
76448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
7659c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                AccessPoint accessPoint = new AccessPoint(getActivity(), config);
76648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoint.update(mLastInfo, mLastState);
76748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
768fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                apMap.put(accessPoint.ssid, accessPoint);
76948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
77048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
77148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
772d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<ScanResult> results = mWifiManager.getScanResults();
77348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
77448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
77548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
77648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
77748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
77848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
77948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
78048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
78148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
782cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                for (AccessPoint accessPoint : apMap.getAll(result.SSID)) {
783cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                    if (accessPoint.update(result))
784cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                        found = true;
78548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
78648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
787fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    AccessPoint accessPoint = new AccessPoint(getActivity(), result);
788fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    accessPoints.add(accessPoint);
789fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    apMap.put(accessPoint.ssid, accessPoint);
79048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
79148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
79248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
79348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
794cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        // Pre-sort accessPoints to speed preference insertion
795fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Collections.sort(accessPoints);
796d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return accessPoints;
79748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
79848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
799fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** A restricted multimap for use in constructAccessPoints */
800fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private class Multimap<K,V> {
801fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        private HashMap<K,List<V>> store = new HashMap<K,List<V>>();
802cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        /** retrieve a non-null list of values with key K */
803fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        List<V> getAll(K key) {
804cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            List<V> values = store.get(key);
805cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            return values != null ? values : Collections.<V>emptyList();
806fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
807fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
808fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        void put(K key, V val) {
809fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            List<V> curVals = store.get(key);
810fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            if (curVals == null) {
811fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                curVals = new ArrayList<V>(3);
812fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                store.put(key, curVals);
813fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            }
814fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            curVals.add(val);
815fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
816fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    }
817fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
8186377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff    private void handleEvent(Context context, Intent intent) {
81948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
82048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
82148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
82248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
823d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
824afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
825afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
826d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                updateAccessPoints();
82748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
828582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //Ignore supplicant state changes when network is connected
829582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and
830582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //introduce a broadcast that combines the supplicant and network
831582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //network state change events so the apps dont have to worry about
832582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //ignoring supplicant state change when network is connected
833582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //to get more fine grained information.
83409a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            SupplicantState state = (SupplicantState) intent.getParcelableExtra(
83509a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                    WifiManager.EXTRA_NEW_STATE);
83609a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            if (!mConnected.get() && SupplicantState.isHandshakeState(state)) {
83709a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                updateConnectionState(WifiInfo.getDetailedStateOf(state));
838582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            }
83948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
84079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
84179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng                    WifiManager.EXTRA_NETWORK_INFO);
842582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            mConnected.set(info.isConnected());
843d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            changeNextButtonState(info.isConnected());
844317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff            updateAccessPoints();
84579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            updateConnectionState(info.getDetailedState());
8460575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (mAutoFinishOnConnection && info.isConnected()) {
847001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                Activity activity = getActivity();
848001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                if (activity != null) {
8493067fbce2ebd74432cba03313a15fd4ead56265dRussell Brenner                    activity.setResult(Activity.RESULT_OK);
850001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    activity.finish();
851001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                }
8520575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                return;
8530575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
85448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
85548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(null);
85648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
85748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
85848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
859af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private void updateConnectionState(DetailedState state) {
8602215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff        /* sticky broadcasts can call this when wifi is disabled */
861e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        if (!mWifiManager.isWifiEnabled()) {
862e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff            mScanner.pause();
8632215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff            return;
864e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        }
8652215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff
866af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh        if (state == DetailedState.OBTAINING_IPADDR) {
86748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
86848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
86948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
87048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
87148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
87248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
87348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state != null) {
87448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastState = state;
87548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
87648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
877e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) {
878d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // Maybe there's a WifiConfigPreference
879e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Preference preference = getPreferenceScreen().getPreference(i);
880d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (preference instanceof AccessPoint) {
88186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                final AccessPoint accessPoint = (AccessPoint) preference;
88286eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                accessPoint.update(mLastInfo, mLastState);
883d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
884d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
88548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
88648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
88748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
888001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        Activity activity = getActivity();
889001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        if (activity != null) {
890001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville            activity.invalidateOptionsMenu();
891001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        }
892e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
893e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (state) {
894e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
895e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                mScanner.resume();
89618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                return; // not break, to avoid the call to pause() below
897e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
898e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
899e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_starting);
900e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
901e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
902e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
903e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_empty_list_wifi_off);
904e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
90548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
906e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
907c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastInfo = null;
908c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastState = null;
909e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        mScanner.pause();
91048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
91148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
91248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private class Scanner extends Handler {
91348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        private int mRetry = 0;
91448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
91548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void resume() {
91648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (!hasMessages(0)) {
91748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                sendEmptyMessage(0);
91848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
91948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
92048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
921c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        void forceScan() {
92222d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            removeMessages(0);
923c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff            sendEmptyMessage(0);
924c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        }
925c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff
92648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void pause() {
92748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mRetry = 0;
92848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            removeMessages(0);
92948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
93048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
93148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        @Override
93248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        public void handleMessage(Message message) {
93348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (mWifiManager.startScanActive()) {
93448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
93548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (++mRetry >= 3) {
93648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
937001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                Activity activity = getActivity();
938001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                if (activity != null) {
939001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    Toast.makeText(activity, R.string.wifi_fail_to_scan,
940001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                            Toast.LENGTH_LONG).show();
941001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                }
942e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff                return;
94348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
944fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);
94548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
94648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
947d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
94858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
94958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Renames/replaces "Next" button when appropriate. "Next" button usually exists in
95058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Wifi setup screens, not in usual wifi settings screen.
95158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     *
95258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a wifi network.
95358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
95458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void changeNextButtonState(boolean connected) {
955fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (mEnableNextOnConnection && hasNextButton()) {
95658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            getNextButton().setEnabled(connected);
957d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
958d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
959d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
960d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(DialogInterface dialogInterface, int button) {
961fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
962fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            forget();
963fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        } else if (button == WifiDialog.BUTTON_SUBMIT) {
964fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            submit(mDialog.getController());
965d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
96658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
967d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
96858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void submit(WifiConfigController configController) {
969b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff
97090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        final WifiConfiguration config = configController.getConfig();
97190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
97290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        if (config == null) {
97390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null
97490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && !requireKeyStore(mSelectedAccessPoint.getConfig())
97590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
9765cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(mSelectedAccessPoint.networkId,
97790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mConnectListener);
97890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
97990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else if (config.networkId != INVALID_NETWORK_ID) {
98090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null) {
9815cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
98290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
98390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else {
98490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (configController.isEdit() || requireKeyStore(config)) {
9855cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
98690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            } else {
9875cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(config, mConnectListener);
98890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
989d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
990d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
99158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
99258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
99386eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        }
99458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
995d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
996d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
997d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void forget() {
9983ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
9993ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            // Should not happen, but a monkey seems to triger it
10003ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig());
10013ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            return;
10023ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        }
10033ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff
10045cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff        mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
1005d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
100658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
100758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
100858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
100958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
1010d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
101158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We need to rename/replace "Next" button in wifi setup context.
1012d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        changeNextButtonState(false);
1013d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1014d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
101558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
101658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Refreshes acccess points and ask Wifi module to scan networks again.
101758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
1018d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void refreshAccessPoints() {
1019d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
1020d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mScanner.resume();
1021d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
1022d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
1023e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getPreferenceScreen().removeAll();
1024d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1025d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
102658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
102758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when "add network" button is pressed.
102858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
1029d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void onAddNetworkPressed() {
103058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // No exact access point is selected.
1031d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mSelectedAccessPoint = null;
1032fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        showDialog(null, true);
1033d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1034b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa
1035b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    /* package */ int getAccessPointsCount() {
1036e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
1037e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (wifiIsEnabled) {
1038e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            return getPreferenceScreen().getPreferenceCount();
1039b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        } else {
1040b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return 0;
1041b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
1042b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    }
104355de702961642521e247f155963644df81756215Daisuke Miyakawa
104458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
104558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
104658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
104758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void pauseWifiScan() {
104858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
104958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.pause();
105058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
105158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
105258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
105358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
105458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
105558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
105658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void resumeWifiScan() {
105758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
105858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
105958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
106055de702961642521e247f155963644df81756215Daisuke Miyakawa    }
1061b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
1062b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    @Override
1063b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    protected int getHelpResource() {
106444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (mSetupWizardMode) {
106544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            return 0;
1066fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
106744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        return R.string.help_url_wifi;
1068b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    }
1069fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
1070fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    /**
1071fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     * Used as the outer frame of all setup wizard pages that need to adjust their margins based
1072fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     * on the total size of the available display. (e.g. side margins set to 10% of total width.)
1073fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     */
1074fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    public static class ProportionalOuterFrame extends RelativeLayout {
1075fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context) {
1076fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context);
1077fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1078fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context, AttributeSet attrs) {
1079fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context, attrs);
1080fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1081fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context, AttributeSet attrs, int defStyle) {
1082fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context, attrs, defStyle);
1083fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1084fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
1085fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        /**
1086fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner         * Set our margins and title area height proportionally to the available display size
1087fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner         */
1088fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        @Override
1089fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1090fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
1091fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
1092fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            final Resources resources = getContext().getResources();
1093fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            float titleHeight = resources.getFraction(R.dimen.setup_title_height, 1, 1);
1094fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            float sideMargin = resources.getFraction(R.dimen.setup_border_width, 1, 1);
1095fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int bottom = resources.getDimensionPixelSize(R.dimen.setup_margin_bottom);
1096fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            setPadding(
1097fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    (int) (parentWidth * sideMargin),
1098fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    0,
1099fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    (int) (parentWidth * sideMargin),
1100fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    bottom);
1101fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            View title = findViewById(R.id.title_area);
1102fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            if (title != null) {
1103fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                title.setMinimumHeight((int) (parentHeight * titleHeight));
1104fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            }
1105fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
1106fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1107fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    }
1108fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
110948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
1110