WifiSettings.java revision fc86669031e9c11efa688cbf95e53c77dbc0a03d
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; 62fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brennerimport android.widget.RelativeLayout; 63e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch; 6418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView; 65e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast; 6648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 67590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R; 68590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment; 696ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriffimport com.android.settings.wifi.p2p.WifiP2pSettings; 70590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 7152727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList; 72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection; 73fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.Collections; 74fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levyimport java.util.HashMap; 7548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List; 76582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean; 7748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 78d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/** 79fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * Two types of UI are provided here. 80d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 81fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The first is for "usual Settings", appearing as any other Setup fragment. 82d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 83fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * The second is for Setup Wizard, with a simplified interface that hides the action bar 84fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner * and menus. 85d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 869c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment 87e78c1879058571c00879f0d3e756951302adf513Gilles Debunne implements DialogInterface.OnClickListener { 88590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff private static final String TAG = "WifiSettings"; 8990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int MENU_ID_WPS_PBC = Menu.FIRST; 9090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1; 916ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_P2P = Menu.FIRST + 2; 926ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3; 936ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_ADVANCED = Menu.FIRST + 4; 946ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_SCAN = Menu.FIRST + 5; 956ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_CONNECT = Menu.FIRST + 6; 966ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_FORGET = Menu.FIRST + 7; 976ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff private static final int MENU_ID_MODIFY = Menu.FIRST + 8; 9848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 993d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final int WIFI_DIALOG_ID = 1; 10090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int WPS_PBC_DIALOG_ID = 2; 10190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff private static final int WPS_PIN_DIALOG_ID = 3; 1023d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 103fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy // Combo scans can take 5-6s to complete - set to 10s. 104fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000; 105fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 1063d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Instance state keys 1073d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode"; 1083d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; 1093d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 11048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final IntentFilter mFilter; 11148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final BroadcastReceiver mReceiver; 11248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final Scanner mScanner; 11348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 11448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiManager mWifiManager; 1158f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.Channel mChannel; 1168f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mConnectListener; 1178f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mSaveListener; 1188f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff private WifiManager.ActionListener mForgetListener; 119e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff private boolean mP2pSupported; 12090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff 1218f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 12248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiEnabler mWifiEnabler; 123d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // An access point being editted is stored here. 124d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private AccessPoint mSelectedAccessPoint; 12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 126af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private DetailedState mLastState; 12748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiInfo mLastInfo; 12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 129582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff private AtomicBoolean mConnected = new AtomicBoolean(false); 130582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff 131b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff private int mKeyStoreNetworkId = INVALID_NETWORK_ID; 13248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 13358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private WifiDialog mDialog; 134d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 13518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne private TextView mEmptyView; 13618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 13758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* Used in Wifi Setup context */ 138d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 13958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // this boolean extra specifies whether to disable the Next button when not connected 14058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect"; 1410575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 1420575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn // this boolean extra specifies whether to auto finish when connection is established 1430575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect"; 1440575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 14544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // this boolean extra is set if we are being invoked by the Setup Wizard 14644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner private static final String EXTRA_IS_FIRST_RUN = "firstRun"; 14744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner 148bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn private static final String EXTRA_WIFI_DISABLE_BACK = "wifi_disable_back"; 149fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner 15058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // should Next button only be enabled when we have a connection? 15158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private boolean mEnableNextOnConnection; 15286eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 1530575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn // should activity finish once we have a connection? 1540575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn private boolean mAutoFinishOnConnection; 1550575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 1563d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Save the dialog details 1573d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private boolean mDlgEdit; 1583d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private AccessPoint mDlgAccessPoint; 1593d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani private Bundle mAccessPointSavedState; 1603d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 16144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // the action bar uses a different set of controls for Setup Wizard 16244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner private boolean mSetupWizardMode; 163fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner 16458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* End of "used in Wifi Setup context" */ 16579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 166065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh public WifiSettings() { 16748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter = new IntentFilter(); 16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 16948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION); 17148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 172afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); 173afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); 17448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 17548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); 17648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 17748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mReceiver = new BroadcastReceiver() { 17848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 17948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onReceive(Context context, Intent intent) { 1806377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff handleEvent(context, intent); 18148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh }; 18348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 18448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner = new Scanner(); 18548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 18648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 18748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 18844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner public void onCreate(Bundle icicle) { 18944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // Set this flag early, as it's needed by getHelpResource(), which is called by super 19044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner mSetupWizardMode = getActivity().getIntent().getBooleanExtra(EXTRA_IS_FIRST_RUN, false); 19144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner 19244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner super.onCreate(icicle); 19344a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner } 19444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner 19544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner @Override 196fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public View onCreateView(LayoutInflater inflater, ViewGroup container, 197fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner Bundle savedInstanceState) { 198fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner if (mSetupWizardMode) { 199fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner View view = inflater.inflate(R.layout.setup_preference, container, false); 200fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner ImageButton b1 = (ImageButton) view.findViewById(R.id.wps_push); 201fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner if (b1 != null) { 202fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner b1.setOnClickListener(new OnClickListener() { 203fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner @Override 204fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public void onClick(View v) { 205fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner showDialog(WPS_PBC_DIALOG_ID); 206fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 207fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner }); 208fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 209fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner ImageButton b2 = (ImageButton) view.findViewById(R.id.add_network); 210fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner if (b2 != null) { 211fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner b2.setOnClickListener(new OnClickListener() { 212fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner @Override 213fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public void onClick(View v) { 214fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner if (mWifiManager.isWifiEnabled()) { 215fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner onAddNetworkPressed(); 216fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 217fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 218fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner }); 219fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 220fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner return view; 221fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } else { 222fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner return super.onCreateView(inflater, container, savedInstanceState); 223fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 224fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 225fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 226fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner @Override 2279c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onActivityCreated(Bundle savedInstanceState) { 2289c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // We don't call super.onActivityCreated() here, since it assumes we already set up 2299c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // Preference (probably in onCreate()), while WifiSettings exceptionally set it up in 2309c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // this method. 23148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 232e8d79cf188a79c44ea6a801c2e101564ab630288Irfan Sheriff mP2pSupported = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT); 23348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 2348f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mChannel = mWifiManager.initialize(getActivity(), getActivity().getMainLooper(), null); 2358f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2368f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener = new WifiManager.ActionListener() { 2378f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 2388f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2398f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 2408f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 2418f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_connect_message, 2428f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 2438f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2448f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 2458f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2468f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mSaveListener = new WifiManager.ActionListener() { 2478f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 2488f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2498f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 2508f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 2518f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_save_message, 2528f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 2538f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2548f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 2558f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2568f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mForgetListener = new WifiManager.ActionListener() { 2578f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 2588f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2598f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 2608f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.makeText(getActivity(), 2618f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff R.string.wifi_failed_forget_message, 2628f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff Toast.LENGTH_SHORT).show(); 2638f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 2648f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }; 2658f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff 2663d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (savedInstanceState != null 2673d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) { 2683d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE); 2693d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE); 2703d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 27148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 2729c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Activity activity = getActivity(); 2739c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Intent intent = activity.getIntent(); 2749c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa 2750575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn // first if we're supposed to finish once we have a connection 2760575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false); 2770575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 2780575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn if (mAutoFinishOnConnection) { 2790575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn // Hide the next button 2800575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn if (hasNextButton()) { 2810575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn getNextButton().setVisibility(View.GONE); 2820575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn } 2830575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 2840575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn final ConnectivityManager connectivity = (ConnectivityManager) 2850575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 2860575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn if (connectivity != null 2870575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) { 2880575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn activity.finish(); 2890575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn return; 2900575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn } 2910575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn } 2920575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn 29379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // if we're supposed to enable/disable the Next button based on our current connection 29479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // state, start it off in the right state 2959c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false); 296d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 297e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mEnableNextOnConnection) { 298e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (hasNextButton()) { 299e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final ConnectivityManager connectivity = (ConnectivityManager) 300e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 301e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (connectivity != null) { 302e78c1879058571c00879f0d3e756951302adf513Gilles Debunne NetworkInfo info = connectivity.getNetworkInfo( 303e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ConnectivityManager.TYPE_WIFI); 304e78c1879058571c00879f0d3e756951302adf513Gilles Debunne changeNextButtonState(info.isConnected()); 305d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 30679470d1a66f479919c13e27546391439cafa0ee7Freeman Ng } 307e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 30879470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 309fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner addPreferencesFromResource(R.xml.wifi_settings); 310e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 311bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn // Back key is disabled if requested 312bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn if (intent.getBooleanExtra(EXTRA_WIFI_DISABLE_BACK, false)) { 313bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn getView().setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK); 314bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn } 315bfff317559045481a71acf2bd8f6c304f078c457Andrew Flynn 31644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // On/off switch is hidden for Setup Wizard 31744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner if (!mSetupWizardMode) { 318e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Switch actionBarSwitch = new Switch(activity); 319e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 320e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (activity instanceof PreferenceActivity) { 321e78c1879058571c00879f0d3e756951302adf513Gilles Debunne PreferenceActivity preferenceActivity = (PreferenceActivity) activity; 322e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { 323e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final int padding = activity.getResources().getDimensionPixelSize( 324e78c1879058571c00879f0d3e756951302adf513Gilles Debunne R.dimen.action_bar_switch_padding); 325e78c1879058571c00879f0d3e756951302adf513Gilles Debunne actionBarSwitch.setPadding(0, 0, padding, 0); 326e78c1879058571c00879f0d3e756951302adf513Gilles Debunne activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, 327e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.DISPLAY_SHOW_CUSTOM); 328e78c1879058571c00879f0d3e756951302adf513Gilles Debunne activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams( 329e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.LayoutParams.WRAP_CONTENT, 330e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.LayoutParams.WRAP_CONTENT, 331e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Gravity.CENTER_VERTICAL | Gravity.RIGHT)); 3320f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani } 333a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa } 3347bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff 335e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mWifiEnabler = new WifiEnabler(activity, actionBarSwitch); 33648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 33748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 338dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey mEmptyView = (TextView) getView().findViewById(android.R.id.empty); 33918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getListView().setEmptyView(mEmptyView); 34018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 34144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner if (!mSetupWizardMode) { 342fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner registerForContextMenu(getListView()); 343fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } 344cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner setHasOptionsMenu(true); 345e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 3469c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // After confirming PreferenceScreen is available, we call super. 3479c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onActivityCreated(savedInstanceState); 34848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 34948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 35048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 3519c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onResume() { 35248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onResume(); 35348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 35448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.resume(); 35548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 356590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 3579c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().registerReceiver(mReceiver, mFilter); 358b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mKeyStoreNetworkId != INVALID_NETWORK_ID && 359d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) { 3608f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.connect(mChannel, mKeyStoreNetworkId, mConnectListener); 36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 362b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mKeyStoreNetworkId = INVALID_NETWORK_ID; 363e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 36458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 36548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 36748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 3689c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onPause() { 36948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onPause(); 37048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 37148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.pause(); 37248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 3739c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().unregisterReceiver(mReceiver); 37448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 37548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 37648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 37748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 3789c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 379cfadc35af8236cedb157a89b3c591c1afb2b761cRussell Brenner final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); 38044a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner if (mSetupWizardMode) { 38144a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner // FIXME: add setIcon() when graphics are available 38244a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc) 383fc1281e6a80951321d9bc46c8eee27da1a4ba3edRussell Brenner .setIcon(R.drawable.ic_wps) 38444a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner .setEnabled(wifiIsEnabled) 38544a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 38644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network) 38744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner .setEnabled(wifiIsEnabled) 38844a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 38944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner } else { 39090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc) 391dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setEnabled(wifiIsEnabled) 392dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 393e78c1879058571c00879f0d3e756951302adf513Gilles Debunne menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network) 394dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setEnabled(wifiIsEnabled) 395dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 39690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan) 39790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff //.setIcon(R.drawable.ic_menu_scan_network) 39890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setEnabled(wifiIsEnabled) 3990c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 40090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin) 40190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setEnabled(wifiIsEnabled) 40290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4030c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff if (mP2pSupported) { 4040c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff menu.add(Menu.NONE, MENU_ID_P2P, 0, R.string.wifi_menu_p2p) 4050c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff .setEnabled(wifiIsEnabled) 4060c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4070c925dc71598c3042c75143a57331acf1c949cd0Irfan Sheriff } 408d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced) 409dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne //.setIcon(android.R.drawable.ic_menu_manage) 410348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 411fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } 4129c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onCreateOptionsMenu(menu, inflater); 41348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 41548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 4163d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani public void onSaveInstanceState(Bundle outState) { 4173d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani super.onSaveInstanceState(outState); 4183d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 4193d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // If the dialog is showing, save its state. 4203d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (mDialog != null && mDialog.isShowing()) { 4213d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani outState.putBoolean(SAVE_DIALOG_EDIT_MODE, mDlgEdit); 4223d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani if (mDlgAccessPoint != null) { 4233d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mAccessPointSavedState = new Bundle(); 4243d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgAccessPoint.saveWifiState(mAccessPointSavedState); 4253d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); 4263d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 4273d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 4283d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 4293d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 4303d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani @Override 43148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onOptionsItemSelected(MenuItem item) { 43248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 43390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case MENU_ID_WPS_PBC: 43490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff showDialog(WPS_PBC_DIALOG_ID); 43590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return true; 4366ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff case MENU_ID_P2P: 4376ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff if (getActivity() instanceof PreferenceActivity) { 4386ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff ((PreferenceActivity) getActivity()).startPreferencePanel( 4396ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff WifiP2pSettings.class.getCanonicalName(), 4406ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff null, 4416ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff R.string.wifi_p2p_settings_title, null, 4426ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff this, 0); 4436ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff } else { 4446ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff startFragment(this, WifiP2pSettings.class.getCanonicalName(), -1, null); 4456ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff } 4466ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff return true; 44790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case MENU_ID_WPS_PIN: 44890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff showDialog(WPS_PIN_DIALOG_ID); 44990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return true; 45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_SCAN: 4512215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff if (mWifiManager.isWifiEnabled()) { 452c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff mScanner.forceScan(); 4532215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff } 45448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 455e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case MENU_ID_ADD_NETWORK: 456e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mWifiManager.isWifiEnabled()) { 457e78c1879058571c00879f0d3e756951302adf513Gilles Debunne onAddNetworkPressed(); 458e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 459e78c1879058571c00879f0d3e756951302adf513Gilles Debunne return true; 46048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_ADVANCED: 4619eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani if (getActivity() instanceof PreferenceActivity) { 4629eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani ((PreferenceActivity) getActivity()).startPreferencePanel( 463dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne AdvancedWifiSettings.class.getCanonicalName(), 4649eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani null, 4659eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani R.string.wifi_advanced_titlebar, null, 4669eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani this, 0); 4679eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani } else { 468dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null); 4699eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani } 47048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onOptionsItemSelected(item); 47348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 47548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 47648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) { 477fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner if (info instanceof AdapterContextMenuInfo) { 47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Preference preference = (Preference) getListView().getItemAtPosition( 47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh ((AdapterContextMenuInfo) info).position); 48048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 482d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 483d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.setHeaderTitle(mSelectedAccessPoint.ssid); 484d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint.getLevel() != -1 485d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa && mSelectedAccessPoint.getState() == null) { 48648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); 48748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 488b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 48948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget); 490f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify); 49148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 49248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 49348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 49448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 49548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 49648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 49748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onContextItemSelected(MenuItem item) { 498d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint == null) { 49948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 50048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 50148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 502d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_CONNECT: { 503b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 504d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (!requireKeyStore(mSelectedAccessPoint.getConfig())) { 5058f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.connect(mChannel, mSelectedAccessPoint.networkId, 5068f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener); 50748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 508d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) { 50922d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy /** Bypass dialog for unsecured networks */ 51022d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.generateOpenNetworkConfig(); 5118f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.connect(mChannel, mSelectedAccessPoint.getConfig(), 5128f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mConnectListener); 51348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 514fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner showDialog(mSelectedAccessPoint, true); 51548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 51648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 517d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 518d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_FORGET: { 5198f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.forget(mChannel, mSelectedAccessPoint.networkId, mForgetListener); 52048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 521d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 522d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_MODIFY: { 523fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner showDialog(mSelectedAccessPoint, true); 52448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 525d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 52648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 52748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 52848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 52948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 53048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 53148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 53248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 533d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 53422d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy /** Bypass dialog for unsecured, unsaved networks */ 53522d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE && 53622d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { 53722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy mSelectedAccessPoint.generateOpenNetworkConfig(); 5388f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.connect(mChannel, mSelectedAccessPoint.getConfig(), mConnectListener); 53922d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy } else { 540fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner showDialog(mSelectedAccessPoint, false); 54122d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy } 54248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 54348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onPreferenceTreeClick(screen, preference); 54448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 54548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 54648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 54748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 54848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void showDialog(AccessPoint accessPoint, boolean edit) { 54948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 5503d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani removeDialog(WIFI_DIALOG_ID); 5513d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDialog = null; 5523d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 5533d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 5543d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani // Save the access point and edit mode 5553d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgAccessPoint = accessPoint; 5563d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani mDlgEdit = edit; 5573d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 5583d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani showDialog(WIFI_DIALOG_ID); 5593d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani } 5603d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani 5613d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani @Override 5623d13110d40b972a44c80558e0179323f9b330b2fAmith Yamasani public Dialog onCreateDialog(int dialogId) { 56390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff switch (dialogId) { 56490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WIFI_DIALOG_ID: 56590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff AccessPoint ap = mDlgAccessPoint; // For manual launch 56690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (ap == null) { // For re-launch from saved state 56790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mAccessPointSavedState != null) { 56890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff ap = new AccessPoint(getActivity(), mAccessPointSavedState); 56990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff // For repeated orientation changes 57090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mDlgAccessPoint = ap; 57190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 57290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 57390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff // If it's still null, fine, it's for Add Network 57490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mSelectedAccessPoint = ap; 57590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit); 57690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return mDialog; 57790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WPS_PBC_DIALOG_ID: 57890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return new WpsDialog(getActivity(), WpsInfo.PBC); 57990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff case WPS_PIN_DIALOG_ID: 58090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return new WpsDialog(getActivity(), WpsInfo.DISPLAY); 58190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 58290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff return super.onCreateDialog(dialogId); 58348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 58448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 58548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private boolean requireKeyStore(WifiConfiguration config) { 586d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (WifiConfigController.requireKeyStore(config) && 587d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.getInstance().state() != KeyStore.State.UNLOCKED) { 58848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mKeyStoreNetworkId = config.networkId; 5899c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Credentials.getInstance().unlock(getActivity()); 59048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 59148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 59248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return false; 59348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 595d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /** 596d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Shows the latest access points available with supplimental information like 597d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * the strength of network and the security for it. 598d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 59948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateAccessPoints() { 6009da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani // Safeguard from some delayed event handling 6019da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani if (getActivity() == null) return; 6029da80a90bec430c52f78d6a951687a208d311d9eAmith Yamasani 603e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final int wifiState = mWifiManager.getWifiState(); 604e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 605e78c1879058571c00879f0d3e756951302adf513Gilles Debunne switch (wifiState) { 606e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLED: 607e78c1879058571c00879f0d3e756951302adf513Gilles Debunne // AccessPoints are automatically sorted with TreeSet. 608e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final Collection<AccessPoint> accessPoints = constructAccessPoints(); 609fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy getPreferenceScreen().removeAll(); 610fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner if(accessPoints.size() == 0) { 611fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner addMessagePreference(R.string.wifi_empty_list_wifi_on); 612fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } 613fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner for (AccessPoint accessPoint : accessPoints) { 614fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner getPreferenceScreen().addPreference(accessPoint); 615e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 616e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 61786eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 61818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne case WifiManager.WIFI_STATE_ENABLING: 61918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 62018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne break; 62118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 622e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLING: 623e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_stopping); 624e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 625e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 626e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLED: 627e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_empty_list_wifi_off); 628e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 629d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 630d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 63148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 632e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private void addMessagePreference(int messageId) { 63318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne if (mEmptyView != null) mEmptyView.setText(messageId); 63418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 635e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 636e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 637fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** Returns sorted list of access points */ 638fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private List<AccessPoint> constructAccessPoints() { 639fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>(); 640fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** Lookup table to more quickly update AccessPoints by only considering objects with the 641fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy * correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */ 642fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>(); 643d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 644d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); 64548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (configs != null) { 64648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (WifiConfiguration config : configs) { 6479c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa AccessPoint accessPoint = new AccessPoint(getActivity(), config); 64848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoint.update(mLastInfo, mLastState); 64948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoints.add(accessPoint); 650fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy apMap.put(accessPoint.ssid, accessPoint); 65148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 65248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 65348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 654d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<ScanResult> results = mWifiManager.getScanResults(); 65548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (results != null) { 65648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (ScanResult result : results) { 65748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Ignore hidden and ad-hoc networks. 65848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (result.SSID == null || result.SSID.length() == 0 || 65948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh result.capabilities.contains("[IBSS]")) { 66048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh continue; 66148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 66248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 66348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh boolean found = false; 664cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy for (AccessPoint accessPoint : apMap.getAll(result.SSID)) { 665cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy if (accessPoint.update(result)) 666cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy found = true; 66748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 66848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!found) { 669fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy AccessPoint accessPoint = new AccessPoint(getActivity(), result); 670fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy accessPoints.add(accessPoint); 671fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy apMap.put(accessPoint.ssid, accessPoint); 67248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 67348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 67448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 67548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 676cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy // Pre-sort accessPoints to speed preference insertion 677fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy Collections.sort(accessPoints); 678d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa return accessPoints; 67948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 68048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 681fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy /** A restricted multimap for use in constructAccessPoints */ 682fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private class Multimap<K,V> { 683fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy private HashMap<K,List<V>> store = new HashMap<K,List<V>>(); 684cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy /** retrieve a non-null list of values with key K */ 685fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy List<V> getAll(K key) { 686cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy List<V> values = store.get(key); 687cc38b493927167f9c8aa43020c1bf4d3a870abf0Isaac Levy return values != null ? values : Collections.<V>emptyList(); 688fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 689fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 690fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy void put(K key, V val) { 691fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy List<V> curVals = store.get(key); 692fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy if (curVals == null) { 693fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy curVals = new ArrayList<V>(3); 694fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy store.put(key, curVals); 695fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 696fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy curVals.add(val); 697fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 698fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy } 699fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy 7006377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff private void handleEvent(Context context, Intent intent) { 70148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh String action = intent.getAction(); 70248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { 70348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 70448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiManager.WIFI_STATE_UNKNOWN)); 705d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) || 706afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) || 707afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) { 708d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa updateAccessPoints(); 70948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 710582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //Ignore supplicant state changes when network is connected 711582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and 712582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //introduce a broadcast that combines the supplicant and network 713582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //network state change events so the apps dont have to worry about 714582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //ignoring supplicant state change when network is connected 715582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //to get more fine grained information. 71609a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff SupplicantState state = (SupplicantState) intent.getParcelableExtra( 71709a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff WifiManager.EXTRA_NEW_STATE); 71809a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff if (!mConnected.get() && SupplicantState.isHandshakeState(state)) { 71909a9b38fbccd4c6e62f042d8bb326f9b6ef9a8f0Irfan Sheriff updateConnectionState(WifiInfo.getDetailedStateOf(state)); 720582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff } 72148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 72279470d1a66f479919c13e27546391439cafa0ee7Freeman Ng NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( 72379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng WifiManager.EXTRA_NETWORK_INFO); 724582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff mConnected.set(info.isConnected()); 725d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(info.isConnected()); 726317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff updateAccessPoints(); 72779470d1a66f479919c13e27546391439cafa0ee7Freeman Ng updateConnectionState(info.getDetailedState()); 7280575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn if (mAutoFinishOnConnection && info.isConnected()) { 7290575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn getActivity().finish(); 7300575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn return; 7310575736cdc13bd08e42a954c7699d3937679b561Andrew Flynn } 73248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) { 73348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(null); 73448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 73548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 73648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 737af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private void updateConnectionState(DetailedState state) { 7382215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff /* sticky broadcasts can call this when wifi is disabled */ 739e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff if (!mWifiManager.isWifiEnabled()) { 740e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff mScanner.pause(); 7412215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff return; 742e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff } 7432215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff 744af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh if (state == DetailedState.OBTAINING_IPADDR) { 74548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 74648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 74748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 74848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 74948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 75048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastInfo = mWifiManager.getConnectionInfo(); 75148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state != null) { 75248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastState = state; 75348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 75448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 755e78c1879058571c00879f0d3e756951302adf513Gilles Debunne for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) { 756d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // Maybe there's a WifiConfigPreference 757e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Preference preference = getPreferenceScreen().getPreference(i); 758d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (preference instanceof AccessPoint) { 75986eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa final AccessPoint accessPoint = (AccessPoint) preference; 76086eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa accessPoint.update(mLastInfo, mLastState); 761d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 762d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 76348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 76448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 76548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateWifiState(int state) { 766e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getActivity().invalidateOptionsMenu(); 767e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 768e78c1879058571c00879f0d3e756951302adf513Gilles Debunne switch (state) { 769e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLED: 770e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mScanner.resume(); 77118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne return; // not break, to avoid the call to pause() below 772e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 773e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLING: 774e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_starting); 775e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 776e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 777e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLED: 778e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_empty_list_wifi_off); 779e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 78048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 781e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 782c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne mLastInfo = null; 783c1eab91f073313d84e67b4626f008aa3520c9f3aGilles Debunne mLastState = null; 784e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mScanner.pause(); 78548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 78648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 78748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private class Scanner extends Handler { 78848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private int mRetry = 0; 78948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 79048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void resume() { 79148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!hasMessages(0)) { 79248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh sendEmptyMessage(0); 79348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 79448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 79548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 796c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff void forceScan() { 79722d441acdba0fb7b99f5958ddd0198f4c371b2a7Isaac Levy removeMessages(0); 798c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff sendEmptyMessage(0); 799c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff } 800c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff 80148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void pause() { 80248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 80348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh removeMessages(0); 80448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 80548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 80648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 80748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void handleMessage(Message message) { 80848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiManager.startScanActive()) { 80948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 81048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (++mRetry >= 3) { 81148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 8129c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Toast.makeText(getActivity(), R.string.wifi_fail_to_scan, 81348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Toast.LENGTH_LONG).show(); 814e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff return; 81548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 816fdac5bae251bd0b569c38aa8575b89ba0895911cIsaac Levy sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS); 81748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 81848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 819d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 82058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 82158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Renames/replaces "Next" button when appropriate. "Next" button usually exists in 82258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Wifi setup screens, not in usual wifi settings screen. 82358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * 82458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * @param connected true when the device is connected to a wifi network. 82558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 82658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private void changeNextButtonState(boolean connected) { 827fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner if (mEnableNextOnConnection && hasNextButton()) { 82858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa getNextButton().setEnabled(connected); 829d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 830d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 831d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 832d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa public void onClick(DialogInterface dialogInterface, int button) { 833fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { 834fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner forget(); 835fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } else if (button == WifiDialog.BUTTON_SUBMIT) { 836fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner submit(mDialog.getController()); 837d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 83858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 839d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 84058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void submit(WifiConfigController configController) { 841b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff 84290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff final WifiConfiguration config = configController.getConfig(); 84390380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff 84490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (config == null) { 84590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mSelectedAccessPoint != null 84690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff && !requireKeyStore(mSelectedAccessPoint.getConfig()) 84790380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 84890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mWifiManager.connect(mChannel, mSelectedAccessPoint.networkId, 84990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mConnectListener); 85090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 85190380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else if (config.networkId != INVALID_NETWORK_ID) { 85290380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (mSelectedAccessPoint != null) { 853fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner mWifiManager.save(mChannel, config, mSaveListener); 85490380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 85590380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else { 85690380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff if (configController.isEdit() || requireKeyStore(config)) { 857fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner mWifiManager.save(mChannel, config, mSaveListener); 85890380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } else { 85990380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff mWifiManager.connect(mChannel, config, mConnectListener); 86090380120e72a9bebd2fd198372c423afc9b0eeecIrfan Sheriff } 861d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 862d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 86358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 86458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 86586eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa } 86658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 867d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 868d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 869d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void forget() { 8703ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { 8713ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff // Should not happen, but a monkey seems to triger it 8723ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig()); 8733ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff return; 8743ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff } 8753ab5c6838f01cd6306c0ca2728f3c01e29a8318fIrfan Sheriff 8768f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff mWifiManager.forget(mChannel, mSelectedAccessPoint.networkId, mForgetListener); 877d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 87858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 87958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 88058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 88158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 882d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 88358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // We need to rename/replace "Next" button in wifi setup context. 884d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(false); 885d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 886d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 88758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 88858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Refreshes acccess points and ask Wifi module to scan networks again. 88958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 890d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void refreshAccessPoints() { 891d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 892d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mScanner.resume(); 893d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 894d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 895e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getPreferenceScreen().removeAll(); 896d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 897d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 89858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 89958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when "add network" button is pressed. 90058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 901d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void onAddNetworkPressed() { 90258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // No exact access point is selected. 903d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = null; 904fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner showDialog(null, true); 905d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 906b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa 907b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa /* package */ int getAccessPointsCount() { 908e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); 909e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (wifiIsEnabled) { 910e78c1879058571c00879f0d3e756951302adf513Gilles Debunne return getPreferenceScreen().getPreferenceCount(); 911b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } else { 912b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa return 0; 913b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 914b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 91555de702961642521e247f155963644df81756215Daisuke Miyakawa 91658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 91758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to pause wifi scan. May be ignored when the module is disabled. 91858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 91958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void pauseWifiScan() { 92058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 92158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.pause(); 92258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 92358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 92458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 92558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 92658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to resume wifi scan. May be ignored when the module is disabled. 92758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 92858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void resumeWifiScan() { 92958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 93058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 93158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 93255de702961642521e247f155963644df81756215Daisuke Miyakawa } 933b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 934b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 935b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 93644a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner if (mSetupWizardMode) { 93744a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner return 0; 938fc5dd2cbf0d614f661d513ba6e672b8731d8ea6bRussell Brenner } 93944a49ed67e96c739eabf09520ef432c7f421b486Russell Brenner return R.string.help_url_wifi; 940b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 941fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 942fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner /** 943fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner * Used as the outer frame of all setup wizard pages that need to adjust their margins based 944fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner * on the total size of the available display. (e.g. side margins set to 10% of total width.) 945fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner */ 946fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public static class ProportionalOuterFrame extends RelativeLayout { 947fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public ProportionalOuterFrame(Context context) { 948fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner super(context); 949fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 950fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public ProportionalOuterFrame(Context context, AttributeSet attrs) { 951fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner super(context, attrs); 952fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 953fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner public ProportionalOuterFrame(Context context, AttributeSet attrs, int defStyle) { 954fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner super(context, attrs, defStyle); 955fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 956fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 957fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner /** 958fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner * Set our margins and title area height proportionally to the available display size 959fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner */ 960fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner @Override 961fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 962fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 963fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 964fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner final Resources resources = getContext().getResources(); 965fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner float titleHeight = resources.getFraction(R.dimen.setup_title_height, 1, 1); 966fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner float sideMargin = resources.getFraction(R.dimen.setup_border_width, 1, 1); 967fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner int bottom = resources.getDimensionPixelSize(R.dimen.setup_margin_bottom); 968fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner setPadding( 969fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner (int) (parentWidth * sideMargin), 970fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 0, 971fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner (int) (parentWidth * sideMargin), 972fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner bottom); 973fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner View title = findViewById(R.id.title_area); 974fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner if (title != null) { 975fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner title.setMinimumHeight((int) (parentHeight * titleHeight)); 976fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 977fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner super.onMeasure(widthMeasureSpec, heightMeasureSpec); 978fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 979fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner } 980fc86669031e9c11efa688cbf95e53c77dbc0a03dRussell Brenner 98148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh} 982