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) {
260765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                        boolean isConnected = false;
261765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                        Activity activity = getActivity();
262765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                        final ConnectivityManager connectivity = (ConnectivityManager)
263765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                                activity.getSystemService(Context.CONNECTIVITY_SERVICE);
264765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                        if (connectivity != null) {
265765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                            final NetworkInfo info = connectivity.getActiveNetworkInfo();
266765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                            isConnected = (info != null) && info.isConnected();
267765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                        }
268765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                        if (isConnected) {
269765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                            // Warn of possible data charges
27088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            showDialog(WIFI_SKIPPED_DIALOG_ID);
27188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                        } else {
272765f55f52a7e7a6e91afbeee7f1697a2cf24f8c2Russell Brenner                            // Warn of lack of updates
27388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            showDialog(WIFI_AND_MOBILE_SKIPPED_DIALOG_ID);
27488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                        }
27588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                    }
27688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                });
27788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            }
27888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
27956a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            if (intent.getBooleanExtra(EXTRA_SHOW_WIFI_REQUIRED_INFO, false)) {
28056a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner                view.findViewById(R.id.wifi_required_info).setVisibility(View.VISIBLE);
28156a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner            }
28256a166e9e3cac96246bd724ceea96846fc9e41e1Russell Brenner
283fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            return view;
284fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        } else {
285fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            return super.onCreateView(inflater, container, savedInstanceState);
286fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
287fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    }
288fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
289fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    @Override
2909c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
291852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner        super.onActivityCreated(savedInstanceState);
292852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner
293e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff        mP2pSupported = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT);
29448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
2957e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
2968f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2978f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mConnectListener = new WifiManager.ActionListener() {
298eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
2998f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
3008f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
301eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
3028f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
303001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       Activity activity = getActivity();
304001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       if (activity != null) {
305001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                           Toast.makeText(activity,
306001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                                R.string.wifi_failed_connect_message,
307001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                                Toast.LENGTH_SHORT).show();
308001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       }
3098f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
3108f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
3118f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
3128f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mSaveListener = new WifiManager.ActionListener() {
313eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                @Override
3148f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onSuccess() {
3158f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
316eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                @Override
3178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onFailure(int reason) {
318001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    Activity activity = getActivity();
319001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    if (activity != null) {
320001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                        Toast.makeText(activity,
321001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                            R.string.wifi_failed_save_message,
322001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                            Toast.LENGTH_SHORT).show();
323001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    }
3248f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
3258f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            };
3268f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
3278f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mForgetListener = new WifiManager.ActionListener() {
328eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
3298f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
3308f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
331eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
3328f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
333001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       Activity activity = getActivity();
334001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       if (activity != null) {
335001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                           Toast.makeText(activity,
336001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                               R.string.wifi_failed_forget_message,
337001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                               Toast.LENGTH_SHORT).show();
338001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       }
3398f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
3408f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
3418f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
3423d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (savedInstanceState != null
3433d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
3443d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
3453d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
3463d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
34748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
3489c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Activity activity = getActivity();
3499c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Intent intent = activity.getIntent();
3509c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa
3510575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        // first if we're supposed to finish once we have a connection
3520575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
3530575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
3540575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        if (mAutoFinishOnConnection) {
3550575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            // Hide the next button
3560575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (hasNextButton()) {
3570575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                getNextButton().setVisibility(View.GONE);
3580575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
3590575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
3600575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            final ConnectivityManager connectivity = (ConnectivityManager)
361001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    activity.getSystemService(Context.CONNECTIVITY_SERVICE);
3620575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (connectivity != null
3630575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                    && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
3643067fbce2ebd74432cba03313a15fd4ead56265dRussell Brenner                activity.setResult(Activity.RESULT_OK);
3650575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                activity.finish();
3660575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                return;
3670575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
3680575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn        }
3690575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn
37079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // if we're supposed to enable/disable the Next button based on our current connection
37179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // state, start it off in the right state
3729c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
373d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
374e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (mEnableNextOnConnection) {
375e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (hasNextButton()) {
376e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final ConnectivityManager connectivity = (ConnectivityManager)
377001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                        activity.getSystemService(Context.CONNECTIVITY_SERVICE);
378e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (connectivity != null) {
379e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    NetworkInfo info = connectivity.getNetworkInfo(
380e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ConnectivityManager.TYPE_WIFI);
381e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    changeNextButtonState(info.isConnected());
382d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
38379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            }
384e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        }
38579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
386fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        addPreferencesFromResource(R.xml.wifi_settings);
387e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
38858d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner        if (mSetupWizardMode) {
38958d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner            getView().setSystemUiVisibility(
390eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner//                    View.STATUS_BAR_DISABLE_BACK |
39158d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_HOME |
39258d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_RECENT |
39358d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS |
39458d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner                    View.STATUS_BAR_DISABLE_CLOCK);
395bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn        }
396bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn
39744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        // On/off switch is hidden for Setup Wizard
39844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (!mSetupWizardMode) {
399e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Switch actionBarSwitch = new Switch(activity);
400e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
401e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (activity instanceof PreferenceActivity) {
402e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
403e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
404e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    final int padding = activity.getResources().getDimensionPixelSize(
405e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            R.dimen.action_bar_switch_padding);
406b27223f139248f92637997378d7a38d7d24f6b02Fabrice Di Meglio                    actionBarSwitch.setPaddingRelative(0, 0, padding, 0);
407e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
408e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.DISPLAY_SHOW_CUSTOM);
409e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
410e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
411e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
41279d8e80a304922c34a6bd344f1fa49dd7dfd106dFabrice Di Meglio                            Gravity.CENTER_VERTICAL | Gravity.END));
4130f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani                }
414a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa            }
4157bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff
416e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);
41748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
419dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey        mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
42018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getListView().setEmptyView(mEmptyView);
42118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
42244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (!mSetupWizardMode) {
423fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            registerForContextMenu(getListView());
424fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
425cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        setHasOptionsMenu(true);
42648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
42748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
42848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4299c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onResume() {
43048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
43148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
43248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.resume();
43348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
434590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
4359c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().registerReceiver(mReceiver, mFilter);
43658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
43748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
43848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
43948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4409c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onPause() {
44148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
44248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
44348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
44448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
4459c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().unregisterReceiver(mReceiver);
44648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
44748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4509c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4517e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        // If the user is not allowed to configure wifi, do not show the menu.
4527e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_WIFI)) return;
4537e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall
454cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
45544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (mSetupWizardMode) {
45644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            // FIXME: add setIcon() when graphics are available
45744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
458fc1281e6a80951321d9bc46c8eee27da1a4ba3edRussell Brenner                    .setIcon(R.drawable.ic_wps)
45944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setEnabled(wifiIsEnabled)
46044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
46144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
46244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setEnabled(wifiIsEnabled)
46344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
46444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        } else {
46590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
4664837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff                    .setIcon(R.drawable.ic_wps)
467dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
468dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
469e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
4704837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff                    .setIcon(R.drawable.ic_menu_add)
471dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
472dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
47390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
47490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    //.setIcon(R.drawable.ic_menu_scan_network)
47590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
4760c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
47790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin)
47890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setEnabled(wifiIsEnabled)
47990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4800c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff            if (mP2pSupported) {
4810c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                menu.add(Menu.NONE, MENU_ID_P2P, 0, R.string.wifi_menu_p2p)
4820c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                        .setEnabled(wifiIsEnabled)
4830c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff                        .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4840c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff            }
485d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
486dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    //.setIcon(android.R.drawable.ic_menu_manage)
487348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
488fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
4899c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onCreateOptionsMenu(menu, inflater);
49048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
49148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
49248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4933d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public void onSaveInstanceState(Bundle outState) {
4943d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        super.onSaveInstanceState(outState);
4953d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4963d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // If the dialog is showing, save its state.
4973d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (mDialog != null && mDialog.isShowing()) {
4983d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit);
4993d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            if (mDlgAccessPoint != null) {
5003d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mAccessPointSavedState = new Bundle();
5013d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mDlgAccessPoint.saveWifiState(mAccessPointSavedState);
5023d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
5033d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            }
5043d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
5053d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
5063d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
5073d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
50848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
5097e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        // If the user is not allowed to configure wifi, do not handle menu selections.
5107e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_WIFI)) return false;
5117e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall
51248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
51390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PBC:
51490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PBC_DIALOG_ID);
51590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
5166ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff            case MENU_ID_P2P:
5176ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                if (getActivity() instanceof PreferenceActivity) {
5186ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    ((PreferenceActivity) getActivity()).startPreferencePanel(
5196ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            WifiP2pSettings.class.getCanonicalName(),
5206ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            null,
5216ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            R.string.wifi_p2p_settings_title, null,
5226ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            this, 0);
5236ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                } else {
5246ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                    startFragment(this, WifiP2pSettings.class.getCanonicalName(), -1, null);
5256ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                }
5266ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                return true;
52790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PIN:
52890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PIN_DIALOG_ID);
52990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
53048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
5312215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                if (mWifiManager.isWifiEnabled()) {
532c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff                    mScanner.forceScan();
5332215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                }
53448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
535e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case MENU_ID_ADD_NETWORK:
536e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mWifiManager.isWifiEnabled()) {
537e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    onAddNetworkPressed();
538e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
539e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                return true;
54048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
5419eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                if (getActivity() instanceof PreferenceActivity) {
5429eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                    ((PreferenceActivity) getActivity()).startPreferencePanel(
543dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                            AdvancedWifiSettings.class.getCanonicalName(),
5449eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            null,
5459eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            R.string.wifi_advanced_titlebar, null,
5469eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            this, 0);
5479eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                } else {
548dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                    startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null);
5499eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                }
55048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
55148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
55248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
55348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
55448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
55548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
55648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
557fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (info instanceof AdapterContextMenuInfo) {
55848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
55948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
56048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
56148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
562d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mSelectedAccessPoint = (AccessPoint) preference;
563d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                menu.setHeaderTitle(mSelectedAccessPoint.ssid);
564d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mSelectedAccessPoint.getLevel() != -1
565d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        && mSelectedAccessPoint.getState() == null) {
56648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
56748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
568b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
56948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
570f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
57148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
57248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
57348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
57448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
57548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
57648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
57748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
578d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mSelectedAccessPoint == null) {
57948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
58048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
58148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
582d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_CONNECT: {
583b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
584de11bcec8de61d96d72f41d53599ec65c6d258c2Irfan Sheriff                    mWifiManager.connect(mSelectedAccessPoint.networkId,
585de11bcec8de61d96d72f41d53599ec65c6d258c2Irfan Sheriff                            mConnectListener);
586d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
58722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    /** Bypass dialog for unsecured networks */
58822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.generateOpenNetworkConfig();
5895cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                    mWifiManager.connect(mSelectedAccessPoint.getConfig(),
5908f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            mConnectListener);
59148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
592fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    showDialog(mSelectedAccessPoint, true);
59348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
595d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
596d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_FORGET: {
5975cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
59848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
599d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
600d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_MODIFY: {
601fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, true);
60248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
603d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
60448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
60548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
60648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
60748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
60848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
60948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
61048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
611d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mSelectedAccessPoint = (AccessPoint) preference;
61222d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            /** Bypass dialog for unsecured, unsaved networks */
61322d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE &&
61422d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
61522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                mSelectedAccessPoint.generateOpenNetworkConfig();
6165cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener);
61722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            } else {
618fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, false);
61922d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            }
62048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
62148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
62248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
62348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
62448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
62548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
62648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
62748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
6283d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            removeDialog(WIFI_DIALOG_ID);
6293d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDialog = null;
6303d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
6313d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6323d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // Save the access point and edit mode
6333d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgAccessPoint = accessPoint;
6343d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgEdit = edit;
6353d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6363d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        showDialog(WIFI_DIALOG_ID);
6373d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
6383d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6393d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
6403d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public Dialog onCreateDialog(int dialogId) {
64190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        switch (dialogId) {
64290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WIFI_DIALOG_ID:
64390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                AccessPoint ap = mDlgAccessPoint; // For manual launch
64490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                if (ap == null) { // For re-launch from saved state
64590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    if (mAccessPointSavedState != null) {
64690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        ap = new AccessPoint(getActivity(), mAccessPointSavedState);
64790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        // For repeated orientation changes
64890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mDlgAccessPoint = ap;
64990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    }
65090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                }
65190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                // If it's still null, fine, it's for Add Network
65290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mSelectedAccessPoint = ap;
65390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit);
65490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return mDialog;
65590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PBC_DIALOG_ID:
65690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.PBC);
65790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PIN_DIALOG_ID:
65890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
65988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            case WIFI_SKIPPED_DIALOG_ID:
66088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                return new AlertDialog.Builder(getActivity())
66188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setMessage(R.string.wifi_skipped_message)
66288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setCancelable(false)
66388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setNegativeButton(R.string.wifi_skip_anyway,
66488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
66588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
66688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
667eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                    getActivity().setResult(RESULT_SKIP);
66888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    getActivity().finish();
66988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
67088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
67188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setPositiveButton(R.string.wifi_dont_skip,
67288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
67388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
67488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
67588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
67688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
67788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .create();
67888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner            case WIFI_AND_MOBILE_SKIPPED_DIALOG_ID:
67988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                return new AlertDialog.Builder(getActivity())
68088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setMessage(R.string.wifi_and_mobile_skipped_message)
68188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setCancelable(false)
68288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setNegativeButton(R.string.wifi_skip_anyway,
68388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
68488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
68588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
686eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                    getActivity().setResult(RESULT_SKIP);
68788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    getActivity().finish();
68888c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
68988c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
69088c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .setPositiveButton(R.string.wifi_dont_skip,
69188c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                    new DialogInterface.OnClickListener() {
69288c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                @Override
69388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                public void onClick(DialogInterface dialog, int id) {
69488c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                                }
69588c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            })
69688c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner                            .create();
69788c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
69890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        }
69990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        return super.onCreateDialog(dialogId);
70048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
70148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
702d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
703d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * Shows the latest access points available with supplimental information like
704d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * the strength of network and the security for it.
705d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
70648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
7079da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        // Safeguard from some delayed event handling
7089da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        if (getActivity() == null) return;
7099da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani
7107e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        if (mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI)) {
71191c016de410f77a291bd9cc1d1e54cf46dda7373Maggie Benthall            addMessagePreference(R.string.wifi_empty_list_user_restricted);
7127e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall            return;
7137e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        }
714e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final int wifiState = mWifiManager.getWifiState();
715e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
716e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (wifiState) {
717e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
718e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                // AccessPoints are automatically sorted with TreeSet.
719e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final Collection<AccessPoint> accessPoints = constructAccessPoints();
720fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                getPreferenceScreen().removeAll();
721fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                if(accessPoints.size() == 0) {
722fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    addMessagePreference(R.string.wifi_empty_list_wifi_on);
723fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                }
724fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                for (AccessPoint accessPoint : accessPoints) {
725fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    getPreferenceScreen().addPreference(accessPoint);
726e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
727e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
72886eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
72918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
73018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                getPreferenceScreen().removeAll();
73118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                break;
73218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
733e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLING:
734e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_stopping);
735e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
736e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
737e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
7387e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                setOffMessage();
739e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
740d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
741d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
74248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
7437e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt    private void setOffMessage() {
7447e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        if (mEmptyView != null) {
7457e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            mEmptyView.setText(R.string.wifi_empty_list_wifi_off);
7465ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt            if (Settings.Global.getInt(getActivity().getContentResolver(),
7475ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                    Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1) {
7485ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                mEmptyView.append("\n\n");
7495ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                int resId;
7505ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                if (Settings.Secure.isLocationProviderEnabled(getActivity().getContentResolver(),
7515ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                        LocationManager.NETWORK_PROVIDER)) {
7525ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                    resId = R.string.wifi_scan_notify_text_location_on;
7535ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                } else {
7545ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                    resId = R.string.wifi_scan_notify_text_location_off;
7555ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                }
7565ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                CharSequence charSeq = getText(resId);
7575ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                mEmptyView.append(charSeq);
7587e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            }
7597e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        }
7607e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        getPreferenceScreen().removeAll();
7617e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt    }
7627e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt
763e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private void addMessagePreference(int messageId) {
76418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        if (mEmptyView != null) mEmptyView.setText(messageId);
76518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getPreferenceScreen().removeAll();
766e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    }
767e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
768fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** Returns sorted list of access points */
769fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private List<AccessPoint> constructAccessPoints() {
770fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
771fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        /** Lookup table to more quickly update AccessPoints by only considering objects with the
772fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy         * correct SSID.  Maps SSID -> List of AccessPoints with the given SSID.  */
773fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
774d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
775d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
77648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
77748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
7789c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                AccessPoint accessPoint = new AccessPoint(getActivity(), config);
77948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoint.update(mLastInfo, mLastState);
78048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
781fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                apMap.put(accessPoint.ssid, accessPoint);
78248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
78348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
78448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
785d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<ScanResult> results = mWifiManager.getScanResults();
78648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
78748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
78848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
78948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
79048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
79148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
79248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
79348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
79448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
795cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                for (AccessPoint accessPoint : apMap.getAll(result.SSID)) {
796cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                    if (accessPoint.update(result))
797cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                        found = true;
79848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
79948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
800fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    AccessPoint accessPoint = new AccessPoint(getActivity(), result);
801fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    accessPoints.add(accessPoint);
802fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    apMap.put(accessPoint.ssid, accessPoint);
80348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
80448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
80548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
80648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
807cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        // Pre-sort accessPoints to speed preference insertion
808fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Collections.sort(accessPoints);
809d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return accessPoints;
81048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
81148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
812fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** A restricted multimap for use in constructAccessPoints */
813fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private class Multimap<K,V> {
814fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        private HashMap<K,List<V>> store = new HashMap<K,List<V>>();
815cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        /** retrieve a non-null list of values with key K */
816fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        List<V> getAll(K key) {
817cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            List<V> values = store.get(key);
818cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy            return values != null ? values : Collections.<V>emptyList();
819fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
820fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
821fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        void put(K key, V val) {
822fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            List<V> curVals = store.get(key);
823fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            if (curVals == null) {
824fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                curVals = new ArrayList<V>(3);
825fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                store.put(key, curVals);
826fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            }
827fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            curVals.add(val);
828fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        }
829fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    }
830fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
8316377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff    private void handleEvent(Context context, Intent intent) {
83248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
83348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
83448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
83548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
836d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
837afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
838afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
839d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                updateAccessPoints();
84048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
841582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //Ignore supplicant state changes when network is connected
842582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and
843582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //introduce a broadcast that combines the supplicant and network
844582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //network state change events so the apps dont have to worry about
845582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //ignoring supplicant state change when network is connected
846582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //to get more fine grained information.
84709a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            SupplicantState state = (SupplicantState) intent.getParcelableExtra(
84809a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                    WifiManager.EXTRA_NEW_STATE);
84909a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff            if (!mConnected.get() && SupplicantState.isHandshakeState(state)) {
85009a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff                updateConnectionState(WifiInfo.getDetailedStateOf(state));
851f99d52cf7156991a74f942efb081369a5a14a431sunil duttu             } else {
852f99d52cf7156991a74f942efb081369a5a14a431sunil duttu                 // During a connect, we may have the supplicant
853f99d52cf7156991a74f942efb081369a5a14a431sunil duttu                 // state change affect the detailed network state.
854f99d52cf7156991a74f942efb081369a5a14a431sunil duttu                 // Make sure a lost connection is updated as well.
855f99d52cf7156991a74f942efb081369a5a14a431sunil duttu                 updateConnectionState(null);
856f99d52cf7156991a74f942efb081369a5a14a431sunil duttu             }
85748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
85879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
85979470d1a66f479919c13e27546391439cafa0ee7Freeman Ng                    WifiManager.EXTRA_NETWORK_INFO);
860582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            mConnected.set(info.isConnected());
861d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            changeNextButtonState(info.isConnected());
862317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff            updateAccessPoints();
86379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            updateConnectionState(info.getDetailedState());
8640575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            if (mAutoFinishOnConnection && info.isConnected()) {
865001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                Activity activity = getActivity();
866001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                if (activity != null) {
8673067fbce2ebd74432cba03313a15fd4ead56265dRussell Brenner                    activity.setResult(Activity.RESULT_OK);
868001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    activity.finish();
869001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                }
8700575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn                return;
8710575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn            }
87248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
87348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(null);
87448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
87548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
87648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
877af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private void updateConnectionState(DetailedState state) {
8782215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff        /* sticky broadcasts can call this when wifi is disabled */
879e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        if (!mWifiManager.isWifiEnabled()) {
880e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff            mScanner.pause();
8812215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff            return;
882e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        }
8832215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff
884af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh        if (state == DetailedState.OBTAINING_IPADDR) {
88548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
88648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
88748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
88848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
88948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
89048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
89148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state != null) {
89248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastState = state;
89348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
89448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
895e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) {
896d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // Maybe there's a WifiConfigPreference
897e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Preference preference = getPreferenceScreen().getPreference(i);
898d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (preference instanceof AccessPoint) {
89986eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                final AccessPoint accessPoint = (AccessPoint) preference;
90086eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                accessPoint.update(mLastInfo, mLastState);
901d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
902d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
90348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
90448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
90548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
906001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        Activity activity = getActivity();
907001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        if (activity != null) {
908001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville            activity.invalidateOptionsMenu();
909001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        }
910e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
911e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (state) {
912e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
913e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                mScanner.resume();
91418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                return; // not break, to avoid the call to pause() below
915e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
916e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
917e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_starting);
918e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
919e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
920e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
9217e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                setOffMessage();
922e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
92348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
924e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
925c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastInfo = null;
926c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastState = null;
927e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        mScanner.pause();
92848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
92948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
93048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private class Scanner extends Handler {
93148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        private int mRetry = 0;
93248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
93348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void resume() {
93448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (!hasMessages(0)) {
93548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                sendEmptyMessage(0);
93648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
93748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
93848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
939c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        void forceScan() {
94022d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            removeMessages(0);
941c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff            sendEmptyMessage(0);
942c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        }
943c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff
94448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void pause() {
94548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mRetry = 0;
94648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            removeMessages(0);
94748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
94848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
94948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        @Override
95048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        public void handleMessage(Message message) {
95113b3882049955a76432c140a9179dea406514ea1Irfan Sheriff            if (mWifiManager.startScan()) {
95248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
95348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (++mRetry >= 3) {
95448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
955001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                Activity activity = getActivity();
956001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                if (activity != null) {
957001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                    Toast.makeText(activity, R.string.wifi_fail_to_scan,
958001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                            Toast.LENGTH_LONG).show();
959001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                }
960e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff                return;
96148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
962fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy            sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);
96348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
96448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
965d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
96658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
96758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Renames/replaces "Next" button when appropriate. "Next" button usually exists in
96858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Wifi setup screens, not in usual wifi settings screen.
96958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     *
97058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a wifi network.
97158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
97258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void changeNextButtonState(boolean connected) {
973fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (mEnableNextOnConnection && hasNextButton()) {
97458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            getNextButton().setEnabled(connected);
975d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
976d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
977d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
978eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner    @Override
979d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(DialogInterface dialogInterface, int button) {
980fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
981fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            forget();
982fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        } else if (button == WifiDialog.BUTTON_SUBMIT) {
983ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff            if (mDialog != null) {
984ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff                submit(mDialog.getController());
985ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff            }
986d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
98758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
988d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
98958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void submit(WifiConfigController configController) {
990b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff
99190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        final WifiConfiguration config = configController.getConfig();
99290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
99390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        if (config == null) {
99490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null
99590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
9965cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(mSelectedAccessPoint.networkId,
99790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mConnectListener);
99890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
99990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else if (config.networkId != INVALID_NETWORK_ID) {
100090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null) {
10015cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
100290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
100390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else {
1004de11bcec8de61d96d72f41d53599ec65c6d258c2Irfan Sheriff            if (configController.isEdit()) {
10055cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
100690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            } else {
10075cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.connect(config, mConnectListener);
100890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
1009d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
1010d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
101158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
101258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
101386eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        }
101458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
1015d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1016d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
1017d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void forget() {
10183ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
10193ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            // Should not happen, but a monkey seems to triger it
10203ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig());
10213ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff            return;
10223ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        }
10233ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff
10245cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff        mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
1025d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
102658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
102758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
102858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
102958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
1030d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
103158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We need to rename/replace "Next" button in wifi setup context.
1032d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        changeNextButtonState(false);
1033d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1034d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
103558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
103658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Refreshes acccess points and ask Wifi module to scan networks again.
103758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
1038d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void refreshAccessPoints() {
1039d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
1040d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mScanner.resume();
1041d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
1042d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
1043e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getPreferenceScreen().removeAll();
1044d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1045d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
104658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
104758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when "add network" button is pressed.
104858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
1049d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void onAddNetworkPressed() {
105058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // No exact access point is selected.
1051d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mSelectedAccessPoint = null;
1052fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        showDialog(null, true);
1053d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
1054b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa
1055b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    /* package */ int getAccessPointsCount() {
1056e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
1057e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (wifiIsEnabled) {
1058e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            return getPreferenceScreen().getPreferenceCount();
1059b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        } else {
1060b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return 0;
1061b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
1062b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    }
106355de702961642521e247f155963644df81756215Daisuke Miyakawa
106458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
106558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
106658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
106758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void pauseWifiScan() {
106858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
106958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.pause();
107058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
107158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
107258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
107358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
107458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
107558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
107658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void resumeWifiScan() {
107758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
107858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
107958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
108055de702961642521e247f155963644df81756215Daisuke Miyakawa    }
1081b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
1082b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    @Override
1083b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    protected int getHelpResource() {
108444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        if (mSetupWizardMode) {
108544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner            return 0;
1086fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        }
108744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        return R.string.help_url_wifi;
1088b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    }
1089fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
1090fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    /**
1091fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     * Used as the outer frame of all setup wizard pages that need to adjust their margins based
1092fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     * on the total size of the available display. (e.g. side margins set to 10% of total width.)
1093fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner     */
1094fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    public static class ProportionalOuterFrame extends RelativeLayout {
1095fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context) {
1096fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context);
1097fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1098fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context, AttributeSet attrs) {
1099fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context, attrs);
1100fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1101fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        public ProportionalOuterFrame(Context context, AttributeSet attrs, int defStyle) {
1102fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super(context, attrs, defStyle);
1103fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1104fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
1105fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        /**
1106fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner         * Set our margins and title area height proportionally to the available display size
1107fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner         */
1108fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        @Override
1109fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1110fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
1111fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
1112fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            final Resources resources = getContext().getResources();
1113fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            float titleHeight = resources.getFraction(R.dimen.setup_title_height, 1, 1);
1114fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            float sideMargin = resources.getFraction(R.dimen.setup_border_width, 1, 1);
1115fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            int bottom = resources.getDimensionPixelSize(R.dimen.setup_margin_bottom);
1116f2a9717b93e39d7e15f90e84f8b4de24da11463eFabrice Di Meglio            setPaddingRelative(
1117fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    (int) (parentWidth * sideMargin),
1118fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    0,
1119fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    (int) (parentWidth * sideMargin),
1120fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                    bottom);
1121fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            View title = findViewById(R.id.title_area);
1122fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            if (title != null) {
1123fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner                title.setMinimumHeight((int) (parentHeight * titleHeight));
1124fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            }
1125fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
1126fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner        }
1127fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner    }
1128fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
112948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
1130