WifiSettings.java revision 06b65d1c7d5f5c87f8d723b6ab0040f9bfc834c4
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
229c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.app.Activity;
233d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasaniimport android.app.Dialog;
2448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver;
2548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context;
2648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface;
2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent;
2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter;
29fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.content.res.Resources;
30ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brennerimport android.content.res.TypedArray;
317e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwaltimport android.location.LocationManager;
329f59de930ae14566673d4d57597b836556820b29Maurice Lamimport android.net.ConnectivityManager;
3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo;
34af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState;
35b46a9194fe88a26e80d415919d191703c340925eJeff Davidsonimport android.net.NetworkInfo.State;
3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult;
3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration;
3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo;
3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager;
4090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriffimport android.net.wifi.WpsInfo;
4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle;
4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler;
4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message;
44073f07f33b49cfcde6ec6026f778a1cf00baf913Sky Faberimport android.os.UserHandle;
4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference;
4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen;
47590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log;
4848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu;
49e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo;
5048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu;
519c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater;
5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem;
5348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View;
549e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo;
5518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView;
56e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast;
5748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
58873fa4f2ba4385a553381c0ed15f45d1e82e8947Jeff Davidsonimport com.android.settings.R;
59873fa4f2ba4385a553381c0ed15f45d1e82e8947Jeff Davidsonimport com.android.settings.RestrictedSettingsFragment;
60873fa4f2ba4385a553381c0ed15f45d1e82e8947Jeff Davidsonimport com.android.settings.SettingsActivity;
61873fa4f2ba4385a553381c0ed15f45d1e82e8947Jeff Davidsonimport com.android.settings.search.BaseSearchIndexProvider;
62873fa4f2ba4385a553381c0ed15f45d1e82e8947Jeff Davidsonimport com.android.settings.search.Indexable;
63873fa4f2ba4385a553381c0ed15f45d1e82e8947Jeff Davidsonimport com.android.settings.search.SearchIndexableRaw;
64873fa4f2ba4385a553381c0ed15f45d1e82e8947Jeff Davidson
65ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brennerimport java.util.ArrayList;
66ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brennerimport java.util.Collection;
67ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brennerimport java.util.Collections;
68ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brennerimport java.util.HashMap;
69ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brennerimport java.util.List;
70ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brennerimport java.util.concurrent.atomic.AtomicBoolean;
71590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
73fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * Two types of UI are provided here.
74d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
75fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The first is for "usual Settings", appearing as any other Setup fragment.
76d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
77fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The second is for Setup Wizard, with a simplified interface that hides the action bar
78fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * and menus.
79d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
80e38ea38002290da8ed16f07ea45f0ebfb41b38cdGeoffrey Borggaardpublic class WifiSettings extends RestrictedSettingsFragment
81b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        implements DialogInterface.OnClickListener, Indexable  {
82ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales
83590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private static final String TAG = "WifiSettings";
84060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
85d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    /* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST;
8690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
877837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest    private static final int MENU_ID_SAVED_NETWORK = Menu.FIRST + 2;
88d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    /* package */ static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3;
896ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_ADVANCED = Menu.FIRST + 4;
906ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_SCAN = Menu.FIRST + 5;
916ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
926ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_FORGET = Menu.FIRST + 7;
936ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff    private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
94ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales    private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9;
952d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber    private static final int MENU_ID_APPS = Menu.FIRST + 10;
9648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
977837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest    public static final int WIFI_DIALOG_ID = 1;
98d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    /* package */ static final int WPS_PBC_DIALOG_ID = 2;
9990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff    private static final int WPS_PIN_DIALOG_ID = 3;
100ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales    private static final int WRITE_NFC_DIALOG_ID = 6;
1013d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
102fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    // Combo scans can take 5-6s to complete - set to 10s.
103fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
104fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy
1053d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Instance state keys
1063d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode";
1073d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
1083d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
1097837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest    private static boolean savedNetworksExist;
1107837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest
11148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final IntentFilter mFilter;
11248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final BroadcastReceiver mReceiver;
11348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final Scanner mScanner;
11448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
115d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    /* package */ WifiManager mWifiManager;
1168f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mConnectListener;
1178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mSaveListener;
1188f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff    private WifiManager.ActionListener mForgetListener;
11990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
12048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiEnabler mWifiEnabler;
121d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    // An access point being editted is stored here.
122d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private AccessPoint mSelectedAccessPoint;
12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
124b46a9194fe88a26e80d415919d191703c340925eJeff Davidson    private NetworkInfo mLastNetworkInfo;
12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiInfo mLastInfo;
12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
127ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brenner    private final AtomicBoolean mConnected = new AtomicBoolean(false);
128582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff
12958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiDialog mDialog;
130ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales    private WriteWifiConfigToNfcDialog mWifiToNfcDialog;
131d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
13218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne    private TextView mEmptyView;
13318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
1342d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber    private boolean showAppIcons = false;
1352d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber    private MenuItem showAppMenuItem = null;
1362d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber
1379f59de930ae14566673d4d57597b836556820b29Maurice Lam    // this boolean extra specifies whether to disable the Next button when not connected. Used by
1389f59de930ae14566673d4d57597b836556820b29Maurice Lam    // account creation outside of setup wizard.
1399f59de930ae14566673d4d57597b836556820b29Maurice Lam    private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect";
14036760c108b4b427da95afee23bc0ac7aeace9323Jason Monk    // This string extra specifies a network to open the connect dialog on, so the user can enter
14136760c108b4b427da95afee23bc0ac7aeace9323Jason Monk    // network credentials.  This is used by quick settings for secured networks.
14236760c108b4b427da95afee23bc0ac7aeace9323Jason Monk    private static final String EXTRA_START_CONNECT_SSID = "wifi_start_connect_ssid";
1439f59de930ae14566673d4d57597b836556820b29Maurice Lam
1449f59de930ae14566673d4d57597b836556820b29Maurice Lam    // should Next button only be enabled when we have a connection?
1459f59de930ae14566673d4d57597b836556820b29Maurice Lam    private boolean mEnableNextOnConnection;
1469f59de930ae14566673d4d57597b836556820b29Maurice Lam
1473d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    // Save the dialog details
1483d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private boolean mDlgEdit;
1493d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private AccessPoint mDlgAccessPoint;
1503d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    private Bundle mAccessPointSavedState;
1513d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
152653cfeeb0a84d836a107653d7e0a478a56e6cc5fvandwalle    /** verbose logging flag. this flag is set thru developer debugging options
153653cfeeb0a84d836a107653d7e0a478a56e6cc5fvandwalle     * and used so as to assist with in-the-field WiFi connectivity debugging  */
154653cfeeb0a84d836a107653d7e0a478a56e6cc5fvandwalle    public static int mVerboseLogging = 0;
155653cfeeb0a84d836a107653d7e0a478a56e6cc5fvandwalle
15658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* End of "used in Wifi Setup context" */
15779470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
158060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest    /** A restricted multimap for use in constructAccessPoints */
159060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest    private static class Multimap<K,V> {
160060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        private final HashMap<K,List<V>> store = new HashMap<K,List<V>>();
161060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        /** retrieve a non-null list of values with key K */
162060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        List<V> getAll(K key) {
163060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            List<V> values = store.get(key);
164060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            return values != null ? values : Collections.<V>emptyList();
165060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        }
166060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
167060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        void put(K key, V val) {
168060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            List<V> curVals = store.get(key);
169060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            if (curVals == null) {
170060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                curVals = new ArrayList<V>(3);
171060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                store.put(key, curVals);
172060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            }
173060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            curVals.add(val);
174060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        }
175060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest    }
176060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
177060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest    private static class Scanner extends Handler {
178060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        private int mRetry = 0;
179060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        private WifiSettings mWifiSettings = null;
180060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
181060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        Scanner(WifiSettings wifiSettings) {
182060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            mWifiSettings = wifiSettings;
183060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        }
184060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
185060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        void resume() {
186060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            if (!hasMessages(0)) {
187060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                sendEmptyMessage(0);
188060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            }
189060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        }
190060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
191060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        void forceScan() {
192060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            removeMessages(0);
193060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            sendEmptyMessage(0);
194060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        }
195060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
196060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        void pause() {
197060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            mRetry = 0;
198060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            removeMessages(0);
199060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        }
200060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
201060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        @Override
202060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        public void handleMessage(Message message) {
203060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            if (mWifiSettings.mWifiManager.startScan()) {
204060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                mRetry = 0;
205060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            } else if (++mRetry >= 3) {
206060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                mRetry = 0;
207060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                Activity activity = mWifiSettings.getActivity();
208060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                if (activity != null) {
209060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                    Toast.makeText(activity, R.string.wifi_fail_to_scan, Toast.LENGTH_LONG).show();
210060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                }
211060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                return;
212060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            }
213060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest            sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);
214060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        }
215060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest    }
216060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
217065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh    public WifiSettings() {
218e38ea38002290da8ed16f07ea45f0ebfb41b38cdGeoffrey Borggaard        super(DISALLOW_CONFIG_WIFI);
21948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter = new IntentFilter();
22048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
22248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
22348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
224afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
225afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
22648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
22748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
22848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
22948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mReceiver = new BroadcastReceiver() {
23048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            @Override
23148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            public void onReceive(Context context, Intent intent) {
2322e7162618dab134a5e3c60b5c128dc71ff635fddJeff Davidson                handleEvent(intent);
23348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
23448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        };
23548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
236060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        mScanner = new Scanner(this);
23748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
23848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
23948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
2409c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
241852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner        super.onActivityCreated(savedInstanceState);
242852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner
24348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
2448f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2458f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mConnectListener = new WifiManager.ActionListener() {
246eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
2478f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
2488f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
249eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
2508f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
251001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       Activity activity = getActivity();
252001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       if (activity != null) {
253001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                           Toast.makeText(activity,
254001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                                R.string.wifi_failed_connect_message,
255001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                                Toast.LENGTH_SHORT).show();
256001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       }
2578f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2588f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
2598f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2608f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mSaveListener = new WifiManager.ActionListener() {
261eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                @Override
2628f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onSuccess() {
2638f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
264eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                @Override
2658f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                public void onFailure(int reason) {
266001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    Activity activity = getActivity();
267001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    if (activity != null) {
268001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                        Toast.makeText(activity,
269001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                            R.string.wifi_failed_save_message,
270001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                            Toast.LENGTH_SHORT).show();
271001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                    }
2728f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                }
2738f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                            };
2748f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
2758f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff        mForgetListener = new WifiManager.ActionListener() {
276eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
2778f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onSuccess() {
2788f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
279eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner                                   @Override
2808f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   public void onFailure(int reason) {
281001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       Activity activity = getActivity();
282001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       if (activity != null) {
283001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                           Toast.makeText(activity,
284001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                               R.string.wifi_failed_forget_message,
285001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                               Toast.LENGTH_SHORT).show();
286001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville                                       }
2878f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                                   }
2888f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff                               };
2898f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff
290fd19aff782bd382ae34900e5ce0f0b7410e3082fPauloftheWest        if (savedInstanceState != null) {
2913d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
292fd19aff782bd382ae34900e5ce0f0b7410e3082fPauloftheWest            if (savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
2932e7162618dab134a5e3c60b5c128dc71ff635fddJeff Davidson                mAccessPointSavedState =
294fd19aff782bd382ae34900e5ce0f0b7410e3082fPauloftheWest                    savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
295fd19aff782bd382ae34900e5ce0f0b7410e3082fPauloftheWest            }
2963d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
29748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
2989f59de930ae14566673d4d57597b836556820b29Maurice Lam        // if we're supposed to enable/disable the Next button based on our current connection
2999f59de930ae14566673d4d57597b836556820b29Maurice Lam        // state, start it off in the right state
3009f59de930ae14566673d4d57597b836556820b29Maurice Lam        Intent intent = getActivity().getIntent();
3019f59de930ae14566673d4d57597b836556820b29Maurice Lam        mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
3029f59de930ae14566673d4d57597b836556820b29Maurice Lam
3039f59de930ae14566673d4d57597b836556820b29Maurice Lam        if (mEnableNextOnConnection) {
3049f59de930ae14566673d4d57597b836556820b29Maurice Lam            if (hasNextButton()) {
3059f59de930ae14566673d4d57597b836556820b29Maurice Lam                final ConnectivityManager connectivity = (ConnectivityManager)
3069f59de930ae14566673d4d57597b836556820b29Maurice Lam                        getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
3079f59de930ae14566673d4d57597b836556820b29Maurice Lam                if (connectivity != null) {
3089f59de930ae14566673d4d57597b836556820b29Maurice Lam                    NetworkInfo info = connectivity.getNetworkInfo(
3099f59de930ae14566673d4d57597b836556820b29Maurice Lam                            ConnectivityManager.TYPE_WIFI);
3109f59de930ae14566673d4d57597b836556820b29Maurice Lam                    changeNextButtonState(info.isConnected());
3119f59de930ae14566673d4d57597b836556820b29Maurice Lam                }
3129f59de930ae14566673d4d57597b836556820b29Maurice Lam            }
3139f59de930ae14566673d4d57597b836556820b29Maurice Lam        }
3149f59de930ae14566673d4d57597b836556820b29Maurice Lam
315fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        addPreferencesFromResource(R.xml.wifi_settings);
316e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
317b6c414a6d279b83f5306e9d4aaddb02e5bb8cfe1Maurice Lam        mEmptyView = initEmptyView();
318d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        registerForContextMenu(getListView());
319263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        setHasOptionsMenu(true);
32036760c108b4b427da95afee23bc0ac7aeace9323Jason Monk
32136760c108b4b427da95afee23bc0ac7aeace9323Jason Monk        if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
32236760c108b4b427da95afee23bc0ac7aeace9323Jason Monk            String ssid = intent.getStringExtra(EXTRA_START_CONNECT_SSID);
32336760c108b4b427da95afee23bc0ac7aeace9323Jason Monk            updateAccessPoints();
32436760c108b4b427da95afee23bc0ac7aeace9323Jason Monk            PreferenceScreen preferenceScreen = getPreferenceScreen();
32536760c108b4b427da95afee23bc0ac7aeace9323Jason Monk            for (int i = 0; i < preferenceScreen.getPreferenceCount(); i++) {
32636760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                Preference preference = preferenceScreen.getPreference(i);
32736760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                if (preference instanceof AccessPoint) {
32836760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                    AccessPoint accessPoint = (AccessPoint) preference;
32936760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                    if (ssid.equals(accessPoint.ssid) && accessPoint.networkId == -1
33036760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                            && accessPoint.security != AccessPoint.SECURITY_NONE) {
33136760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                        onPreferenceTreeClick(preferenceScreen, preference);
33236760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                        break;
33336760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                    }
33436760c108b4b427da95afee23bc0ac7aeace9323Jason Monk                }
33536760c108b4b427da95afee23bc0ac7aeace9323Jason Monk            }
33636760c108b4b427da95afee23bc0ac7aeace9323Jason Monk        }
337263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio    }
338263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio
339263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio    @Override
340138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio    public void onDestroyView() {
341138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        super.onDestroyView();
342138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio
343138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        if (mWifiEnabler != null) {
344138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio            mWifiEnabler.teardownSwitchBar();
345138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        }
346138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio    }
347138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio
348138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio    @Override
349263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio    public void onStart() {
350263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        super.onStart();
351263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio
352d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        // On/off switch is hidden for Setup Wizard (returns null)
353d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        mWifiEnabler = createWifiEnabler();
354d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    }
355263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio
356d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    /**
357d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner     * @return new WifiEnabler or null (as overridden by WifiSettingsForSetupWizard)
358d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner     */
359d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    /* package */ WifiEnabler createWifiEnabler() {
360d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        final SettingsActivity activity = (SettingsActivity) getActivity();
361d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        return new WifiEnabler(activity, activity.getSwitchBar());
36248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
36348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
36448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
3659c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onResume() {
366d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        final Activity activity = getActivity();
36748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
36848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
369d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio            mWifiEnabler.resume(activity);
37048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
371590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
372d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        activity.registerReceiver(mReceiver, mFilter);
37358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
37448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
37548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
37648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
3779c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onPause() {
37848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
37948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
38048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
38148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
382ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales
3839c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().unregisterReceiver(mReceiver);
38448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
38548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
3889c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
3897e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        // If the user is not allowed to configure wifi, do not show the menu.
3901a0297c544cb15ed4b56e70575b169b3889543b7Julia Reynolds        if (isUiRestricted()) return;
3917e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall
392d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        addOptionsMenuItems(menu);
393d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        super.onCreateOptionsMenu(menu, inflater);
394d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    }
395d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner
396d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    /**
397d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner     * @param menu
398d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner     */
399d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner    void addOptionsMenuItems(Menu menu) {
400cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
401ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brenner        TypedArray ta = getActivity().getTheme().obtainStyledAttributes(
402ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brenner                new int[] {R.attr.ic_menu_add, R.attr.ic_wps});
403d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
404d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner                .setIcon(ta.getDrawable(0))
405d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner                .setEnabled(wifiIsEnabled)
406d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
407060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest        if (savedNetworksExist) {
4087837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest            menu.add(Menu.NONE, MENU_ID_SAVED_NETWORK, 0, R.string.wifi_saved_access_points_label)
4097837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                    .setIcon(ta.getDrawable(0))
4107837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                    .setEnabled(wifiIsEnabled)
4117837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4127837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest        }
4137837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest        menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.menu_stats_refresh)
4147837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest               .setEnabled(wifiIsEnabled)
4157837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest               .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
416d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner        menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
417d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4182d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber        showAppMenuItem = menu.add(Menu.NONE, MENU_ID_APPS, 0, R.string.wifi_menu_apps);
4192d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber        showAppMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
420ac57f3e1eb56998550534c1b32d99cb7b5cc2b7bRussell Brenner        ta.recycle();
42148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
42248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
42348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
4243d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public void onSaveInstanceState(Bundle outState) {
4253d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        super.onSaveInstanceState(outState);
4263d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4273d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // If the dialog is showing, save its state.
4283d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        if (mDialog != null && mDialog.isShowing()) {
4293d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit);
4303d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            if (mDlgAccessPoint != null) {
4313d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mAccessPointSavedState = new Bundle();
4323d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                mDlgAccessPoint.saveWifiState(mAccessPointSavedState);
4333d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani                outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
4343d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            }
4353d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
4363d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
4373d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
4383d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
43948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
4407e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        // If the user is not allowed to configure wifi, do not handle menu selections.
4411a0297c544cb15ed4b56e70575b169b3889543b7Julia Reynolds        if (isUiRestricted()) return false;
4427e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall
44348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
44490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PBC:
44590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PBC_DIALOG_ID);
44690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
4477837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                /*
4486ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff            case MENU_ID_P2P:
449263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio                if (getActivity() instanceof SettingsActivity) {
450263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio                    ((SettingsActivity) getActivity()).startPreferencePanel(
4516ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            WifiP2pSettings.class.getCanonicalName(),
4526ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            null,
4536ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            R.string.wifi_p2p_settings_title, null,
4546ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                            this, 0);
4556ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                } else {
4565bdf0423f9dbc3cf5970045aacdfef79daacc430Fabrice Di Meglio                    startFragment(this, WifiP2pSettings.class.getCanonicalName(),
4575bdf0423f9dbc3cf5970045aacdfef79daacc430Fabrice Di Meglio                            R.string.wifi_p2p_settings_title, -1, null);
4586ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                }
4596ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff                return true;
4607837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                */
46190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case MENU_ID_WPS_PIN:
46290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                showDialog(WPS_PIN_DIALOG_ID);
46390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return true;
46448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
4652215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                if (mWifiManager.isWifiEnabled()) {
466c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff                    mScanner.forceScan();
4672215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                }
46848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
469e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case MENU_ID_ADD_NETWORK:
470e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mWifiManager.isWifiEnabled()) {
471e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    onAddNetworkPressed();
472e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
473e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                return true;
4747837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest            case MENU_ID_SAVED_NETWORK:
4757837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                if (getActivity() instanceof SettingsActivity) {
4767837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                    ((SettingsActivity) getActivity()).startPreferencePanel(
4777837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                            SavedAccessPointsWifiSettings.class.getCanonicalName(), null,
4787837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                            R.string.wifi_saved_access_points_titlebar, null, this, 0);
4797837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                } else {
4807837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                    startFragment(this, SavedAccessPointsWifiSettings.class.getCanonicalName(),
4817837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                            R.string.wifi_saved_access_points_titlebar,
4827837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                            -1 /* Do not request a result */, null);
4837837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                }
4847837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                return true;
48548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
486263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio                if (getActivity() instanceof SettingsActivity) {
487263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio                    ((SettingsActivity) getActivity()).startPreferencePanel(
4887837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                            AdvancedWifiSettings.class.getCanonicalName(), null,
4897837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                            R.string.wifi_advanced_titlebar, null, this, 0);
4909eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                } else {
4915bdf0423f9dbc3cf5970045aacdfef79daacc430Fabrice Di Meglio                    startFragment(this, AdvancedWifiSettings.class.getCanonicalName(),
4927837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                            R.string.wifi_advanced_titlebar, -1 /* Do not request a results */,
4937837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                            null);
4949eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                }
49548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
4962d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber            case MENU_ID_APPS:
4972d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                showAppIcons = !showAppIcons;
4982d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber
4992d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                if (showAppIcons) {
5002d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                    showAppMenuItem.setTitle(R.string.wifi_menu_apps_strength);
5012d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                } else {
5022d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                    showAppMenuItem.setTitle(R.string.wifi_menu_apps);
5032d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                }
5042d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                updateAccessPoints();
5052d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                return true;
50648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
50748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
50848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
50948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
51048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
51148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
512fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (info instanceof AdapterContextMenuInfo) {
51348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
51448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
51548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
51648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
517d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mSelectedAccessPoint = (AccessPoint) preference;
518d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                menu.setHeaderTitle(mSelectedAccessPoint.ssid);
519b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                if (mSelectedAccessPoint.getLevel() != -1) {
520b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                    if (mSelectedAccessPoint.getState() == null) {
5215ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                        menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
522b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                    }
5235ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                }
524b46a9194fe88a26e80d415919d191703c340925eJeff Davidson
52506b65d1c7d5f5c87f8d723b6ab0040f9bfc834c4Jeff Davidson                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID ||
5265ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                        (mSelectedAccessPoint.getNetworkInfo() != null &&
52706b65d1c7d5f5c87f8d723b6ab0040f9bfc834c4Jeff Davidson                        mSelectedAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED)) {
52806b65d1c7d5f5c87f8d723b6ab0040f9bfc834c4Jeff Davidson                    // Allow forgetting a network if either the network is saved or ephemerally
52906b65d1c7d5f5c87f8d723b6ab0040f9bfc834c4Jeff Davidson                    // connected. (In the latter case, "forget" blacklists the network so it won't
53006b65d1c7d5f5c87f8d723b6ab0040f9bfc834c4Jeff Davidson                    // be used again, ephemerally).
5315ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
53248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
533b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
534f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
535ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales
536ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales                    if (mSelectedAccessPoint.security != AccessPoint.SECURITY_NONE) {
537ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales                        // Only allow writing of NFC tags for password-protected networks.
538ae04155bbe875279d6637ffa5dda974b9af019faAndres Morales                        menu.add(Menu.NONE, MENU_ID_WRITE_NFC, 0, R.string.wifi_menu_write_to_nfc);
539ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales                    }
54048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
54148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
54248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
54348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
54448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
54548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
54648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
547d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mSelectedAccessPoint == null) {
54848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
54948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
55048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
551d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_CONNECT: {
552b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
5536a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam                    connect(mSelectedAccessPoint.networkId);
554d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
55522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    /** Bypass dialog for unsecured networks */
55622d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                    mSelectedAccessPoint.generateOpenNetworkConfig();
5576a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam                    connect(mSelectedAccessPoint.getConfig());
55848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
559fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    showDialog(mSelectedAccessPoint, true);
56048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
56148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
562d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
563d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_FORGET: {
5645ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                forget();
56548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
566d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
567d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_MODIFY: {
568fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, true);
56948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
570d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
571ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales            case MENU_ID_WRITE_NFC:
572ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales                showDialog(WRITE_NFC_DIALOG_ID);
573ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales                return true;
574ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales
57548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
57648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
57748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
57848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
57948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
58048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
58148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
582d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mSelectedAccessPoint = (AccessPoint) preference;
5835ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson            /** Bypass dialog for unsecured, unsaved, and inactive networks */
58422d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE &&
5855ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                    mSelectedAccessPoint.networkId == INVALID_NETWORK_ID &&
5865ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                    !mSelectedAccessPoint.isActive()) {
58722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy                mSelectedAccessPoint.generateOpenNetworkConfig();
588060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                if (!savedNetworksExist) {
5897837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                    savedNetworksExist = true;
5907837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                    getActivity().invalidateOptionsMenu();
5917837b999862cf341b0f124be7ace1dfc64d0a5a8PauloftheWest                }
5926a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam                connect(mSelectedAccessPoint.getConfig());
59322d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            } else {
594fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                showDialog(mSelectedAccessPoint, false);
59522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy            }
59648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
59748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
59848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
59948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
60048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
60148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
60248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
60348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
6043d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            removeDialog(WIFI_DIALOG_ID);
6053d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani            mDialog = null;
6063d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        }
6073d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6083d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        // Save the access point and edit mode
6093d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgAccessPoint = accessPoint;
6103d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        mDlgEdit = edit;
6113d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6123d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani        showDialog(WIFI_DIALOG_ID);
6133d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    }
6143d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani
6153d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    @Override
6163d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani    public Dialog onCreateDialog(int dialogId) {
61790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        switch (dialogId) {
61890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WIFI_DIALOG_ID:
61990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                AccessPoint ap = mDlgAccessPoint; // For manual launch
62090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                if (ap == null) { // For re-launch from saved state
62190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    if (mAccessPointSavedState != null) {
62290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        ap = new AccessPoint(getActivity(), mAccessPointSavedState);
62390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        // For repeated orientation changes
62490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                        mDlgAccessPoint = ap;
6252dcf6083f77ea8abc200dc87eed22b8bbb45fd07Birdson_Chen                        // Reset the saved access point data
6262dcf6083f77ea8abc200dc87eed22b8bbb45fd07Birdson_Chen                        mAccessPointSavedState = null;
62790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    }
62890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                }
629ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales                // If it's null, fine, it's for Add Network
63090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mSelectedAccessPoint = ap;
63190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit);
63290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return mDialog;
63390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PBC_DIALOG_ID:
63490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.PBC);
63590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            case WPS_PIN_DIALOG_ID:
63690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
637ef7a40a0d65a4d3e43d454273c6334448158e555Andres Morales            case WRITE_NFC_DIALOG_ID:
638ae04155bbe875279d6637ffa5dda974b9af019faAndres Morales                if (mSelectedAccessPoint != null) {
639ae04155bbe875279d6637ffa5dda974b9af019faAndres Morales                    mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(
640ae04155bbe875279d6637ffa5dda974b9af019faAndres Morales                            getActivity(), mSelectedAccessPoint, mWifiManager);
641ae04155bbe875279d6637ffa5dda974b9af019faAndres Morales                    return mWifiToNfcDialog;
642ae04155bbe875279d6637ffa5dda974b9af019faAndres Morales                }
64388c9f2889fafb53a2875418317ecd197d9aae883Russell Brenner
64490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        }
64590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        return super.onCreateDialog(dialogId);
64648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
64748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
648d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
649d3446c5708aff2580d4ddb9f559e72784bfac55eRussell Brenner     * Shows the latest access points available with supplemental information like
650d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * the strength of network and the security for it.
651d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
65248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
6539da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        // Safeguard from some delayed event handling
6549da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani        if (getActivity() == null) return;
6559da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani
6561a0297c544cb15ed4b56e70575b169b3889543b7Julia Reynolds        if (isUiRestricted()) {
65791c016de410f77a291bd9cc1d1e54cf46dda7373Maggie Benthall            addMessagePreference(R.string.wifi_empty_list_user_restricted);
6587e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall            return;
6597e61c233061b4e87257a332be83f72f840d07c62Maggie Benthall        }
660e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final int wifiState = mWifiManager.getWifiState();
661e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
662653cfeeb0a84d836a107653d7e0a478a56e6cc5fvandwalle        //when we update the screen, check if verbose logging has been turned on or off
663c9a6698fd44492841bf83bead93b62ecba8a967evandwalle        mVerboseLogging = mWifiManager.getVerboseLoggingLevel();
664c9a6698fd44492841bf83bead93b62ecba8a967evandwalle
665e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (wifiState) {
666e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
667e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                // AccessPoints are automatically sorted with TreeSet.
668b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                final Collection<AccessPoint> accessPoints =
669b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                        constructAccessPoints(getActivity(), mWifiManager, mLastInfo,
670b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                                mLastNetworkInfo);
671fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                getPreferenceScreen().removeAll();
672060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest                if (accessPoints.size() == 0) {
673fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                    addMessagePreference(R.string.wifi_empty_list_wifi_on);
674fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                }
675060e01a93e678a62d9328bc3c48555976bda7710PauloftheWest
676fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner                for (AccessPoint accessPoint : accessPoints) {
6772d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                    if (showAppIcons) {
6782d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                        accessPoint.showAppIcon();
6792d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber                    }
6802d657e36295428f5de8bf710a2ea24f42cb5bb78Sky Faber
6810f8e031a34a105f6dd73b0a5247a56bf1f080975PauloftheWest                    // Ignore access points that are out of range.
6820f8e031a34a105f6dd73b0a5247a56bf1f080975PauloftheWest                    if (accessPoint.getLevel() != -1) {
6830f8e031a34a105f6dd73b0a5247a56bf1f080975PauloftheWest                        getPreferenceScreen().addPreference(accessPoint);
6840f8e031a34a105f6dd73b0a5247a56bf1f080975PauloftheWest                    }
685e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
686e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
68786eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
68818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
68918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                getPreferenceScreen().removeAll();
69018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                break;
69118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
692e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLING:
693e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_stopping);
694e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
695e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
696e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
6977e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                setOffMessage();
698e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
699d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
700d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
70148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
702b6c414a6d279b83f5306e9d4aaddb02e5bb8cfe1Maurice Lam    protected TextView initEmptyView() {
703b6c414a6d279b83f5306e9d4aaddb02e5bb8cfe1Maurice Lam        TextView emptyView = (TextView) getActivity().findViewById(android.R.id.empty);
704b6c414a6d279b83f5306e9d4aaddb02e5bb8cfe1Maurice Lam        getListView().setEmptyView(emptyView);
705b6c414a6d279b83f5306e9d4aaddb02e5bb8cfe1Maurice Lam        return emptyView;
706b6c414a6d279b83f5306e9d4aaddb02e5bb8cfe1Maurice Lam    }
707b6c414a6d279b83f5306e9d4aaddb02e5bb8cfe1Maurice Lam
7087e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt    private void setOffMessage() {
7097e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        if (mEmptyView != null) {
7107e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            mEmptyView.setText(R.string.wifi_empty_list_wifi_off);
711263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio            if (android.provider.Settings.Global.getInt(getActivity().getContentResolver(),
712263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio                    android.provider.Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1) {
7135ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                mEmptyView.append("\n\n");
7145ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                int resId;
715263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio                if (android.provider.Settings.Secure.isLocationProviderEnabled(
716263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio                        getActivity().getContentResolver(), LocationManager.NETWORK_PROVIDER)) {
7175ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                    resId = R.string.wifi_scan_notify_text_location_on;
7185ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                } else {
7195ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                    resId = R.string.wifi_scan_notify_text_location_off;
7205ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                }
7215ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                CharSequence charSeq = getText(resId);
7225ac904321d81a0a0b7892c5722c464dc3c693f9fRobert Greenwalt                mEmptyView.append(charSeq);
7237e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt            }
7247e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        }
7257e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt        getPreferenceScreen().removeAll();
7267e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt    }
7277e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt
728e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private void addMessagePreference(int messageId) {
72918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        if (mEmptyView != null) mEmptyView.setText(messageId);
73018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getPreferenceScreen().removeAll();
731e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    }
732e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
733fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy    /** Returns sorted list of access points */
734b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    private static List<AccessPoint> constructAccessPoints(Context context,
735b46a9194fe88a26e80d415919d191703c340925eJeff Davidson            WifiManager wifiManager, WifiInfo lastInfo, NetworkInfo lastNetworkInfo) {
736fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
737fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        /** Lookup table to more quickly update AccessPoints by only considering objects with the
738fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy         * correct SSID.  Maps SSID -> List of AccessPoints with the given SSID.  */
739fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
740d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
741b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        final List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks();
74248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
743de29d04fae4877de1d0ab37093ca4e721d528cfbPauloftheWest            // Update "Saved Networks" menu option.
744de29d04fae4877de1d0ab37093ca4e721d528cfbPauloftheWest            if (savedNetworksExist != (configs.size() > 0)) {
745de29d04fae4877de1d0ab37093ca4e721d528cfbPauloftheWest                savedNetworksExist = !savedNetworksExist;
746de29d04fae4877de1d0ab37093ca4e721d528cfbPauloftheWest                if (context instanceof Activity) {
747de29d04fae4877de1d0ab37093ca4e721d528cfbPauloftheWest                    ((Activity) context).invalidateOptionsMenu();
748de29d04fae4877de1d0ab37093ca4e721d528cfbPauloftheWest                }
749de29d04fae4877de1d0ab37093ca4e721d528cfbPauloftheWest            }
75048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
751fb075455bd8aa99861c28836ffefae92153a7958vandwalle                if (config.selfAdded && config.numAssociation == 0) {
752fb075455bd8aa99861c28836ffefae92153a7958vandwalle                    continue;
753fb075455bd8aa99861c28836ffefae92153a7958vandwalle                }
754b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                AccessPoint accessPoint = new AccessPoint(context, config);
755b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                if (lastInfo != null && lastNetworkInfo != null) {
756b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                    accessPoint.update(lastInfo, lastNetworkInfo);
757b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                }
75848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
759fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                apMap.put(accessPoint.ssid, accessPoint);
76048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
76148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
76248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
763b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        final List<ScanResult> results = wifiManager.getScanResults();
76448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
76548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
76648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
76748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
76848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
76948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
77048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
77148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
77248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
773cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                for (AccessPoint accessPoint : apMap.getAll(result.SSID)) {
774cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                    if (accessPoint.update(result))
775cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy                        found = true;
77648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
77748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
778b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                    AccessPoint accessPoint = new AccessPoint(context, result);
779b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                    if (lastInfo != null && lastNetworkInfo != null) {
780b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                        accessPoint.update(lastInfo, lastNetworkInfo);
781b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                    }
782fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    accessPoints.add(accessPoint);
783fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy                    apMap.put(accessPoint.ssid, accessPoint);
78448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
78548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
78648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
78748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
788cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy        // Pre-sort accessPoints to speed preference insertion
789fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy        Collections.sort(accessPoints);
790d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return accessPoints;
79148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
79248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
7932e7162618dab134a5e3c60b5c128dc71ff635fddJeff Davidson    private void handleEvent(Intent intent) {
79448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
79548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
79648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
79748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
798d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
799afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
800afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
801d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                updateAccessPoints();
80248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
80379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
80479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng                    WifiManager.EXTRA_NETWORK_INFO);
805582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            mConnected.set(info.isConnected());
8069f59de930ae14566673d4d57597b836556820b29Maurice Lam            changeNextButtonState(info.isConnected());
807317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff            updateAccessPoints();
808b46a9194fe88a26e80d415919d191703c340925eJeff Davidson            updateNetworkInfo(info);
80948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
810b46a9194fe88a26e80d415919d191703c340925eJeff Davidson            updateNetworkInfo(null);
81148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
81248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
81348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
814b46a9194fe88a26e80d415919d191703c340925eJeff Davidson    private void updateNetworkInfo(NetworkInfo networkInfo) {
8152215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff        /* sticky broadcasts can call this when wifi is disabled */
816e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        if (!mWifiManager.isWifiEnabled()) {
817e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff            mScanner.pause();
8182215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff            return;
819e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        }
8202215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff
821b46a9194fe88a26e80d415919d191703c340925eJeff Davidson        if (networkInfo != null &&
822b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                networkInfo.getDetailedState() == DetailedState.OBTAINING_IPADDR) {
82348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
82448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
82548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
82648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
82748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
82848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
829b46a9194fe88a26e80d415919d191703c340925eJeff Davidson        if (networkInfo != null) {
830b46a9194fe88a26e80d415919d191703c340925eJeff Davidson            mLastNetworkInfo = networkInfo;
83148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
83248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
833e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) {
834d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // Maybe there's a WifiConfigPreference
835e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Preference preference = getPreferenceScreen().getPreference(i);
836d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (preference instanceof AccessPoint) {
83786eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                final AccessPoint accessPoint = (AccessPoint) preference;
838b46a9194fe88a26e80d415919d191703c340925eJeff Davidson                accessPoint.update(mLastInfo, mLastNetworkInfo);
839d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
840d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
84148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
84248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
84348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
844001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        Activity activity = getActivity();
845001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        if (activity != null) {
846001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville            activity.invalidateOptionsMenu();
847001e14a118e8d5c0fac5876439dc0356d7943eb7Wink Saville        }
848e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
849e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (state) {
850e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
851e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                mScanner.resume();
85218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                return; // not break, to avoid the call to pause() below
853e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
854e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
855e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_starting);
856e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
857e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
858e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
8597e59f73e9cc3d93b8baa1c3e4aa59347d859dfb4Robert Greenwalt                setOffMessage();
860e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
86148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
862e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
863c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne        mLastInfo = null;
864b46a9194fe88a26e80d415919d191703c340925eJeff Davidson        mLastNetworkInfo = null;
865e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        mScanner.pause();
86648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
86748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
8689f59de930ae14566673d4d57597b836556820b29Maurice Lam    /**
8699f59de930ae14566673d4d57597b836556820b29Maurice Lam     * Renames/replaces "Next" button when appropriate. "Next" button usually exists in
8709f59de930ae14566673d4d57597b836556820b29Maurice Lam     * Wifi setup screens, not in usual wifi settings screen.
8719f59de930ae14566673d4d57597b836556820b29Maurice Lam     *
8729f59de930ae14566673d4d57597b836556820b29Maurice Lam     * @param enabled true when the device is connected to a wifi network.
8739f59de930ae14566673d4d57597b836556820b29Maurice Lam     */
8749f59de930ae14566673d4d57597b836556820b29Maurice Lam    private void changeNextButtonState(boolean enabled) {
8759f59de930ae14566673d4d57597b836556820b29Maurice Lam        if (mEnableNextOnConnection && hasNextButton()) {
8769f59de930ae14566673d4d57597b836556820b29Maurice Lam            getNextButton().setEnabled(enabled);
8779f59de930ae14566673d4d57597b836556820b29Maurice Lam        }
8789f59de930ae14566673d4d57597b836556820b29Maurice Lam    }
8799f59de930ae14566673d4d57597b836556820b29Maurice Lam
880eca454ebc208c1b0d0c28dfa7669ee1cd8233d29Russell Brenner    @Override
881d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(DialogInterface dialogInterface, int button) {
882fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
883fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner            forget();
884fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        } else if (button == WifiDialog.BUTTON_SUBMIT) {
885ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff            if (mDialog != null) {
886ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff                submit(mDialog.getController());
887ca8e9cd383c0131cb5e73a177ec948de577a9f60Irfan Sheriff            }
888d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
88958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
890d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
89158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void submit(WifiConfigController configController) {
892b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff
89390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        final WifiConfiguration config = configController.getConfig();
89490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff
89590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        if (config == null) {
89690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null
89790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff                    && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
8986a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam                connect(mSelectedAccessPoint.networkId);
89990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
90090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else if (config.networkId != INVALID_NETWORK_ID) {
90190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            if (mSelectedAccessPoint != null) {
9025cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
90390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
90490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff        } else {
905de11bcec8de61d96d72f41d53599ec65c6d258c2Irfan Sheriff            if (configController.isEdit()) {
9065cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff                mWifiManager.save(config, mSaveListener);
90790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            } else {
9086a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam                connect(config);
90990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff            }
910d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
911d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
91258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
91358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
91486eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        }
91558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
916d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
917d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
918d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void forget() {
9193ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
9205ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson            if (mSelectedAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED) {
9215ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                // Network is active but has no network ID - must be ephemeral.
9225ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                mWifiManager.disableEphemeralNetwork(
9235ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                        AccessPoint.convertToQuotedString(mSelectedAccessPoint.ssid));
9245ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson            } else {
9255ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                // Should not happen, but a monkey seems to trigger it
9265ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig());
9275ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                return;
9285ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson            }
9295ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson        } else {
9305ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson            mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
9313ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff        }
9323ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff
933d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
93458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
93558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
93658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
93758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
9389f59de930ae14566673d4d57597b836556820b29Maurice Lam
9399f59de930ae14566673d4d57597b836556820b29Maurice Lam        // We need to rename/replace "Next" button in wifi setup context.
9409f59de930ae14566673d4d57597b836556820b29Maurice Lam        changeNextButtonState(false);
941d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
942d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
9436a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam    protected void connect(final WifiConfiguration config) {
9446a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam        mWifiManager.connect(config, mConnectListener);
9456a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam    }
9466a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam
9476a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam    protected void connect(final int networkId) {
9486a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam        mWifiManager.connect(networkId, mConnectListener);
9496a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam    }
9506a627652cbac48a7d5bea5bc81772f90d7d82af9Maurice Lam
95158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
95258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Refreshes acccess points and ask Wifi module to scan networks again.
95358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
954d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void refreshAccessPoints() {
955d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
956d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mScanner.resume();
957d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
958d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
959e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getPreferenceScreen().removeAll();
960d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
961d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
96258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
96358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when "add network" button is pressed.
96458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
965d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void onAddNetworkPressed() {
96658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // No exact access point is selected.
967d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mSelectedAccessPoint = null;
968fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner        showDialog(null, true);
969d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
970b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa
971b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    /* package */ int getAccessPointsCount() {
972e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
973e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (wifiIsEnabled) {
974e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            return getPreferenceScreen().getPreferenceCount();
975b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        } else {
976b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return 0;
977b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
978b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    }
97955de702961642521e247f155963644df81756215Daisuke Miyakawa
98058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
98158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
98258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
98358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void pauseWifiScan() {
98458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
98558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.pause();
98658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
98758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
98858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
98958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
99058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
99158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
99258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void resumeWifiScan() {
99358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
99458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
99558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
99655de702961642521e247f155963644df81756215Daisuke Miyakawa    }
997b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
998b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    @Override
999b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    protected int getHelpResource() {
100044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner        return R.string.help_url_wifi;
1001b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani    }
1002fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner
1003fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
100445f754e50618076213ed6911ff1e6c37b4db0467Fabrice Di Meglio        new BaseSearchIndexProvider() {
1005b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            @Override
100651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
1007fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
10086c9e03fd6d834009df10869a9701eee0129f915aFabrice Di Meglio                final Resources res = context.getResources();
1009b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
1010b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                // Add fragment title
1011fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                SearchIndexableRaw data = new SearchIndexableRaw(context);
10126c9e03fd6d834009df10869a9701eee0129f915aFabrice Di Meglio                data.title = res.getString(R.string.wifi_settings);
1013fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                data.screenTitle = res.getString(R.string.wifi_settings);
1014e6b336d1a05752b546319a33a5f5b5c65bccf4e9Fabrice Di Meglio                data.keywords = res.getString(R.string.keywords_wifi);
1015b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                result.add(data);
1016b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
1017b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                // Add available Wi-Fi access points
1018b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                WifiManager wifiManager =
1019b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                        (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
1020b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                final Collection<AccessPoint> accessPoints =
1021b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                        constructAccessPoints(context, wifiManager, null, null);
1022b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                for (AccessPoint accessPoint : accessPoints) {
1023b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                    // We are indexing only the saved Wi-Fi networks.
1024b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                    if (accessPoint.getConfig() == null) continue;
1025fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data = new SearchIndexableRaw(context);
1026b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                    data.title = accessPoint.getTitle().toString();
1027fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.screenTitle = res.getString(R.string.wifi_settings);
10285f3442af6f1d1141f8f4dff033d4176214281b81Fabrice Di Meglio                    data.enabled = enabled;
1029b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                    result.add(data);
1030b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                }
1031b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
1032b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                return result;
1033b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            }
1034b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        };
103548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
1036