WifiSettings.java revision b0b37ae21c172491bc170659b5f429601858ddc1
148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh/* 248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Copyright (C) 2010 The Android Open Source Project 348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * 448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * you may not use this file except in compliance with the License. 648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * You may obtain a copy of the License at 748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * 848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * http://www.apache.org/licenses/LICENSE-2.0 948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * 1048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software 1148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS, 1248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * See the License for the specific language governing permissions and 1448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * limitations under the License. 1548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh */ 1648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 1748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehpackage com.android.settings.wifi; 1848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 195d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawaimport static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; 205d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa 21e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.app.ActionBar; 229c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.app.Activity; 23e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriffimport android.app.AlertDialog; 243d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasaniimport android.app.Dialog; 2548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver; 2648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context; 2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface; 2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent; 2948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter; 3079470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager; 3148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo; 32af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState; 3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult; 3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState; 3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration; 36e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.net.wifi.WifiConfiguration.KeyMgmt; 3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo; 3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager; 3990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriffimport android.net.wifi.WpsInfo; 4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle; 4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler; 4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message; 4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference; 449e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.preference.PreferenceActivity; 4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen; 4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials; 4748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore; 48590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log; 4948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu; 50e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo; 51e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.Gravity; 5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu; 539c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater; 5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem; 5548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View; 569e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo; 57e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch; 5818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView; 59e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast; 6048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 61590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R; 62590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment; 636ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriffimport com.android.settings.wifi.p2p.WifiP2pSettings; 64590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 6552727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList; 66d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection; 67fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.Collections; 68fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.HashMap; 6948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List; 70582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean; 7148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/** 73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * This currently provides three types of UI. 74d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 75d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Two are for phones with relatively small screens: "for SetupWizard" and "for usual Settings". 76d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Users just need to launch WifiSettings Activity as usual. The request will be appropriately 77d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * handled by ActivityManager, and they will have appropriate look-and-feel with this fragment. 78d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 79d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Third type is for Setup Wizard with X-Large, landscape UI. Users need to launch 80d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * {@link WifiSettingsForSetupWizardXL} Activity, which contains this fragment but also has 81d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * other decorations specific to that screen. 82d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 839c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment 84e78c1879058571c00879f0d3e756951302adf513Gilles Debunne implements DialogInterface.OnClickListener { 85590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff private static final String TAG = "WifiSettings"; 8690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int MENU_ID_WPS_PBC = Menu.FIRST; 8790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1; 886ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_P2P = Menu.FIRST + 2; 896ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3; 906ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_ADVANCED = Menu.FIRST + 4; 916ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_SCAN = Menu.FIRST + 5; 926ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_CONNECT = Menu.FIRST + 6; 936ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_FORGET = Menu.FIRST + 7; 946ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_MODIFY = Menu.FIRST + 8; 9548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 963d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final int WIFI_DIALOG_ID = 1; 9790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int WPS_PBC_DIALOG_ID = 2; 9890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int WPS_PIN_DIALOG_ID = 3; 993d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 100fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy // Combo scans can take 5-6s to complete - set to 10s. 101fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000; 102fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 1033d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Instance state keys 1043d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode"; 1053d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; 1063d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 10748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final IntentFilter mFilter; 10848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final BroadcastReceiver mReceiver; 10948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final Scanner mScanner; 11048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 11148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiManager mWifiManager; 1128f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.Channel mChannel; 1138f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mConnectListener; 1148f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mSaveListener; 1158f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mForgetListener; 11690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff 1178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 11848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiEnabler mWifiEnabler; 119d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // An access point being editted is stored here. 120d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private AccessPoint mSelectedAccessPoint; 12148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 122af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private DetailedState mLastState; 12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiInfo mLastInfo; 12448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 125582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff private AtomicBoolean mConnected = new AtomicBoolean(false); 126582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff 127b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff private int mKeyStoreNetworkId = INVALID_NETWORK_ID; 12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 12958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private WifiDialog mDialog; 130d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 13118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne private TextView mEmptyView; 13218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 13358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* Used in Wifi Setup context */ 134d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 13558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // this boolean extra specifies whether to disable the Next button when not connected 13658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect"; 137d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 13858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // should Next button only be enabled when we have a connection? 13958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private boolean mEnableNextOnConnection; 14058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private boolean mInXlSetupWizard; 14186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 1423d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Save the dialog details 1433d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private boolean mDlgEdit; 1443d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private AccessPoint mDlgAccessPoint; 1453d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private Bundle mAccessPointSavedState; 1463d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 14758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* End of "used in Wifi Setup context" */ 14879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 149065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh public WifiSettings() { 15048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter = new IntentFilter(); 15148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 15248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 15348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION); 15448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 155afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); 156afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); 15748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 15848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); 15948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 16048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mReceiver = new BroadcastReceiver() { 16148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 16248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onReceive(Context context, Intent intent) { 1636377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff handleEvent(context, intent); 16448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 16548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh }; 16648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 16748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner = new Scanner(); 16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 16948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 1710688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa public void onAttach(Activity activity) { 1720688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa super.onAttach(activity); 1730688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa 1740688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa mInXlSetupWizard = (activity instanceof WifiSettingsForSetupWizardXL); 1750688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa } 1760688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa 1770688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa @Override 1789c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onActivityCreated(Bundle savedInstanceState) { 1799c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // We don't call super.onActivityCreated() here, since it assumes we already set up 1809c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // Preference (probably in onCreate()), while WifiSettings exceptionally set it up in 1819c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // this method. 18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 18348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 1848f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mChannel = mWifiManager.initialize(getActivity(), getActivity().getMainLooper(), null); 1858f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 1868f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener = new WifiManager.ActionListener() { 1878f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 1888f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 1898f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 1908f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 1918f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_connect_message, 1928f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 1938f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 1948f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 1958f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 1968f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mSaveListener = new WifiManager.ActionListener() { 1978f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 1988f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 1998f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 2008f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 2018f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_save_message, 2028f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 2038f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2048f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 2058f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2068f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mForgetListener = new WifiManager.ActionListener() { 2078f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 2088f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2098f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 2108f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 2118f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_forget_message, 2128f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 2138f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2148f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 2158f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2163d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (savedInstanceState != null 2173d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) { 2183d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE); 2193d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE); 2203d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 2229c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Activity activity = getActivity(); 2239c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Intent intent = activity.getIntent(); 2249c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa 22579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // if we're supposed to enable/disable the Next button based on our current connection 22679470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // state, start it off in the right state 2279c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false); 228d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 229e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mEnableNextOnConnection) { 230e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (hasNextButton()) { 231e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final ConnectivityManager connectivity = (ConnectivityManager) 232e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 233e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (connectivity != null) { 234e78c1879058571c00879f0d3e756951302adf513Gilles Debunne NetworkInfo info = connectivity.getNetworkInfo( 235e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ConnectivityManager.TYPE_WIFI); 236e78c1879058571c00879f0d3e756951302adf513Gilles Debunne changeNextButtonState(info.isConnected()); 237d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 23879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng } 239e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 24079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 241e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mInXlSetupWizard) { 242e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addPreferencesFromResource(R.xml.wifi_access_points_for_wifi_setup_xl); 243e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } else { 244e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addPreferencesFromResource(R.xml.wifi_settings); 245e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 246e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Switch actionBarSwitch = new Switch(activity); 247e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 248e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (activity instanceof PreferenceActivity) { 249e78c1879058571c00879f0d3e756951302adf513Gilles Debunne PreferenceActivity preferenceActivity = (PreferenceActivity) activity; 250e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { 251e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final int padding = activity.getResources().getDimensionPixelSize( 252e78c1879058571c00879f0d3e756951302adf513Gilles Debunne R.dimen.action_bar_switch_padding); 253e78c1879058571c00879f0d3e756951302adf513Gilles Debunne actionBarSwitch.setPadding(0, 0, padding, 0); 254e78c1879058571c00879f0d3e756951302adf513Gilles Debunne activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, 255e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.DISPLAY_SHOW_CUSTOM); 256e78c1879058571c00879f0d3e756951302adf513Gilles Debunne activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams( 257e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.LayoutParams.WRAP_CONTENT, 258e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.LayoutParams.WRAP_CONTENT, 259e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Gravity.CENTER_VERTICAL | Gravity.RIGHT)); 2600f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani } 261a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa } 2627bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff 263e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mWifiEnabler = new WifiEnabler(activity, actionBarSwitch); 26448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 26548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 266dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey mEmptyView = (TextView) getView().findViewById(android.R.id.empty); 26718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getListView().setEmptyView(mEmptyView); 26818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 269e78c1879058571c00879f0d3e756951302adf513Gilles Debunne registerForContextMenu(getListView()); 270e78c1879058571c00879f0d3e756951302adf513Gilles Debunne setHasOptionsMenu(true); 271e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 2729c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // After confirming PreferenceScreen is available, we call super. 2739c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onActivityCreated(savedInstanceState); 27448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 27548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 27648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 2779c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onResume() { 27848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onResume(); 27948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 28048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.resume(); 28148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 282590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 2839c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().registerReceiver(mReceiver, mFilter); 284b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mKeyStoreNetworkId != INVALID_NETWORK_ID && 285d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) { 2868f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.connect(mChannel, mKeyStoreNetworkId, mConnectListener); 28748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 288b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mKeyStoreNetworkId = INVALID_NETWORK_ID; 289e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 29058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 29148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 29248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 29348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 2949c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onPause() { 29548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onPause(); 29648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 29748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.pause(); 29848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 2999c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().unregisterReceiver(mReceiver); 30048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 30148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 30248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 30348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 3049c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 305d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // We don't want menus in Setup Wizard XL. 306d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (!mInXlSetupWizard) { 307e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); 30890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc) 309dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setEnabled(wifiIsEnabled) 310dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 3116ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff menu.add(Menu.NONE, MENU_ID_P2P, 0, R.string.wifi_menu_p2p) 3126ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff .setEnabled(wifiIsEnabled) 3136ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 314e78c1879058571c00879f0d3e756951302adf513Gilles Debunne menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network) 315dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setEnabled(wifiIsEnabled) 316dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 31790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan) 31890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff //.setIcon(R.drawable.ic_menu_scan_network) 31990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setEnabled(wifiIsEnabled) 32090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 32190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin) 32290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setEnabled(wifiIsEnabled) 32390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 324d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced) 325dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne //.setIcon(android.R.drawable.ic_menu_manage) 326348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 32790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 3289c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onCreateOptionsMenu(menu, inflater); 32948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 33048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 33148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 3323d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani public void onSaveInstanceState(Bundle outState) { 3333d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani super.onSaveInstanceState(outState); 3343d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 3353d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // If the dialog is showing, save its state. 3363d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (mDialog != null && mDialog.isShowing()) { 3373d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit); 3383d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (mDlgAccessPoint != null) { 3393d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mAccessPointSavedState = new Bundle(); 3403d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgAccessPoint.saveWifiState(mAccessPointSavedState); 3413d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); 3423d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 3433d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 3443d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 3453d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 3463d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani @Override 34748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onOptionsItemSelected(MenuItem item) { 34848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 34990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case MENU_ID_WPS_PBC: 35090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff showDialog(WPS_PBC_DIALOG_ID); 35190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return true; 3526ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff case MENU_ID_P2P: 3536ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff if (getActivity() instanceof PreferenceActivity) { 3546ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff ((PreferenceActivity) getActivity()).startPreferencePanel( 3556ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff WifiP2pSettings.class.getCanonicalName(), 3566ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff null, 3576ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff R.string.wifi_p2p_settings_title, null, 3586ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff this, 0); 3596ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff } else { 3606ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff startFragment(this, WifiP2pSettings.class.getCanonicalName(), -1, null); 3616ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff } 3626ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff return true; 36390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case MENU_ID_WPS_PIN: 36490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff showDialog(WPS_PIN_DIALOG_ID); 36590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return true; 36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_SCAN: 3672215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff if (mWifiManager.isWifiEnabled()) { 368c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff mScanner.forceScan(); 3692215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff } 37048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 371e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case MENU_ID_ADD_NETWORK: 372e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mWifiManager.isWifiEnabled()) { 373e78c1879058571c00879f0d3e756951302adf513Gilles Debunne onAddNetworkPressed(); 374e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 375e78c1879058571c00879f0d3e756951302adf513Gilles Debunne return true; 37648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_ADVANCED: 3779eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani if (getActivity() instanceof PreferenceActivity) { 3789eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani ((PreferenceActivity) getActivity()).startPreferencePanel( 379dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne AdvancedWifiSettings.class.getCanonicalName(), 3809eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani null, 3819eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani R.string.wifi_advanced_titlebar, null, 3829eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani this, 0); 3839eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani } else { 384dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null); 3859eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani } 38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 38848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onOptionsItemSelected(item); 38948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 39148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 39248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) { 393267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa if (mInXlSetupWizard) { 394267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onCreateContextMenu(menu, view, info); 395267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa } else if (info instanceof AdapterContextMenuInfo) { 39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Preference preference = (Preference) getListView().getItemAtPosition( 39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh ((AdapterContextMenuInfo) info).position); 39848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 39948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 400d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 401d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.setHeaderTitle(mSelectedAccessPoint.ssid); 402d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint.getLevel() != -1 403d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa && mSelectedAccessPoint.getState() == null) { 40448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); 40548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 406b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 40748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget); 408f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify); 40948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 41448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 41548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onContextItemSelected(MenuItem item) { 416d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint == null) { 41748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 420d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_CONNECT: { 421b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 422d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (!requireKeyStore(mSelectedAccessPoint.getConfig())) { 4238f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.connect(mChannel, mSelectedAccessPoint.networkId, 4248f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener); 42548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 426d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) { 42722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy /** Bypass dialog for unsecured networks */ 42822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.generateOpenNetworkConfig(); 4298f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.connect(mChannel, mSelectedAccessPoint.getConfig(), 4308f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener); 43148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 432d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(mSelectedAccessPoint, true); 43348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 43448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 435d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 436d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_FORGET: { 4378f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.forget(mChannel, mSelectedAccessPoint.networkId, mForgetListener); 43848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 439d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 440d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_MODIFY: { 441d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(mSelectedAccessPoint, true); 44248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 443d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 44448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 44548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 44648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 44748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 451d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 45222d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy /** Bypass dialog for unsecured, unsaved networks */ 45322d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE && 45422d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { 45522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.generateOpenNetworkConfig(); 4568f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.connect(mChannel, mSelectedAccessPoint.getConfig(), mConnectListener); 45722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy } else { 45822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy showConfigUi(mSelectedAccessPoint, false); 45922d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy } 46048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 46148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onPreferenceTreeClick(screen, preference); 46248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 46348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 46448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 46548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 466d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /** 46758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Shows an appropriate Wifi configuration component. 46858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when a user clicks "Add network" preference or one of available networks is selected. 469d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 470d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private void showConfigUi(AccessPoint accessPoint, boolean edit) { 471d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mInXlSetupWizard) { 47258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).showConfigUi(accessPoint, edit); 473d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else { 474d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showDialog(accessPoint, edit); 475d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 476d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 477d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void showDialog(AccessPoint accessPoint, boolean edit) { 47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 4803d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani removeDialog(WIFI_DIALOG_ID); 4813d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDialog = null; 4823d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 4833d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 4843d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Save the access point and edit mode 4853d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgAccessPoint = accessPoint; 4863d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgEdit = edit; 4873d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 4883d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani showDialog(WIFI_DIALOG_ID); 4893d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 4903d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 4913d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani @Override 4923d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani public Dialog onCreateDialog(int dialogId) { 49390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff switch (dialogId) { 49490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WIFI_DIALOG_ID: 49590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff AccessPoint ap = mDlgAccessPoint; // For manual launch 49690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (ap == null) { // For re-launch from saved state 49790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mAccessPointSavedState != null) { 49890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff ap = new AccessPoint(getActivity(), mAccessPointSavedState); 49990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff // For repeated orientation changes 50090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mDlgAccessPoint = ap; 50190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 50290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 50390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff // If it's still null, fine, it's for Add Network 50490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mSelectedAccessPoint = ap; 50590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit); 50690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return mDialog; 50790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WPS_PBC_DIALOG_ID: 50890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return new WpsDialog(getActivity(), WpsInfo.PBC); 50990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WPS_PIN_DIALOG_ID: 51090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return new WpsDialog(getActivity(), WpsInfo.DISPLAY); 51190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 51290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return super.onCreateDialog(dialogId); 51348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 51448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 51548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private boolean requireKeyStore(WifiConfiguration config) { 516d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (WifiConfigController.requireKeyStore(config) && 517d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.getInstance().state() != KeyStore.State.UNLOCKED) { 51848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mKeyStoreNetworkId = config.networkId; 5199c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Credentials.getInstance().unlock(getActivity()); 52048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 52148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 52248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return false; 52348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 52448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 525d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /** 526d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Shows the latest access points available with supplimental information like 527d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * the strength of network and the security for it. 528d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 52948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateAccessPoints() { 530e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final int wifiState = mWifiManager.getWifiState(); 531e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 532e78c1879058571c00879f0d3e756951302adf513Gilles Debunne switch (wifiState) { 533e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLED: 534e78c1879058571c00879f0d3e756951302adf513Gilles Debunne // AccessPoints are automatically sorted with TreeSet. 535e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final Collection<AccessPoint> accessPoints = constructAccessPoints(); 536fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy getPreferenceScreen().removeAll(); 537e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mInXlSetupWizard) { 538e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ((WifiSettingsForSetupWizardXL)getActivity()).onAccessPointsUpdated( 539e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getPreferenceScreen(), accessPoints); 540e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } else { 5416243e8e466fae6d1828e1862586c07fc4eabf4c7Vishal Mahaveer if(accessPoints.size() == 0) { 5426243e8e466fae6d1828e1862586c07fc4eabf4c7Vishal Mahaveer addMessagePreference(R.string.wifi_empty_list_wifi_on); 5436243e8e466fae6d1828e1862586c07fc4eabf4c7Vishal Mahaveer } 544e78c1879058571c00879f0d3e756951302adf513Gilles Debunne for (AccessPoint accessPoint : accessPoints) { 545e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getPreferenceScreen().addPreference(accessPoint); 546e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 547e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 548e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 54986eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 55018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne case WifiManager.WIFI_STATE_ENABLING: 55118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 55218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne break; 55318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 554e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLING: 555e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_stopping); 556e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 557e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 558e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLED: 559e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_empty_list_wifi_off); 560e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 561d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 562d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 56348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 564e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private void addMessagePreference(int messageId) { 56518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne if (mEmptyView != null) mEmptyView.setText(messageId); 56618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 567e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 568e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 569fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** Returns sorted list of access points */ 570fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private List<AccessPoint> constructAccessPoints() { 571fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>(); 572fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** Lookup table to more quickly update AccessPoints by only considering objects with the 573fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy * correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */ 574fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>(); 575d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 576d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); 57748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (configs != null) { 57848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (WifiConfiguration config : configs) { 5799c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa AccessPoint accessPoint = new AccessPoint(getActivity(), config); 58048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoint.update(mLastInfo, mLastState); 58148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoints.add(accessPoint); 582fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy apMap.put(accessPoint.ssid, accessPoint); 58348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 58448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 58548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 586d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<ScanResult> results = mWifiManager.getScanResults(); 58748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (results != null) { 58848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (ScanResult result : results) { 58948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Ignore hidden and ad-hoc networks. 59048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (result.SSID == null || result.SSID.length() == 0 || 59148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh result.capabilities.contains("[IBSS]")) { 59248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh continue; 59348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 59548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh boolean found = false; 596cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy for (AccessPoint accessPoint : apMap.getAll(result.SSID)) { 597cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy if (accessPoint.update(result)) 598cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy found = true; 59948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 60048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!found) { 601fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy AccessPoint accessPoint = new AccessPoint(getActivity(), result); 602fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy accessPoints.add(accessPoint); 603fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy apMap.put(accessPoint.ssid, accessPoint); 60448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 60548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 60648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 60748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 608cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy // Pre-sort accessPoints to speed preference insertion 609fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy Collections.sort(accessPoints); 610d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa return accessPoints; 61148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 61248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 613fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** A restricted multimap for use in constructAccessPoints */ 614fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private class Multimap<K,V> { 615fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private HashMap<K,List<V>> store = new HashMap<K,List<V>>(); 616cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy /** retrieve a non-null list of values with key K */ 617fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy List<V> getAll(K key) { 618cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy List<V> values = store.get(key); 619cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy return values != null ? values : Collections.<V>emptyList(); 620fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 621fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 622fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy void put(K key, V val) { 623fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy List<V> curVals = store.get(key); 624fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy if (curVals == null) { 625fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy curVals = new ArrayList<V>(3); 626fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy store.put(key, curVals); 627fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 628fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy curVals.add(val); 629fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 630fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 631fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 6326377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff private void handleEvent(Context context, Intent intent) { 63348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh String action = intent.getAction(); 63448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { 63548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 63648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiManager.WIFI_STATE_UNKNOWN)); 637d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) || 638afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) || 639afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) { 640d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa updateAccessPoints(); 64148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 642582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //Ignore supplicant state changes when network is connected 643582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and 644582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //introduce a broadcast that combines the supplicant and network 645582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //network state change events so the apps dont have to worry about 646582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //ignoring supplicant state change when network is connected 647582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //to get more fine grained information. 64809a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff SupplicantState state = (SupplicantState) intent.getParcelableExtra( 64909a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff WifiManager.EXTRA_NEW_STATE); 65009a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff if (!mConnected.get() && SupplicantState.isHandshakeState(state)) { 65109a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff updateConnectionState(WifiInfo.getDetailedStateOf(state)); 652582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff } 653cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 654cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa if (mInXlSetupWizard) { 655cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onSupplicantStateChanged(intent); 656cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 65748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 65879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( 65979470d1a66f479919c13e27546391439cafa0ee7Freeman Ng WifiManager.EXTRA_NETWORK_INFO); 660582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff mConnected.set(info.isConnected()); 661d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(info.isConnected()); 662317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff updateAccessPoints(); 66379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng updateConnectionState(info.getDetailedState()); 66448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) { 66548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(null); 66648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 66748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 66848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 669af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private void updateConnectionState(DetailedState state) { 6702215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff /* sticky broadcasts can call this when wifi is disabled */ 671e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff if (!mWifiManager.isWifiEnabled()) { 672e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff mScanner.pause(); 6732215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff return; 674e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff } 6752215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff 676af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh if (state == DetailedState.OBTAINING_IPADDR) { 67748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 67848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 67948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 68048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 68148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 68248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastInfo = mWifiManager.getConnectionInfo(); 68348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state != null) { 68448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastState = state; 68548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 68648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 687e78c1879058571c00879f0d3e756951302adf513Gilles Debunne for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) { 688d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // Maybe there's a WifiConfigPreference 689e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Preference preference = getPreferenceScreen().getPreference(i); 690d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (preference instanceof AccessPoint) { 69186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa final AccessPoint accessPoint = (AccessPoint) preference; 69286eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa accessPoint.update(mLastInfo, mLastState); 693d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 694d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 695d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 69658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mInXlSetupWizard) { 69758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).updateConnectionState(mLastState); 69848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 69948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 70048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 70148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateWifiState(int state) { 702e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getActivity().invalidateOptionsMenu(); 703e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 704e78c1879058571c00879f0d3e756951302adf513Gilles Debunne switch (state) { 705e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLED: 706e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mScanner.resume(); 70718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne return; // not break, to avoid the call to pause() below 708e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 709e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLING: 710e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_starting); 711e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 712e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 713e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLED: 714e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_empty_list_wifi_off); 715e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 71648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 717e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 718c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne mLastInfo = null; 719c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne mLastState = null; 720e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mScanner.pause(); 72148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 72248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 72348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private class Scanner extends Handler { 72448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private int mRetry = 0; 72548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 72648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void resume() { 72748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!hasMessages(0)) { 72848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh sendEmptyMessage(0); 72948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 73048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 73148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 732c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff void forceScan() { 73322d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy removeMessages(0); 734c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff sendEmptyMessage(0); 735c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff } 736c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff 73748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void pause() { 73848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 73948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh removeMessages(0); 74048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 74148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 74248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 74348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void handleMessage(Message message) { 74448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiManager.startScanActive()) { 74548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 74648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (++mRetry >= 3) { 74748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 7489c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Toast.makeText(getActivity(), R.string.wifi_fail_to_scan, 74948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Toast.LENGTH_LONG).show(); 750e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff return; 75148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 752fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS); 75348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 75448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 755d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 75658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 75758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Renames/replaces "Next" button when appropriate. "Next" button usually exists in 75858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Wifi setup screens, not in usual wifi settings screen. 75958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * 76058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * @param connected true when the device is connected to a wifi network. 76158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 76258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private void changeNextButtonState(boolean connected) { 763d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mInXlSetupWizard) { 76458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).changeNextButtonState(connected); 765d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (mEnableNextOnConnection && hasNextButton()) { 76658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa getNextButton().setEnabled(connected); 767d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 768d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 769d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 770d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa public void onClick(DialogInterface dialogInterface, int button) { 77158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mInXlSetupWizard) { 77258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { 77314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa forget(); 77458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (button == WifiDialog.BUTTON_SUBMIT) { 77558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onConnectButtonPressed(); 77658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 77758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else { 77858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { 77958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa forget(); 78058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (button == WifiDialog.BUTTON_SUBMIT) { 78158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa submit(mDialog.getController()); 7828b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa } 783d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 784d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 78558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 786d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 78758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void submit(WifiConfigController configController) { 788b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff 78990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff final WifiConfiguration config = configController.getConfig(); 79090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff 79190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (config == null) { 79290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mSelectedAccessPoint != null 79390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff && !requireKeyStore(mSelectedAccessPoint.getConfig()) 79490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 79590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mWifiManager.connect(mChannel, mSelectedAccessPoint.networkId, 79690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mConnectListener); 79790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 79890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else if (config.networkId != INVALID_NETWORK_ID) { 79990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mSelectedAccessPoint != null) { 80090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff saveNetwork(config); 80190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 80290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else { 80390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (configController.isEdit() || requireKeyStore(config)) { 80490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff saveNetwork(config); 80590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else { 80690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mWifiManager.connect(mChannel, config, mConnectListener); 80790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 808d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 809d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 81058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 81158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 81286eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa } 81358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 814d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 815d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 816cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa private void saveNetwork(WifiConfiguration config) { 817cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa if (mInXlSetupWizard) { 818cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onSaveNetwork(config); 819cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } else { 8208f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.save(mChannel, config, mSaveListener); 821cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 822cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 823cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 824d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void forget() { 8258f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.forget(mChannel, mSelectedAccessPoint.networkId, mForgetListener); 826d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 82758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 82858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 82958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 83058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 831d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 83258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // We need to rename/replace "Next" button in wifi setup context. 833d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(false); 834d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 835d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 83658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 83758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Refreshes acccess points and ask Wifi module to scan networks again. 83858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 839d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void refreshAccessPoints() { 840d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 841d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mScanner.resume(); 842d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 843d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 844e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getPreferenceScreen().removeAll(); 845d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 846d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 84758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 84858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when "add network" button is pressed. 84958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 850d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void onAddNetworkPressed() { 85158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // No exact access point is selected. 852d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = null; 853d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(null, true); 854d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 855b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa 856b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa /* package */ int getAccessPointsCount() { 857e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); 858e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (wifiIsEnabled) { 859e78c1879058571c00879f0d3e756951302adf513Gilles Debunne return getPreferenceScreen().getPreferenceCount(); 860b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } else { 861b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa return 0; 862b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 863b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 86455de702961642521e247f155963644df81756215Daisuke Miyakawa 86558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 86658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to pause wifi scan. May be ignored when the module is disabled. 86758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 86858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void pauseWifiScan() { 86958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 87058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.pause(); 87158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 87258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 87358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 87458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 87558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to resume wifi scan. May be ignored when the module is disabled. 87658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 87758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void resumeWifiScan() { 87858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 87958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 88058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 88155de702961642521e247f155963644df81756215Daisuke Miyakawa } 882b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 883b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 884b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 885b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani return R.string.help_url_wifi; 886b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 88748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh} 888