WifiSettings.java revision 852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fd
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; 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; 29e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriffimport android.content.pm.PackageManager; 30fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.content.res.Resources; 3179470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager; 3248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo; 33af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState; 3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult; 3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState; 3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration; 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; 48fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.util.AttributeSet; 49590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log; 5048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu; 51e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo; 52e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.Gravity; 53fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.LayoutInflater; 5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu; 559c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater; 5648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem; 5748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View; 58fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.View.OnClickListener; 59fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.view.ViewGroup; 609e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo; 61fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.ImageButton; 629d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolbimport android.widget.PopupMenu; 639d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolbimport android.widget.PopupMenu.OnMenuItemClickListener; 64fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.RelativeLayout; 65e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch; 6618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView; 67e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast; 6848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 69590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R; 70590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment; 716ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriffimport com.android.settings.wifi.p2p.WifiP2pSettings; 72590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 7352727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList; 74d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection; 75fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.Collections; 76fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.HashMap; 7748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List; 78582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean; 7948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 80d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/** 81fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * Two types of UI are provided here. 82d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 83fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The first is for "usual Settings", appearing as any other Setup fragment. 84d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 85fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The second is for Setup Wizard, with a simplified interface that hides the action bar 86fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * and menus. 87d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 889c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment 89e78c1879058571c00879f0d3e756951302adf513Gilles Debunne implements DialogInterface.OnClickListener { 90590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff private static final String TAG = "WifiSettings"; 9190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int MENU_ID_WPS_PBC = Menu.FIRST; 9290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1; 936ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_P2P = Menu.FIRST + 2; 946ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3; 956ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_ADVANCED = Menu.FIRST + 4; 966ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_SCAN = Menu.FIRST + 5; 976ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_CONNECT = Menu.FIRST + 6; 986ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_FORGET = Menu.FIRST + 7; 996ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_MODIFY = Menu.FIRST + 8; 10048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 1013d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final int WIFI_DIALOG_ID = 1; 10290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int WPS_PBC_DIALOG_ID = 2; 10390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int WPS_PIN_DIALOG_ID = 3; 1043d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 105fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy // Combo scans can take 5-6s to complete - set to 10s. 106fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000; 107fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 1083d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Instance state keys 1093d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode"; 1103d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; 1113d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 11248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final IntentFilter mFilter; 11348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final BroadcastReceiver mReceiver; 11448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final Scanner mScanner; 11548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 11648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiManager mWifiManager; 1178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mConnectListener; 1188f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mSaveListener; 1198f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mForgetListener; 120e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff private boolean mP2pSupported; 12190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff 1228f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiEnabler mWifiEnabler; 124d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // An access point being editted is stored here. 125d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private AccessPoint mSelectedAccessPoint; 12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 127af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private DetailedState mLastState; 12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiInfo mLastInfo; 12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 130582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff private AtomicBoolean mConnected = new AtomicBoolean(false); 131582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff 132b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff private int mKeyStoreNetworkId = INVALID_NETWORK_ID; 13348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 13458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private WifiDialog mDialog; 135d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 13618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne private TextView mEmptyView; 13718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 13858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* Used in Wifi Setup context */ 139d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 14058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // this boolean extra specifies whether to disable the Next button when not connected 14158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect"; 1420575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 1430575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn // this boolean extra specifies whether to auto finish when connection is established 1440575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect"; 1450575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 14644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // this boolean extra is set if we are being invoked by the Setup Wizard 14744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner private static final String EXTRA_IS_FIRST_RUN = "firstRun"; 14844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner 14958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // should Next button only be enabled when we have a connection? 15058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private boolean mEnableNextOnConnection; 15186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 1520575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn // should activity finish once we have a connection? 1530575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn private boolean mAutoFinishOnConnection; 1540575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 1553d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Save the dialog details 1563d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private boolean mDlgEdit; 1573d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private AccessPoint mDlgAccessPoint; 1583d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private Bundle mAccessPointSavedState; 1593d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 16044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // the action bar uses a different set of controls for Setup Wizard 16144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner private boolean mSetupWizardMode; 162fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner 16358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* End of "used in Wifi Setup context" */ 16479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 165065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh public WifiSettings() { 16648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter = new IntentFilter(); 16748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 16948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION); 17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 171afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); 172afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); 17348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 17448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); 17548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 17648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mReceiver = new BroadcastReceiver() { 17748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 17848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onReceive(Context context, Intent intent) { 1796377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff handleEvent(context, intent); 18048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 18148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh }; 18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 18348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner = new Scanner(); 18448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 18548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 18648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 18744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner public void onCreate(Bundle icicle) { 18844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // Set this flag early, as it's needed by getHelpResource(), which is called by super 18944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner mSetupWizardMode = getActivity().getIntent().getBooleanExtra(EXTRA_IS_FIRST_RUN, false); 19044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner 19144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner super.onCreate(icicle); 19244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner } 19344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner 19444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner @Override 1959d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb public View onCreateView(final LayoutInflater inflater, ViewGroup container, 196fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner Bundle savedInstanceState) { 197fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner if (mSetupWizardMode) { 198fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner View view = inflater.inflate(R.layout.setup_preference, container, false); 1999d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb View other = view.findViewById(R.id.other_network); 2009d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb other.setOnClickListener(new OnClickListener() { 2019d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb @Override 2029d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb public void onClick(View v) { 2039d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb if (mWifiManager.isWifiEnabled()) { 2049d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb onAddNetworkPressed(); 205fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 2069d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb } 2079d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb }); 2089d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb final ImageButton b = (ImageButton) view.findViewById(R.id.more); 2099d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb if (b != null) { 2109d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb b.setOnClickListener(new OnClickListener() { 211fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner @Override 212fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public void onClick(View v) { 213fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner if (mWifiManager.isWifiEnabled()) { 2149d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb PopupMenu pm = new PopupMenu(inflater.getContext(), b); 2159d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb pm.inflate(R.menu.wifi_setup); 2169d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb pm.setOnMenuItemClickListener(new OnMenuItemClickListener() { 2179d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb @Override 2189d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb public boolean onMenuItemClick(MenuItem item) { 2199d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb if (R.id.wifi_wps == item.getItemId()) { 2209d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb showDialog(WPS_PBC_DIALOG_ID); 2219d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb return true; 2229d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb } 2239d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb return false; 2249d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb } 2259d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb }); 2269d5a6eb4d7ec662e666dc5dfe1506616d5b59341Michael Kolb pm.show(); 227fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 228fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 229fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner }); 230fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 231fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner return view; 232fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } else { 233fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner return super.onCreateView(inflater, container, savedInstanceState); 234fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 235fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 236fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 237fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner @Override 2389c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onActivityCreated(Bundle savedInstanceState) { 239852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner super.onActivityCreated(savedInstanceState); 240852cfa9335d8abbc164ae6a3b6b25e7da7e9a0fdRussell Brenner 241e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff mP2pSupported = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT); 24248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 2438f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2448f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener = new WifiManager.ActionListener() { 2458f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 2468f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2478f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 2488f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 2498f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_connect_message, 2508f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 2518f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2528f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 2538f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2548f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mSaveListener = new WifiManager.ActionListener() { 2558f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 2568f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2578f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 2588f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 2598f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_save_message, 2608f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 2618f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2628f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 2638f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2648f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mForgetListener = new WifiManager.ActionListener() { 2658f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 2668f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2678f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 2688f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 2698f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_forget_message, 2708f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 2718f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2728f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 2738f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2743d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (savedInstanceState != null 2753d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) { 2763d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE); 2773d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE); 2783d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 27948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 2809c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Activity activity = getActivity(); 2819c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Intent intent = activity.getIntent(); 2829c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa 2830575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn // first if we're supposed to finish once we have a connection 2840575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false); 2850575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 2860575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn if (mAutoFinishOnConnection) { 2870575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn // Hide the next button 2880575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn if (hasNextButton()) { 2890575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn getNextButton().setVisibility(View.GONE); 2900575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn } 2910575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 2920575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn final ConnectivityManager connectivity = (ConnectivityManager) 2930575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 2940575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn if (connectivity != null 2950575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) { 2960575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn activity.finish(); 2970575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn return; 2980575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn } 2990575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn } 3000575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 30179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // if we're supposed to enable/disable the Next button based on our current connection 30279470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // state, start it off in the right state 3039c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false); 304d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 305e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mEnableNextOnConnection) { 306e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (hasNextButton()) { 307e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final ConnectivityManager connectivity = (ConnectivityManager) 308e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 309e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (connectivity != null) { 310e78c1879058571c00879f0d3e756951302adf513Gilles Debunne NetworkInfo info = connectivity.getNetworkInfo( 311e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ConnectivityManager.TYPE_WIFI); 312e78c1879058571c00879f0d3e756951302adf513Gilles Debunne changeNextButtonState(info.isConnected()); 313d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 31479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng } 315e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 31679470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 317fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner addPreferencesFromResource(R.xml.wifi_settings); 318e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 31958d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner if (mSetupWizardMode) { 32058d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner getView().setSystemUiVisibility( 32158d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner View.STATUS_BAR_DISABLE_BACK | 32258d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner View.STATUS_BAR_DISABLE_HOME | 32358d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner View.STATUS_BAR_DISABLE_RECENT | 32458d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS | 32558d6ffc5f56a94afade76ac8dc434c6e3d43fd6dRussell Brenner View.STATUS_BAR_DISABLE_CLOCK); 326bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn } 327bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn 32844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // On/off switch is hidden for Setup Wizard 32944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner if (!mSetupWizardMode) { 330e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Switch actionBarSwitch = new Switch(activity); 331e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 332e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (activity instanceof PreferenceActivity) { 333e78c1879058571c00879f0d3e756951302adf513Gilles Debunne PreferenceActivity preferenceActivity = (PreferenceActivity) activity; 334e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { 335e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final int padding = activity.getResources().getDimensionPixelSize( 336e78c1879058571c00879f0d3e756951302adf513Gilles Debunne R.dimen.action_bar_switch_padding); 337e78c1879058571c00879f0d3e756951302adf513Gilles Debunne actionBarSwitch.setPadding(0, 0, padding, 0); 338e78c1879058571c00879f0d3e756951302adf513Gilles Debunne activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, 339e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.DISPLAY_SHOW_CUSTOM); 340e78c1879058571c00879f0d3e756951302adf513Gilles Debunne activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams( 341e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.LayoutParams.WRAP_CONTENT, 342e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.LayoutParams.WRAP_CONTENT, 34379d8e80a304922c34a6bd344f1fa49dd7dfd106dFabrice Di Meglio Gravity.CENTER_VERTICAL | Gravity.END)); 3440f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani } 345a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa } 3467bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff 347e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mWifiEnabler = new WifiEnabler(activity, actionBarSwitch); 34848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 34948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 350dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey mEmptyView = (TextView) getView().findViewById(android.R.id.empty); 35118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getListView().setEmptyView(mEmptyView); 35218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 35344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner if (!mSetupWizardMode) { 354fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner registerForContextMenu(getListView()); 355fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } 356cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner setHasOptionsMenu(true); 35748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 35848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 35948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 3609c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onResume() { 36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onResume(); 36248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 36348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.resume(); 36448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 365590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 3669c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().registerReceiver(mReceiver, mFilter); 367b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mKeyStoreNetworkId != INVALID_NETWORK_ID && 368d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) { 3695cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.connect(mKeyStoreNetworkId, mConnectListener); 37048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 371b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mKeyStoreNetworkId = INVALID_NETWORK_ID; 372e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 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 } 3829c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().unregisterReceiver(mReceiver); 38348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 38448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 38548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 3879c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 388cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); 38944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner if (mSetupWizardMode) { 39044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // FIXME: add setIcon() when graphics are available 39144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc) 392fc1281e6a80951321d9bc46c8eee27da1a4ba3edRussell Brenner .setIcon(R.drawable.ic_wps) 39344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner .setEnabled(wifiIsEnabled) 39444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 39544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network) 39644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner .setEnabled(wifiIsEnabled) 39744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 39844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner } else { 39990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc) 4004837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff .setIcon(R.drawable.ic_wps) 401dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setEnabled(wifiIsEnabled) 402dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 403e78c1879058571c00879f0d3e756951302adf513Gilles Debunne menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network) 4044837a691ceb4a5d7114d3f3be8352dde3e0f084cIrfan Sheriff .setIcon(R.drawable.ic_menu_add) 405dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setEnabled(wifiIsEnabled) 406dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 40790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan) 40890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff //.setIcon(R.drawable.ic_menu_scan_network) 40990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setEnabled(wifiIsEnabled) 4100c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 41190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin) 41290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setEnabled(wifiIsEnabled) 41390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4140c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff if (mP2pSupported) { 4150c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff menu.add(Menu.NONE, MENU_ID_P2P, 0, R.string.wifi_menu_p2p) 4160c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff .setEnabled(wifiIsEnabled) 4170c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4180c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff } 419d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced) 420dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne //.setIcon(android.R.drawable.ic_menu_manage) 421348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 422fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } 4239c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onCreateOptionsMenu(menu, inflater); 42448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 42548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 42648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 4273d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani public void onSaveInstanceState(Bundle outState) { 4283d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani super.onSaveInstanceState(outState); 4293d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 4303d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // If the dialog is showing, save its state. 4313d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (mDialog != null && mDialog.isShowing()) { 4323d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit); 4333d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (mDlgAccessPoint != null) { 4343d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mAccessPointSavedState = new Bundle(); 4353d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgAccessPoint.saveWifiState(mAccessPointSavedState); 4363d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); 4373d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 4383d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 4393d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 4403d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 4413d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani @Override 44248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onOptionsItemSelected(MenuItem item) { 44348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 44490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case MENU_ID_WPS_PBC: 44590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff showDialog(WPS_PBC_DIALOG_ID); 44690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return true; 4476ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff case MENU_ID_P2P: 4486ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff if (getActivity() instanceof PreferenceActivity) { 4496ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff ((PreferenceActivity) getActivity()).startPreferencePanel( 4506ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff WifiP2pSettings.class.getCanonicalName(), 4516ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff null, 4526ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff R.string.wifi_p2p_settings_title, null, 4536ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff this, 0); 4546ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff } else { 4556ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff startFragment(this, WifiP2pSettings.class.getCanonicalName(), -1, null); 4566ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff } 4576ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff return true; 45890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case MENU_ID_WPS_PIN: 45990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff showDialog(WPS_PIN_DIALOG_ID); 46090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return true; 46148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_SCAN: 4622215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff if (mWifiManager.isWifiEnabled()) { 463c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff mScanner.forceScan(); 4642215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff } 46548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 466e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case MENU_ID_ADD_NETWORK: 467e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mWifiManager.isWifiEnabled()) { 468e78c1879058571c00879f0d3e756951302adf513Gilles Debunne onAddNetworkPressed(); 469e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 470e78c1879058571c00879f0d3e756951302adf513Gilles Debunne return true; 47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_ADVANCED: 4729eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani if (getActivity() instanceof PreferenceActivity) { 4739eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani ((PreferenceActivity) getActivity()).startPreferencePanel( 474dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne AdvancedWifiSettings.class.getCanonicalName(), 4759eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani null, 4769eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani R.string.wifi_advanced_titlebar, null, 4779eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani this, 0); 4789eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani } else { 479dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null); 4809eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani } 48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 48248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 48348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onOptionsItemSelected(item); 48448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 48548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 48648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 48748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) { 488fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner if (info instanceof AdapterContextMenuInfo) { 48948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Preference preference = (Preference) getListView().getItemAtPosition( 49048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh ((AdapterContextMenuInfo) info).position); 49148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 49248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 493d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 494d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.setHeaderTitle(mSelectedAccessPoint.ssid); 495d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint.getLevel() != -1 496d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa && mSelectedAccessPoint.getState() == null) { 49748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); 49848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 499b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 50048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget); 501f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify); 50248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 50348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 50448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 50548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 50648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 50748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 50848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onContextItemSelected(MenuItem item) { 509d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint == null) { 51048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 51148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 51248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 513d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_CONNECT: { 514b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 515d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (!requireKeyStore(mSelectedAccessPoint.getConfig())) { 5165cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.connect(mSelectedAccessPoint.networkId, 5178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener); 51848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 519d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) { 52022d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy /** Bypass dialog for unsecured networks */ 52122d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.generateOpenNetworkConfig(); 5225cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.connect(mSelectedAccessPoint.getConfig(), 5238f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener); 52448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 525fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner showDialog(mSelectedAccessPoint, true); 52648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 52748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 528d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 529d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_FORGET: { 5305cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener); 53148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 532d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 533d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_MODIFY: { 534fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner showDialog(mSelectedAccessPoint, true); 53548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 536d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 53748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 53848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 53948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 54048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 54148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 54248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 54348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 544d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 54522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy /** Bypass dialog for unsecured, unsaved networks */ 54622d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE && 54722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { 54822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.generateOpenNetworkConfig(); 5495cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener); 55022d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy } else { 551fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner showDialog(mSelectedAccessPoint, false); 55222d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy } 55348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 55448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onPreferenceTreeClick(screen, preference); 55548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 55648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 55748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 55848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 55948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void showDialog(AccessPoint accessPoint, boolean edit) { 56048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 5613d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani removeDialog(WIFI_DIALOG_ID); 5623d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDialog = null; 5633d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 5643d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 5653d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Save the access point and edit mode 5663d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgAccessPoint = accessPoint; 5673d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgEdit = edit; 5683d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 5693d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani showDialog(WIFI_DIALOG_ID); 5703d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 5713d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 5723d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani @Override 5733d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani public Dialog onCreateDialog(int dialogId) { 57490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff switch (dialogId) { 57590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WIFI_DIALOG_ID: 57690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff AccessPoint ap = mDlgAccessPoint; // For manual launch 57790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (ap == null) { // For re-launch from saved state 57890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mAccessPointSavedState != null) { 57990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff ap = new AccessPoint(getActivity(), mAccessPointSavedState); 58090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff // For repeated orientation changes 58190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mDlgAccessPoint = ap; 58290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 58390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 58490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff // If it's still null, fine, it's for Add Network 58590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mSelectedAccessPoint = ap; 58690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit); 58790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return mDialog; 58890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WPS_PBC_DIALOG_ID: 58990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return new WpsDialog(getActivity(), WpsInfo.PBC); 59090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WPS_PIN_DIALOG_ID: 59190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return new WpsDialog(getActivity(), WpsInfo.DISPLAY); 59290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 59390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return super.onCreateDialog(dialogId); 59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 59548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 59648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private boolean requireKeyStore(WifiConfiguration config) { 597d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (WifiConfigController.requireKeyStore(config) && 598d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.getInstance().state() != KeyStore.State.UNLOCKED) { 59948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mKeyStoreNetworkId = config.networkId; 6009c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Credentials.getInstance().unlock(getActivity()); 60148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 60248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 60348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return false; 60448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 60548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 606d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /** 607d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Shows the latest access points available with supplimental information like 608d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * the strength of network and the security for it. 609d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 61048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateAccessPoints() { 6119da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani // Safeguard from some delayed event handling 6129da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani if (getActivity() == null) return; 6139da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani 614e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final int wifiState = mWifiManager.getWifiState(); 615e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 616e78c1879058571c00879f0d3e756951302adf513Gilles Debunne switch (wifiState) { 617e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLED: 618e78c1879058571c00879f0d3e756951302adf513Gilles Debunne // AccessPoints are automatically sorted with TreeSet. 619e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final Collection<AccessPoint> accessPoints = constructAccessPoints(); 620fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy getPreferenceScreen().removeAll(); 621fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner if(accessPoints.size() == 0) { 622fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner addMessagePreference(R.string.wifi_empty_list_wifi_on); 623fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } 624fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner for (AccessPoint accessPoint : accessPoints) { 625fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner getPreferenceScreen().addPreference(accessPoint); 626e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 627e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 62886eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 62918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne case WifiManager.WIFI_STATE_ENABLING: 63018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 63118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne break; 63218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 633e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLING: 634e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_stopping); 635e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 636e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 637e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLED: 638e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_empty_list_wifi_off); 639e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 640d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 641d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 64248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 643e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private void addMessagePreference(int messageId) { 64418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne if (mEmptyView != null) mEmptyView.setText(messageId); 64518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 646e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 647e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 648fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** Returns sorted list of access points */ 649fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private List<AccessPoint> constructAccessPoints() { 650fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>(); 651fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** Lookup table to more quickly update AccessPoints by only considering objects with the 652fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy * correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */ 653fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>(); 654d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 655d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); 65648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (configs != null) { 65748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (WifiConfiguration config : configs) { 6589c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa AccessPoint accessPoint = new AccessPoint(getActivity(), config); 65948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoint.update(mLastInfo, mLastState); 66048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoints.add(accessPoint); 661fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy apMap.put(accessPoint.ssid, accessPoint); 66248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 66348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 66448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 665d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<ScanResult> results = mWifiManager.getScanResults(); 66648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (results != null) { 66748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (ScanResult result : results) { 66848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Ignore hidden and ad-hoc networks. 66948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (result.SSID == null || result.SSID.length() == 0 || 67048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh result.capabilities.contains("[IBSS]")) { 67148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh continue; 67248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 67348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 67448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh boolean found = false; 675cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy for (AccessPoint accessPoint : apMap.getAll(result.SSID)) { 676cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy if (accessPoint.update(result)) 677cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy found = true; 67848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 67948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!found) { 680fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy AccessPoint accessPoint = new AccessPoint(getActivity(), result); 681fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy accessPoints.add(accessPoint); 682fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy apMap.put(accessPoint.ssid, accessPoint); 68348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 68448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 68548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 68648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 687cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy // Pre-sort accessPoints to speed preference insertion 688fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy Collections.sort(accessPoints); 689d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa return accessPoints; 69048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 69148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 692fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** A restricted multimap for use in constructAccessPoints */ 693fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private class Multimap<K,V> { 694fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private HashMap<K,List<V>> store = new HashMap<K,List<V>>(); 695cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy /** retrieve a non-null list of values with key K */ 696fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy List<V> getAll(K key) { 697cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy List<V> values = store.get(key); 698cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy return values != null ? values : Collections.<V>emptyList(); 699fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 700fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 701fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy void put(K key, V val) { 702fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy List<V> curVals = store.get(key); 703fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy if (curVals == null) { 704fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy curVals = new ArrayList<V>(3); 705fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy store.put(key, curVals); 706fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 707fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy curVals.add(val); 708fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 709fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 710fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 7116377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff private void handleEvent(Context context, Intent intent) { 71248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh String action = intent.getAction(); 71348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { 71448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 71548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiManager.WIFI_STATE_UNKNOWN)); 716d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) || 717afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) || 718afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) { 719d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa updateAccessPoints(); 72048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 721582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //Ignore supplicant state changes when network is connected 722582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and 723582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //introduce a broadcast that combines the supplicant and network 724582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //network state change events so the apps dont have to worry about 725582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //ignoring supplicant state change when network is connected 726582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //to get more fine grained information. 72709a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff SupplicantState state = (SupplicantState) intent.getParcelableExtra( 72809a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff WifiManager.EXTRA_NEW_STATE); 72909a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff if (!mConnected.get() && SupplicantState.isHandshakeState(state)) { 73009a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff updateConnectionState(WifiInfo.getDetailedStateOf(state)); 731582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff } 73248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 73379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( 73479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng WifiManager.EXTRA_NETWORK_INFO); 735582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff mConnected.set(info.isConnected()); 736d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(info.isConnected()); 737317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff updateAccessPoints(); 73879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng updateConnectionState(info.getDetailedState()); 7390575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn if (mAutoFinishOnConnection && info.isConnected()) { 7400575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn getActivity().finish(); 7410575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn return; 7420575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn } 74348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) { 74448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(null); 74548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 74648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 74748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 748af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private void updateConnectionState(DetailedState state) { 7492215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff /* sticky broadcasts can call this when wifi is disabled */ 750e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff if (!mWifiManager.isWifiEnabled()) { 751e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff mScanner.pause(); 7522215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff return; 753e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff } 7542215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff 755af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh if (state == DetailedState.OBTAINING_IPADDR) { 75648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 75748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 75848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 75948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 76048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 76148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastInfo = mWifiManager.getConnectionInfo(); 76248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state != null) { 76348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastState = state; 76448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 76548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 766e78c1879058571c00879f0d3e756951302adf513Gilles Debunne for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) { 767d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // Maybe there's a WifiConfigPreference 768e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Preference preference = getPreferenceScreen().getPreference(i); 769d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (preference instanceof AccessPoint) { 77086eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa final AccessPoint accessPoint = (AccessPoint) preference; 77186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa accessPoint.update(mLastInfo, mLastState); 772d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 773d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 77448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 77548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 77648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateWifiState(int state) { 777e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getActivity().invalidateOptionsMenu(); 778e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 779e78c1879058571c00879f0d3e756951302adf513Gilles Debunne switch (state) { 780e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLED: 781e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mScanner.resume(); 78218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne return; // not break, to avoid the call to pause() below 783e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 784e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLING: 785e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_starting); 786e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 787e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 788e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLED: 789e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_empty_list_wifi_off); 790e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 79148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 792e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 793c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne mLastInfo = null; 794c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne mLastState = null; 795e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mScanner.pause(); 79648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 79748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 79848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private class Scanner extends Handler { 79948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private int mRetry = 0; 80048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 80148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void resume() { 80248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!hasMessages(0)) { 80348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh sendEmptyMessage(0); 80448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 80548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 80648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 807c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff void forceScan() { 80822d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy removeMessages(0); 809c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff sendEmptyMessage(0); 810c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff } 811c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff 81248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void pause() { 81348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 81448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh removeMessages(0); 81548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 81648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 81748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 81848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void handleMessage(Message message) { 81948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiManager.startScanActive()) { 82048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 82148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (++mRetry >= 3) { 82248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 8239c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Toast.makeText(getActivity(), R.string.wifi_fail_to_scan, 82448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Toast.LENGTH_LONG).show(); 825e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff return; 82648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 827fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS); 82848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 82948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 830d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 83158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 83258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Renames/replaces "Next" button when appropriate. "Next" button usually exists in 83358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Wifi setup screens, not in usual wifi settings screen. 83458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * 83558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * @param connected true when the device is connected to a wifi network. 83658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 83758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private void changeNextButtonState(boolean connected) { 838fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner if (mEnableNextOnConnection && hasNextButton()) { 83958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa getNextButton().setEnabled(connected); 840d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 841d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 842d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 843d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa public void onClick(DialogInterface dialogInterface, int button) { 844fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { 845fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner forget(); 846fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } else if (button == WifiDialog.BUTTON_SUBMIT) { 847fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner submit(mDialog.getController()); 848d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 84958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 850d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 85158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void submit(WifiConfigController configController) { 852b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff 85390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff final WifiConfiguration config = configController.getConfig(); 85490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff 85590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (config == null) { 85690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mSelectedAccessPoint != null 85790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff && !requireKeyStore(mSelectedAccessPoint.getConfig()) 85890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 8595cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.connect(mSelectedAccessPoint.networkId, 86090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mConnectListener); 86190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 86290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else if (config.networkId != INVALID_NETWORK_ID) { 86390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mSelectedAccessPoint != null) { 8645cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.save(config, mSaveListener); 86590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 86690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else { 86790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (configController.isEdit() || requireKeyStore(config)) { 8685cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.save(config, mSaveListener); 86990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else { 8705cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.connect(config, mConnectListener); 87190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 872d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 873d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 87458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 87558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 87686eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa } 87758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 878d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 879d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 880d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void forget() { 8813ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { 8823ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff // Should not happen, but a monkey seems to triger it 8833ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig()); 8843ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff return; 8853ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff } 8863ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff 8875cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener); 888d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 88958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 89058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 89158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 89258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 893d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 89458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // We need to rename/replace "Next" button in wifi setup context. 895d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(false); 896d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 897d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 89858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 89958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Refreshes acccess points and ask Wifi module to scan networks again. 90058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 901d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void refreshAccessPoints() { 902d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 903d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mScanner.resume(); 904d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 905d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 906e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getPreferenceScreen().removeAll(); 907d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 908d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 90958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 91058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when "add network" button is pressed. 91158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 912d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void onAddNetworkPressed() { 91358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // No exact access point is selected. 914d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = null; 915fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner showDialog(null, true); 916d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 917b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa 918b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa /* package */ int getAccessPointsCount() { 919e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); 920e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (wifiIsEnabled) { 921e78c1879058571c00879f0d3e756951302adf513Gilles Debunne return getPreferenceScreen().getPreferenceCount(); 922b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } else { 923b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa return 0; 924b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 925b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 92655de702961642521e247f155963644df81756215Daisuke Miyakawa 92758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 92858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to pause wifi scan. May be ignored when the module is disabled. 92958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 93058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void pauseWifiScan() { 93158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 93258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.pause(); 93358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 93458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 93558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 93658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 93758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to resume wifi scan. May be ignored when the module is disabled. 93858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 93958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void resumeWifiScan() { 94058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 94158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 94258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 94355de702961642521e247f155963644df81756215Daisuke Miyakawa } 944b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 945b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 946b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 94744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner if (mSetupWizardMode) { 94844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner return 0; 949fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } 95044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner return R.string.help_url_wifi; 951b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 952fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 953fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner /** 954fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner * Used as the outer frame of all setup wizard pages that need to adjust their margins based 955fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner * on the total size of the available display. (e.g. side margins set to 10% of total width.) 956fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner */ 957fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public static class ProportionalOuterFrame extends RelativeLayout { 958fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public ProportionalOuterFrame(Context context) { 959fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner super(context); 960fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 961fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public ProportionalOuterFrame(Context context, AttributeSet attrs) { 962fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner super(context, attrs); 963fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 964fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public ProportionalOuterFrame(Context context, AttributeSet attrs, int defStyle) { 965fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner super(context, attrs, defStyle); 966fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 967fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 968fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner /** 969fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner * Set our margins and title area height proportionally to the available display size 970fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner */ 971fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner @Override 972fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 973fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 974fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 975fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner final Resources resources = getContext().getResources(); 976fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner float titleHeight = resources.getFraction(R.dimen.setup_title_height, 1, 1); 977fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner float sideMargin = resources.getFraction(R.dimen.setup_border_width, 1, 1); 978fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner int bottom = resources.getDimensionPixelSize(R.dimen.setup_margin_bottom); 979fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner setPadding( 980fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner (int) (parentWidth * sideMargin), 981fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 0, 982fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner (int) (parentWidth * sideMargin), 983fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner bottom); 984fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner View title = findViewById(R.id.title_area); 985fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner if (title != null) { 986fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner title.setMinimumHeight((int) (parentHeight * titleHeight)); 987fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 988fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner super.onMeasure(widthMeasureSpec, heightMeasureSpec); 989fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 990fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 991fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 99248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh} 993