WifiSettings.java revision 7e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4
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;
207e61c233061b4e87257a332be83f72f840d07c62Maggie Benthallimport static android.os.UserManager.DISALLOW_CONFIG_WIFI;
215d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa
22e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.app.ActionBar;
239c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.app.Activity;
2488c9f2889fafb53a2875418317ecd197d9aae883Russell Brennerimport android.app.AlertDialog;
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;
337e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwaltimport android.location.LocationManager;
3479470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager;
3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo;
36af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState;
3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult;
3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState;
3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration;
4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo;
4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager;
4290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriffimport android.net.wifi.WpsInfo;
4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle;
4448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler;
4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message;
467e61c233061b4e87257a332be83f72f840d07c62Maggie Benthallimport android.os.UserManager;
4748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference;
489e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.preference.PreferenceActivity;
4948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen;
507e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwaltimport android.provider.Settings;
5188c9f2889fafb53a2875418317ecd197d9aae883Russell Brennerimport android.telephony.TelephonyManager;
52fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.util.AttributeSet;
53590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log;
5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu;
55e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo;
56e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.Gravity;
57fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.LayoutInflater;
5848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu;
599c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater;
6048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem;
6148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View;
62fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.View.OnClickListener;
63fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.ViewGroup;
649e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo;
6588c9f2889fafb53a2875418317ecd197d9aae883Russell Brennerimport android.widget.Button;
66fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.ImageButton;
679d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolbimport android.widget.PopupMenu;
689d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolbimport android.widget.PopupMenu.OnMenuItemClickListener;
69fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.RelativeLayout;
70e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch;
7118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView;
72e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast;
7348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
74590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R;
75590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment;
766ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriffimport com.android.settings.wifi.p2p.WifiP2pSettings;
77590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
7852727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList;
79d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection;
80fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.Collections;
81fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.HashMap;
8248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List;
83582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean;
8448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
85d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
86fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * Two types of UI are provided here.
87d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
88fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The first is for "usual Settings", appearing as any other Setup fragment.
89d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
90fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The second is for Setup Wizard, with a simplified interface that hides the action bar
91fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * and menus.
92d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
939c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment
94e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        implements DialogInterface.OnClickListener  {
95590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private static final String TAG = "WifiSettings";
9690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PBC = Menu.FIRST;
9790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
986ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_P2P = Menu.FIRST + 2;
996ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3;
1006ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADVANCED = Menu.FIRST + 4;
1016ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_SCAN = Menu.FIRST + 5;
1026ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
1036ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_FORGET = Menu.FIRST + 7;
1046ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
10548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
1063d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final int WIFI_DIALOG_ID = 1;
10790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PBC_DIALOG_ID = 2;
10890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PIN_DIALOG_ID = 3;
10988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    private static final int WIFI_SKIPPED_DIALOG_ID = 4;
11088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    private static final int WIFI_AND_MOBILE_SKIPPED_DIALOG_ID = 5;
1113d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
112fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    // Combo scans can take 5-6s to complete - set to 10s.
113fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
114fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
1153d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Instance state keys
1163d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode";
1173d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
1183d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
119eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner    // Activity result when pressing the Skip button
120eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner    private static final int RESULT_SKIP = Activity.RESULT_FIRST_USER;
121eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner
12248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final IntentFilter mFilter;
12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final BroadcastReceiver mReceiver;
12448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final Scanner mScanner;
12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiManager mWifiManager;
1278f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mConnectListener;
1288f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mSaveListener;
1298f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mForgetListener;
130e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff    private boolean mP2pSupported;
13190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
1328f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
1337e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall    private UserManager mUserManager;
1347e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall
13548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiEnabler mWifiEnabler;
136d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    // An access point being editted is stored here.
137d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private AccessPoint mSelectedAccessPoint;
13848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
139af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private DetailedState mLastState;
14048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiInfo mLastInfo;
14148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
142582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff    private AtomicBoolean mConnected = new AtomicBoolean(false);
143582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff
14458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiDialog mDialog;
145d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
14618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne    private TextView mEmptyView;
14718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
14858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* Used in Wifi Setup context */
149d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
15058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // this boolean extra specifies whether to disable the Next button when not connected
15158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect";
1520575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
1530575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    // this boolean extra specifies whether to auto finish when connection is established
1540575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect";
1550575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
15688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    // this boolean extra shows a custom button that we can control
15788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    protected static final String EXTRA_SHOW_CUSTOM_BUTTON = "wifi_show_custom_button";
15888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
15956a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner    // show a text regarding data charges when wifi connection is required during setup wizard
16056a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner    protected static final String EXTRA_SHOW_WIFI_REQUIRED_INFO = "wifi_show_wifi_required_info";
16156a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner
16244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    // this boolean extra is set if we are being invoked by the Setup Wizard
16344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    private static final String EXTRA_IS_FIRST_RUN = "firstRun";
16444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
16558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // should Next button only be enabled when we have a connection?
16658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mEnableNextOnConnection;
16786eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
1680575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    // should activity finish once we have a connection?
1690575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn    private boolean mAutoFinishOnConnection;
1700575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
1713d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Save the dialog details
1723d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private boolean mDlgEdit;
1733d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private AccessPoint mDlgAccessPoint;
1743d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private Bundle mAccessPointSavedState;
1753d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
17644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    // the action bar uses a different set of controls for Setup Wizard
17744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    private boolean mSetupWizardMode;
178fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner
17958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* End of "used in Wifi Setup context" */
18079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
181065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh    public WifiSettings() {
18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter = new IntentFilter();
18348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
18448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
18548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
18648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
187afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
188afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
18948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
19048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
19148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
19248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mReceiver = new BroadcastReceiver() {
19348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            @Override
19448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            public void onReceive(Context context, Intent intent) {
1956377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                handleEvent(context, intent);
19648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
19748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        };
19848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
19948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner = new Scanner();
20048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
20148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
20248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
20344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    public void onCreate(Bundle icicle) {
20444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        // Set this flag early, as it's needed by getHelpResource(), which is called by super
20544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        mSetupWizardMode = getActivity().getIntent().getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
20644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
20744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        super.onCreate(icicle);
20844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    }
20944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner
21044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner    @Override
2119d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb    public View onCreateView(final LayoutInflater inflater, ViewGroup container,
212fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            Bundle savedInstanceState) {
213fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        if (mSetupWizardMode) {
214fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            View view = inflater.inflate(R.layout.setup_preference, container, false);
2159d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            View other = view.findViewById(R.id.other_network);
2169d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            other.setOnClickListener(new OnClickListener() {
2179d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                @Override
2189d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                public void onClick(View v) {
2199d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                    if (mWifiManager.isWifiEnabled()) {
2209d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                        onAddNetworkPressed();
221fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    }
2229d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                }
2239d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            });
2249d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            final ImageButton b = (ImageButton) view.findViewById(R.id.more);
2259d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb            if (b != null) {
2269d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                b.setOnClickListener(new OnClickListener() {
227fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    @Override
228fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    public void onClick(View v) {
229fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                        if (mWifiManager.isWifiEnabled()) {
2309d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            PopupMenu pm = new PopupMenu(inflater.getContext(), b);
2319d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.inflate(R.menu.wifi_setup);
2329d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {
2339d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                @Override
2349d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                public boolean onMenuItemClick(MenuItem item) {
2359d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    if (R.id.wifi_wps == item.getItemId()) {
2369d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                        showDialog(WPS_PBC_DIALOG_ID);
2379d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                        return true;
2389d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    }
2399d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                    return false;
2409d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                                }
2419d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            });
2429d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb                            pm.show();
243fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                        }
244fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    }
245fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                });
246fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            }
24788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
24856a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            Intent intent = getActivity().getIntent();
24956a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            if (intent.getBooleanExtra(EXTRA_SHOW_CUSTOM_BUTTON, false)) {
25088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                view.findViewById(R.id.button_bar).setVisibility(View.VISIBLE);
25188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                view.findViewById(R.id.back_button).setVisibility(View.INVISIBLE);
25288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                view.findViewById(R.id.skip_button).setVisibility(View.INVISIBLE);
25388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                view.findViewById(R.id.next_button).setVisibility(View.INVISIBLE);
25488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
25588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                Button customButton = (Button) view.findViewById(R.id.custom_button);
25688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                customButton.setVisibility(View.VISIBLE);
25788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                customButton.setOnClickListener(new OnClickListener() {
25888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                    @Override
25988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                    public void onClick(View v) {
26088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                        if (isPhone() && !hasSimProblem()) {
26188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            showDialog(WIFI_SKIPPED_DIALOG_ID);
26288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                        } else {
26388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            showDialog(WIFI_AND_MOBILE_SKIPPED_DIALOG_ID);
26488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                        }
26588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                    }
26688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                });
26788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            }
26888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
26956a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            if (intent.getBooleanExtra(EXTRA_SHOW_WIFI_REQUIRED_INFO, false)) {
27056a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner                view.findViewById(R.id.wifi_required_info).setVisibility(View.VISIBLE);
27156a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            }
27256a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner
273fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            return view;
274fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        } else {
275fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            return super.onCreateView(inflater, container, savedInstanceState);
276fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
277fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    }
278fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
279fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    @Override
2809c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
281852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner        super.onActivityCreated(savedInstanceState);
282852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner
283e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff        mP2pSupported = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT);
28448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
2857e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
2868f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2878f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mConnectListener = new WifiManager.ActionListener() {
288eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
2898f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
2908f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
291eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
2928f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
293001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       Activity activity = getActivity();
294001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       if (activity != null) {
295001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                           Toast.makeText(activity,
296001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                                R.string.wifi_failed_connect_message,
297001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                                Toast.LENGTH_SHORT).show();
298001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       }
2998f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
3008f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
3018f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
3028f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mSaveListener = new WifiManager.ActionListener() {
303eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                @Override
3048f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onSuccess() {
3058f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
306eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                @Override
3078f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onFailure(int reason) {
308001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    Activity activity = getActivity();
309001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    if (activity != null) {
310001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                        Toast.makeText(activity,
311001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                            R.string.wifi_failed_save_message,
312001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                            Toast.LENGTH_SHORT).show();
313001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    }
3148f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
3158f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            };
3168f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
3178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mForgetListener = new WifiManager.ActionListener() {
318eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
3198f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
3208f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
321eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
3228f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
323001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       Activity activity = getActivity();
324001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       if (activity != null) {
325001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                           Toast.makeText(activity,
326001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                               R.string.wifi_failed_forget_message,
327001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                               Toast.LENGTH_SHORT).show();
328001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       }
3298f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
3308f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
3318f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
3323d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (savedInstanceState != null
3333d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
3343d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
3353d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
3363d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
33748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
3389c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Activity activity = getActivity();
3399c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Intent intent = activity.getIntent();
3409c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa
3410575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        // first if we're supposed to finish once we have a connection
3420575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
3430575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
3440575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        if (mAutoFinishOnConnection) {
3450575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            // Hide the next button
3460575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (hasNextButton()) {
3470575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                getNextButton().setVisibility(View.GONE);
3480575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
3490575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
3500575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            final ConnectivityManager connectivity = (ConnectivityManager)
351001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    activity.getSystemService(Context.CONNECTIVITY_SERVICE);
3520575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (connectivity != null
3530575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                    && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
3543067fbce2ebd74432cba03313a15fd4ead56265dRussell Brenner                activity.setResult(Activity.RESULT_OK);
3550575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                activity.finish();
3560575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                return;
3570575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
3580575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        }
3590575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
36079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // if we're supposed to enable/disable the Next button based on our current connection
36179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // state, start it off in the right state
3629c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
363d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
364e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (mEnableNextOnConnection) {
365e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (hasNextButton()) {
366e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final ConnectivityManager connectivity = (ConnectivityManager)
367001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                        activity.getSystemService(Context.CONNECTIVITY_SERVICE);
368e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (connectivity != null) {
369e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    NetworkInfo info = connectivity.getNetworkInfo(
370e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ConnectivityManager.TYPE_WIFI);
371e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    changeNextButtonState(info.isConnected());
372d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
37379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            }
374e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        }
37579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
376fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        addPreferencesFromResource(R.xml.wifi_settings);
377e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
37858d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner        if (mSetupWizardMode) {
37958d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner            getView().setSystemUiVisibility(
380eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner//                    View.STATUS_BAR_DISABLE_BACK |
38158d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_HOME |
38258d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_RECENT |
38358d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS |
38458d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_CLOCK);
385bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn        }
386bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn
38744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        // On/off switch is hidden for Setup Wizard
38844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (!mSetupWizardMode) {
389e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Switch actionBarSwitch = new Switch(activity);
390e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
391e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (activity instanceof PreferenceActivity) {
392e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
393e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
394e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    final int padding = activity.getResources().getDimensionPixelSize(
395e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            R.dimen.action_bar_switch_padding);
396b27223f139248f92637997378d7a38d7d24f6b02Fabrice Di Meglio                    actionBarSwitch.setPaddingRelative(0, 0, padding, 0);
397e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
398e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.DISPLAY_SHOW_CUSTOM);
399e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
400e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
401e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
40279d8e80a304922c34a6bd344f1fa49dd7dfd106dFabrice Di Meglio                            Gravity.CENTER_VERTICAL | Gravity.END));
4030f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani                }
404a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa            }
4057bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff
406e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);
40748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
40848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
409dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey        mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
41018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getListView().setEmptyView(mEmptyView);
41118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
41244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (!mSetupWizardMode) {
413fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            registerForContextMenu(getListView());
414fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
415cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        setHasOptionsMenu(true);
41648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
41748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4199c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onResume() {
42048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
42148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
42248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.resume();
42348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
424590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
4259c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().registerReceiver(mReceiver, mFilter);
42658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
42748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
42848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
42948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4309c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onPause() {
43148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
43248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
43348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
43448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
4359c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().unregisterReceiver(mReceiver);
43648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
43748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
43848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
43948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4409c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4417e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        // If the user is not allowed to configure wifi, do not show the menu.
4427e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_WIFI)) return;
4437e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall
444cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
44544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (mSetupWizardMode) {
44644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            // FIXME: add setIcon() when graphics are available
44744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
448fc1281e6a80951321d9bc46c8eee27da1a4ba3edRussell Brenner                    .setIcon(R.drawable.ic_wps)
44944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setEnabled(wifiIsEnabled)
45044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
45144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
45244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setEnabled(wifiIsEnabled)
45344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
45444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        } else {
45590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
4564837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff                    .setIcon(R.drawable.ic_wps)
457dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
458dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
459e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
4604837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff                    .setIcon(R.drawable.ic_menu_add)
461dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
462dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
46390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
46490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    //.setIcon(R.drawable.ic_menu_scan_network)
46590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
4660c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
46790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin)
46890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
46990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4700c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff            if (mP2pSupported) {
4710c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                menu.add(Menu.NONE, MENU_ID_P2P, 0, R.string.wifi_menu_p2p)
4720c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                        .setEnabled(wifiIsEnabled)
4730c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                        .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4740c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff            }
475d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
476dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    //.setIcon(android.R.drawable.ic_menu_manage)
477348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
478fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
4799c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onCreateOptionsMenu(menu, inflater);
48048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
48248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4833d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public void onSaveInstanceState(Bundle outState) {
4843d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        super.onSaveInstanceState(outState);
4853d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4863d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // If the dialog is showing, save its state.
4873d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (mDialog != null && mDialog.isShowing()) {
4883d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit);
4893d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            if (mDlgAccessPoint != null) {
4903d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mAccessPointSavedState = new Bundle();
4913d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mDlgAccessPoint.saveWifiState(mAccessPointSavedState);
4923d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
4933d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            }
4943d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
4953d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
4963d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4973d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
49848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
4997e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        // If the user is not allowed to configure wifi, do not handle menu selections.
5007e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_WIFI)) return false;
5017e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall
50248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
50390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PBC:
50490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PBC_DIALOG_ID);
50590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
5066ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff            case MENU_ID_P2P:
5076ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                if (getActivity() instanceof PreferenceActivity) {
5086ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    ((PreferenceActivity) getActivity()).startPreferencePanel(
5096ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            WifiP2pSettings.class.getCanonicalName(),
5106ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            null,
5116ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            R.string.wifi_p2p_settings_title, null,
5126ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            this, 0);
5136ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                } else {
5146ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    startFragment(this, WifiP2pSettings.class.getCanonicalName(), -1, null);
5156ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                }
5166ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                return true;
51790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PIN:
51890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PIN_DIALOG_ID);
51990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
52048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
5212215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                if (mWifiManager.isWifiEnabled()) {
522c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff                    mScanner.forceScan();
5232215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                }
52448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
525e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case MENU_ID_ADD_NETWORK:
526e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mWifiManager.isWifiEnabled()) {
527e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    onAddNetworkPressed();
528e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
529e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                return true;
53048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
5319eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                if (getActivity() instanceof PreferenceActivity) {
5329eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                    ((PreferenceActivity) getActivity()).startPreferencePanel(
533dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                            AdvancedWifiSettings.class.getCanonicalName(),
5349eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            null,
5359eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            R.string.wifi_advanced_titlebar, null,
5369eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            this, 0);
5379eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                } else {
538dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                    startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null);
5399eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                }
54048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
54148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
54248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
54348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
54448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
54548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
54648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
547fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (info instanceof AdapterContextMenuInfo) {
54848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
54948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
55048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
55148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
552d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mSelectedAccessPoint = (AccessPoint) preference;
553d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                menu.setHeaderTitle(mSelectedAccessPoint.ssid);
554d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mSelectedAccessPoint.getLevel() != -1
555d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        && mSelectedAccessPoint.getState() == null) {
55648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
55748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
558b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
55948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
560f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
56148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
56248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
56348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
56448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
56548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
56648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
56748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
568d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mSelectedAccessPoint == null) {
56948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
57048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
57148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
572d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_CONNECT: {
573b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
574de11bcec8de61d96d72f41d53599ec65c6d258c2Irfan Sheriff                    mWifiManager.connect(mSelectedAccessPoint.networkId,
575de11bcec8de61d96d72f41d53599ec65c6d258c2Irfan Sheriff                            mConnectListener);
576d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
57722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    /** Bypass dialog for unsecured networks */
57822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.generateOpenNetworkConfig();
5795cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                    mWifiManager.connect(mSelectedAccessPoint.getConfig(),
5808f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            mConnectListener);
58148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
582fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    showDialog(mSelectedAccessPoint, true);
58348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
58448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
585d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
586d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_FORGET: {
5875cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
58848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
589d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
590d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_MODIFY: {
591fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, true);
59248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
593d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
59548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
59648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
59748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
59848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
59948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
60048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
601d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mSelectedAccessPoint = (AccessPoint) preference;
60222d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            /** Bypass dialog for unsecured, unsaved networks */
60322d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE &&
60422d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
60522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                mSelectedAccessPoint.generateOpenNetworkConfig();
6065cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener);
60722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            } else {
608fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, false);
60922d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            }
61048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
61148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
61248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
61348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
61448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
61548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
61648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
61748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
6183d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            removeDialog(WIFI_DIALOG_ID);
6193d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDialog = null;
6203d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
6213d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6223d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // Save the access point and edit mode
6233d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgAccessPoint = accessPoint;
6243d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgEdit = edit;
6253d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6263d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        showDialog(WIFI_DIALOG_ID);
6273d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
6283d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6293d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
6303d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public Dialog onCreateDialog(int dialogId) {
63190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        switch (dialogId) {
63290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WIFI_DIALOG_ID:
63390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                AccessPoint ap = mDlgAccessPoint; // For manual launch
63490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                if (ap == null) { // For re-launch from saved state
63590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    if (mAccessPointSavedState != null) {
63690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        ap = new AccessPoint(getActivity(), mAccessPointSavedState);
63790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        // For repeated orientation changes
63890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mDlgAccessPoint = ap;
63990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    }
64090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                }
64190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                // If it's still null, fine, it's for Add Network
64290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mSelectedAccessPoint = ap;
64390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit);
64490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return mDialog;
64590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PBC_DIALOG_ID:
64690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.PBC);
64790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PIN_DIALOG_ID:
64890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
64988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            case WIFI_SKIPPED_DIALOG_ID:
65088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                return new AlertDialog.Builder(getActivity())
65188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setMessage(R.string.wifi_skipped_message)
65288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setCancelable(false)
65388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setNegativeButton(R.string.wifi_skip_anyway,
65488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
65588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
65688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
657eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                    getActivity().setResult(RESULT_SKIP);
65888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    getActivity().finish();
65988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
66088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
66188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setPositiveButton(R.string.wifi_dont_skip,
66288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
66388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
66488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
66588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
66688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
66788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .create();
66888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            case WIFI_AND_MOBILE_SKIPPED_DIALOG_ID:
66988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                return new AlertDialog.Builder(getActivity())
67088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setMessage(R.string.wifi_and_mobile_skipped_message)
67188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setCancelable(false)
67288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setNegativeButton(R.string.wifi_skip_anyway,
67388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
67488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
67588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
676eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                    getActivity().setResult(RESULT_SKIP);
67788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    getActivity().finish();
67888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
67988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
68088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setPositiveButton(R.string.wifi_dont_skip,
68188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
68288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
68388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
68488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
68588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
68688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .create();
68788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
68890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        }
68990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        return super.onCreateDialog(dialogId);
69048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
69148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
69288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    private boolean isPhone() {
69388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner        final TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(
69488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                Context.TELEPHONY_SERVICE);
69588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner        return telephonyManager != null
69688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                && telephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE;
69788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    }
69888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
69988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    /**
70088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    * Return true if there's any SIM related impediment to connectivity.
70188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    * Treats Unknown as OK. (Only returns true if we're sure of a SIM problem.)
70288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner    */
70388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner   protected boolean hasSimProblem() {
70488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner       final TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(
70588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner               Context.TELEPHONY_SERVICE);
70688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner       return telephonyManager != null
70788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner               && telephonyManager.getCurrentPhoneType() == TelephonyManager.PHONE_TYPE_GSM
70888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner               && telephonyManager.getSimState() != TelephonyManager.SIM_STATE_READY
70988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner               && telephonyManager.getSimState() != TelephonyManager.SIM_STATE_UNKNOWN;
71088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner   }
71188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
712d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
713d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * Shows the latest access points available with supplimental information like
714d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * the strength of network and the security for it.
715d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
71648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
7179da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        // Safeguard from some delayed event handling
7189da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        if (getActivity() == null) return;
7199da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani
7207e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        if (mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI)) {
72191c016de410f77a291bd9cc1d1e54cf46dda7373Maggie Benthall            addMessagePreference(R.string.wifi_empty_list_user_restricted);
7227e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall            return;
7237e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        }
724e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final int wifiState = mWifiManager.getWifiState();
725e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
726e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (wifiState) {
727e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
728e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                // AccessPoints are automatically sorted with TreeSet.
729e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final Collection<AccessPoint> accessPoints = constructAccessPoints();
730fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                getPreferenceScreen().removeAll();
731fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                if(accessPoints.size() == 0) {
732fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    addMessagePreference(R.string.wifi_empty_list_wifi_on);
733fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                }
734fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                for (AccessPoint accessPoint : accessPoints) {
735fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    getPreferenceScreen().addPreference(accessPoint);
736e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
737e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
73886eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
73918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
74018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                getPreferenceScreen().removeAll();
74118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                break;
74218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
743e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLING:
744e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_stopping);
745e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
746e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
747e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
7487e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                setOffMessage();
749e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
750d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
751d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
75248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
7537e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt    private void setOffMessage() {
7547e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        if (mEmptyView != null) {
7557e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            mEmptyView.setText(R.string.wifi_empty_list_wifi_off);
7567e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            mEmptyView.append("\n\n");
7577e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            int resId;
7587e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            if (Settings.Secure.isLocationProviderEnabled(getActivity().getContentResolver(),
7597e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                    LocationManager.NETWORK_PROVIDER)) {
7607e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                resId = R.string.wifi_scan_notify_text_location_on;
7617e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            } else {
7627e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                resId = R.string.wifi_scan_notify_text_location_off;
7637e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            }
7647e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            CharSequence charSeq = getText(resId);
7657e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            mEmptyView.append(charSeq);
7667e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        }
7677e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        getPreferenceScreen().removeAll();
7687e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt    }
7697e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt
770e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private void addMessagePreference(int messageId) {
77118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        if (mEmptyView != null) mEmptyView.setText(messageId);
77218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getPreferenceScreen().removeAll();
773e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    }
774e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
775fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** Returns sorted list of access points */
776fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private List<AccessPoint> constructAccessPoints() {
777fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
778fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        /** Lookup table to more quickly update AccessPoints by only considering objects with the
779fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy         * correct SSID.  Maps SSID -> List of AccessPoints with the given SSID.  */
780fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
781d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
782d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
78348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
78448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
7859c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                AccessPoint accessPoint = new AccessPoint(getActivity(), config);
78648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoint.update(mLastInfo, mLastState);
78748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
788fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                apMap.put(accessPoint.ssid, accessPoint);
78948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
79048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
79148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
792d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<ScanResult> results = mWifiManager.getScanResults();
79348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
79448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
79548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
79648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
79748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
79848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
79948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
80048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
80148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
802cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                for (AccessPoint accessPoint : apMap.getAll(result.SSID)) {
803cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                    if (accessPoint.update(result))
804cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                        found = true;
80548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
80648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
807fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    AccessPoint accessPoint = new AccessPoint(getActivity(), result);
808fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    accessPoints.add(accessPoint);
809fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    apMap.put(accessPoint.ssid, accessPoint);
81048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
81148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
81248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
81348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
814cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        // Pre-sort accessPoints to speed preference insertion
815fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Collections.sort(accessPoints);
816d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return accessPoints;
81748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
81848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
819fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** A restricted multimap for use in constructAccessPoints */
820fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private class Multimap<K,V> {
821fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        private HashMap<K,List<V>> store = new HashMap<K,List<V>>();
822cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        /** retrieve a non-null list of values with key K */
823fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        List<V> getAll(K key) {
824cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            List<V> values = store.get(key);
825cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            return values != null ? values : Collections.<V>emptyList();
826fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
827fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
828fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        void put(K key, V val) {
829fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            List<V> curVals = store.get(key);
830fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            if (curVals == null) {
831fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                curVals = new ArrayList<V>(3);
832fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                store.put(key, curVals);
833fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            }
834fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            curVals.add(val);
835fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
836fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    }
837fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
8386377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff    private void handleEvent(Context context, Intent intent) {
83948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
84048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
84148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
84248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
843d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
844afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
845afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
846d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                updateAccessPoints();
84748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
848582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //Ignore supplicant state changes when network is connected
849582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and
850582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //introduce a broadcast that combines the supplicant and network
851582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //network state change events so the apps dont have to worry about
852582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //ignoring supplicant state change when network is connected
853582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //to get more fine grained information.
85409a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            SupplicantState state = (SupplicantState) intent.getParcelableExtra(
85509a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                    WifiManager.EXTRA_NEW_STATE);
85609a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            if (!mConnected.get() && SupplicantState.isHandshakeState(state)) {
85709a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                updateConnectionState(WifiInfo.getDetailedStateOf(state));
858f99d52cf7156991a74f942efb081369a5a14a431sunil duttu             } else {
859f99d52cf7156991a74f942efb081369a5a14a431sunil duttu                 // During a connect, we may have the supplicant
860f99d52cf7156991a74f942efb081369a5a14a431sunil duttu                 // state change affect the detailed network state.
861f99d52cf7156991a74f942efb081369a5a14a431sunil duttu                 // Make sure a lost connection is updated as well.
862f99d52cf7156991a74f942efb081369a5a14a431sunil duttu                 updateConnectionState(null);
863f99d52cf7156991a74f942efb081369a5a14a431sunil duttu             }
86448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
86579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
86679470d1a66f479919c13e27546391439cafa0ee7Freeman Ng                    WifiManager.EXTRA_NETWORK_INFO);
867582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            mConnected.set(info.isConnected());
868d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            changeNextButtonState(info.isConnected());
869317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff            updateAccessPoints();
87079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            updateConnectionState(info.getDetailedState());
8710575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (mAutoFinishOnConnection && info.isConnected()) {
872001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                Activity activity = getActivity();
873001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                if (activity != null) {
8743067fbce2ebd74432cba03313a15fd4ead56265dRussell Brenner                    activity.setResult(Activity.RESULT_OK);
875001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    activity.finish();
876001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                }
8770575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                return;
8780575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
87948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
88048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(null);
88148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
88248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
88348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
884af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private void updateConnectionState(DetailedState state) {
8852215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff        /* sticky broadcasts can call this when wifi is disabled */
886e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        if (!mWifiManager.isWifiEnabled()) {
887e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff            mScanner.pause();
8882215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff            return;
889e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        }
8902215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff
891af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh        if (state == DetailedState.OBTAINING_IPADDR) {
89248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
89348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
89448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
89548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
89648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
89748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
89848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state != null) {
89948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastState = state;
90048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
90148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
902e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) {
903d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // Maybe there's a WifiConfigPreference
904e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Preference preference = getPreferenceScreen().getPreference(i);
905d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (preference instanceof AccessPoint) {
90686eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                final AccessPoint accessPoint = (AccessPoint) preference;
90786eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                accessPoint.update(mLastInfo, mLastState);
908d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
909d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
91048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
91148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
91248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
913001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        Activity activity = getActivity();
914001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        if (activity != null) {
915001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville            activity.invalidateOptionsMenu();
916001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        }
917e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
918e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (state) {
919e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
920e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                mScanner.resume();
92118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                return; // not break, to avoid the call to pause() below
922e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
923e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
924e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_starting);
925e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
926e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
927e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
9287e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                setOffMessage();
929e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
93048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
931e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
932c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastInfo = null;
933c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastState = null;
934e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        mScanner.pause();
93548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
93648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
93748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private class Scanner extends Handler {
93848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        private int mRetry = 0;
93948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
94048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void resume() {
94148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (!hasMessages(0)) {
94248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                sendEmptyMessage(0);
94348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
94448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
94548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
946c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        void forceScan() {
94722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            removeMessages(0);
948c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff            sendEmptyMessage(0);
949c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        }
950c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff
95148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void pause() {
95248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mRetry = 0;
95348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            removeMessages(0);
95448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
95548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
95648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        @Override
95748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        public void handleMessage(Message message) {
95813b3882049955a76432c140a9179dea406514ea1Irfan Sheriff            if (mWifiManager.startScan()) {
95948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
96048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (++mRetry >= 3) {
96148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
962001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                Activity activity = getActivity();
963001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                if (activity != null) {
964001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    Toast.makeText(activity, R.string.wifi_fail_to_scan,
965001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                            Toast.LENGTH_LONG).show();
966001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                }
967e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff                return;
96848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
969fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);
97048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
97148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
972d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
97358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
97458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Renames/replaces "Next" button when appropriate. "Next" button usually exists in
97558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Wifi setup screens, not in usual wifi settings screen.
97658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     *
97758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a wifi network.
97858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
97958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void changeNextButtonState(boolean connected) {
980fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (mEnableNextOnConnection && hasNextButton()) {
98158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            getNextButton().setEnabled(connected);
982d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
983d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
984d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
985eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner    @Override
986d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(DialogInterface dialogInterface, int button) {
987fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
988fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            forget();
989fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        } else if (button == WifiDialog.BUTTON_SUBMIT) {
990ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff            if (mDialog != null) {
991ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff                submit(mDialog.getController());
992ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff            }
993d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
99458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
995d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
99658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void submit(WifiConfigController configController) {
997b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff
99890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        final WifiConfiguration config = configController.getConfig();
99990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
100090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        if (config == null) {
100190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null
100290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
10035cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(mSelectedAccessPoint.networkId,
100490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mConnectListener);
100590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
100690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else if (config.networkId != INVALID_NETWORK_ID) {
100790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null) {
10085cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
100990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
101090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else {
1011de11bcec8de61d96d72f41d53599ec65c6d258c2Irfan Sheriff            if (configController.isEdit()) {
10125cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
101390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            } else {
10145cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(config, mConnectListener);
101590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
1016d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
1017d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
101858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
101958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
102086eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        }
102158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
1022d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1023d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
1024d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void forget() {
10253ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
10263ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            // Should not happen, but a monkey seems to triger it
10273ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig());
10283ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            return;
10293ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        }
10303ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff
10315cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff        mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
1032d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
103358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
103458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
103558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
103658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
1037d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
103858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We need to rename/replace "Next" button in wifi setup context.
1039d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        changeNextButtonState(false);
1040d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1041d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
104258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
104358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Refreshes acccess points and ask Wifi module to scan networks again.
104458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
1045d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void refreshAccessPoints() {
1046d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
1047d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mScanner.resume();
1048d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
1049d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
1050e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getPreferenceScreen().removeAll();
1051d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1052d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
105358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
105458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when "add network" button is pressed.
105558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
1056d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void onAddNetworkPressed() {
105758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // No exact access point is selected.
1058d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mSelectedAccessPoint = null;
1059fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        showDialog(null, true);
1060d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1061b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa
1062b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    /* package */ int getAccessPointsCount() {
1063e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
1064e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (wifiIsEnabled) {
1065e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            return getPreferenceScreen().getPreferenceCount();
1066b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        } else {
1067b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return 0;
1068b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
1069b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    }
107055de702961642521e247f155963644df81756215Daisuke Miyakawa
107158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
107258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
107358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
107458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void pauseWifiScan() {
107558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
107658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.pause();
107758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
107858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
107958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
108058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
108158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
108258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
108358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void resumeWifiScan() {
108458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
108558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
108658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
108755de702961642521e247f155963644df81756215Daisuke Miyakawa    }
1088b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
1089b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    @Override
1090b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    protected int getHelpResource() {
109144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (mSetupWizardMode) {
109244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            return 0;
1093fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
109444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        return R.string.help_url_wifi;
1095b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    }
1096fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
1097fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    /**
1098fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     * Used as the outer frame of all setup wizard pages that need to adjust their margins based
1099fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     * on the total size of the available display. (e.g. side margins set to 10% of total width.)
1100fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     */
1101fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    public static class ProportionalOuterFrame extends RelativeLayout {
1102fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context) {
1103fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context);
1104fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1105fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context, AttributeSet attrs) {
1106fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context, attrs);
1107fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1108fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context, AttributeSet attrs, int defStyle) {
1109fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context, attrs, defStyle);
1110fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1111fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
1112fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        /**
1113fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner         * Set our margins and title area height proportionally to the available display size
1114fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner         */
1115fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        @Override
1116fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1117fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
1118fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
1119fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            final Resources resources = getContext().getResources();
1120fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            float titleHeight = resources.getFraction(R.dimen.setup_title_height, 1, 1);
1121fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            float sideMargin = resources.getFraction(R.dimen.setup_border_width, 1, 1);
1122fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int bottom = resources.getDimensionPixelSize(R.dimen.setup_margin_bottom);
1123f2a9717b93e39d7e15f90e84f8b4de24da11463eFabrice Di Meglio            setPaddingRelative(
1124fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    (int) (parentWidth * sideMargin),
1125fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    0,
1126fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    (int) (parentWidth * sideMargin),
1127fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    bottom);
1128fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            View title = findViewById(R.id.title_area);
1129fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            if (title != null) {
1130fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                title.setMinimumHeight((int) (parentHeight * titleHeight));
1131fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            }
1132fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
1133fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1134fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    }
1135fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
113648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
1137