WifiSettings.java revision 18e9992a5e5f515566aa9ea861b2e1a3c2450ebc
148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh/* 248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Copyright (C) 2010 The Android Open Source Project 348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * 448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * you may not use this file except in compliance with the License. 648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * You may obtain a copy of the License at 748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * 848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * http://www.apache.org/licenses/LICENSE-2.0 948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * 1048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software 1148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS, 1248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * See the License for the specific language governing permissions and 1448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * limitations under the License. 1548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh */ 1648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 1748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehpackage com.android.settings.wifi; 1848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 195d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawaimport static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; 205d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa 21e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.app.ActionBar; 229c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.app.Activity; 23e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriffimport android.app.AlertDialog; 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; 2979470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager; 3048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo; 31af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState; 3248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult; 3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState; 3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration; 35e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.net.wifi.WifiConfiguration.KeyMgmt; 3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo; 3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager; 38dee5b268925641c2e8f6280ce817fafa7e76d953Irfan Sheriffimport android.net.wifi.WpsResult; 3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle; 4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler; 4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message; 4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference; 439e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.preference.PreferenceActivity; 4448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen; 4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials; 4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore; 47590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log; 4848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu; 49e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo; 50e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.Gravity; 510688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawaimport android.view.LayoutInflater; 5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu; 539c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater; 5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem; 5548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View; 560688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawaimport android.view.ViewGroup; 579e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo; 58e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch; 5918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView; 60e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast; 6148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 62590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.internal.util.AsyncChannel; 63590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R; 64590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment; 65590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 6652727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList; 67d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection; 6848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List; 69582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean; 7048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 71d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/** 72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * This currently provides three types of UI. 73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 74d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Two are for phones with relatively small screens: "for SetupWizard" and "for usual Settings". 75d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Users just need to launch WifiSettings Activity as usual. The request will be appropriately 76d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * handled by ActivityManager, and they will have appropriate look-and-feel with this fragment. 77d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 78d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Third type is for Setup Wizard with X-Large, landscape UI. Users need to launch 79d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * {@link WifiSettingsForSetupWizardXL} Activity, which contains this fragment but also has 80d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * other decorations specific to that screen. 81d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 829c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment 83e78c1879058571c00879f0d3e756951302adf513Gilles Debunne implements DialogInterface.OnClickListener { 84590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff private static final String TAG = "WifiSettings"; 8548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_SCAN = Menu.FIRST; 86e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 1; 87e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private static final int MENU_ID_ADVANCED = Menu.FIRST + 2; 88e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private static final int MENU_ID_CONNECT = Menu.FIRST + 3; 89e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private static final int MENU_ID_FORGET = Menu.FIRST + 4; 90e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private static final int MENU_ID_MODIFY = Menu.FIRST + 5; 9148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 9248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final IntentFilter mFilter; 9348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final BroadcastReceiver mReceiver; 9448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final Scanner mScanner; 9548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 9648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiManager mWifiManager; 9748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiEnabler mWifiEnabler; 98d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // An access point being editted is stored here. 99d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private AccessPoint mSelectedAccessPoint; 10048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 101af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private DetailedState mLastState; 10248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiInfo mLastInfo; 10348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 104582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff private AtomicBoolean mConnected = new AtomicBoolean(false); 105582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff 106b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff private int mKeyStoreNetworkId = INVALID_NETWORK_ID; 10748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 10858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private WifiDialog mDialog; 109d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 11018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne private View mView; 11118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne private TextView mEmptyView; 11218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 11358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* Used in Wifi Setup context */ 114d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 11558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // this boolean extra specifies whether to disable the Next button when not connected 11658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect"; 117d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 11858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // should Next button only be enabled when we have a connection? 11958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private boolean mEnableNextOnConnection; 12058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private boolean mInXlSetupWizard; 12186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 12258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* End of "used in Wifi Setup context" */ 12379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 124065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh public WifiSettings() { 12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter = new IntentFilter(); 12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 12748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION); 12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 130afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); 131afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); 13248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 13348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); 1346377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff mFilter.addAction(WifiManager.ERROR_ACTION); 13548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 13648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mReceiver = new BroadcastReceiver() { 13748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 13848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onReceive(Context context, Intent intent) { 1396377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff handleEvent(context, intent); 14048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 14148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh }; 14248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 14348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner = new Scanner(); 14448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 14548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 14648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 1470688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa public void onAttach(Activity activity) { 1480688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa super.onAttach(activity); 1490688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa 1500688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa mInXlSetupWizard = (activity instanceof WifiSettingsForSetupWizardXL); 1510688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa } 1520688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa 1530688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa @Override 1540688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa public View onCreateView(LayoutInflater inflater, ViewGroup container, 1550688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa Bundle savedInstanceState) { 15618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne mView = inflater.inflate(R.layout.custom_preference_list_fragment, container, false); 15718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne return mView; 1580688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa } 1590688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa 1600688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa @Override 1619c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onActivityCreated(Bundle savedInstanceState) { 1629c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // We don't call super.onActivityCreated() here, since it assumes we already set up 1639c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // Preference (probably in onCreate()), while WifiSettings exceptionally set it up in 1649c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // this method. 16548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 16648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 167590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff mWifiManager.asyncConnect(getActivity(), new WifiServiceHandler()); 16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 1699c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Activity activity = getActivity(); 1709c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Intent intent = activity.getIntent(); 1719c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa 17279470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // if we're supposed to enable/disable the Next button based on our current connection 17379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // state, start it off in the right state 1749c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false); 175d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 176e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mEnableNextOnConnection) { 177e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (hasNextButton()) { 178e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final ConnectivityManager connectivity = (ConnectivityManager) 179e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 180e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (connectivity != null) { 181e78c1879058571c00879f0d3e756951302adf513Gilles Debunne NetworkInfo info = connectivity.getNetworkInfo( 182e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ConnectivityManager.TYPE_WIFI); 183e78c1879058571c00879f0d3e756951302adf513Gilles Debunne changeNextButtonState(info.isConnected()); 184d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 18579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng } 186e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 18779470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 188e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mInXlSetupWizard) { 189e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addPreferencesFromResource(R.xml.wifi_access_points_for_wifi_setup_xl); 190e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } else { 191e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addPreferencesFromResource(R.xml.wifi_settings); 192e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 193e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Switch actionBarSwitch = new Switch(activity); 194e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 195e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (activity instanceof PreferenceActivity) { 196e78c1879058571c00879f0d3e756951302adf513Gilles Debunne PreferenceActivity preferenceActivity = (PreferenceActivity) activity; 197e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { 198e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final int padding = activity.getResources().getDimensionPixelSize( 199e78c1879058571c00879f0d3e756951302adf513Gilles Debunne R.dimen.action_bar_switch_padding); 200e78c1879058571c00879f0d3e756951302adf513Gilles Debunne actionBarSwitch.setPadding(0, 0, padding, 0); 201e78c1879058571c00879f0d3e756951302adf513Gilles Debunne activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, 202e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.DISPLAY_SHOW_CUSTOM); 203e78c1879058571c00879f0d3e756951302adf513Gilles Debunne activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams( 204e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.LayoutParams.WRAP_CONTENT, 205e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ActionBar.LayoutParams.WRAP_CONTENT, 206e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Gravity.CENTER_VERTICAL | Gravity.RIGHT)); 2070f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani } 208a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa } 2097bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff 210e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mWifiEnabler = new WifiEnabler(activity, actionBarSwitch); 21148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 21248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 21318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne mEmptyView = (TextView) mView.findViewById(R.id.empty); 21418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getListView().setEmptyView(mEmptyView); 21518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 216e78c1879058571c00879f0d3e756951302adf513Gilles Debunne registerForContextMenu(getListView()); 217e78c1879058571c00879f0d3e756951302adf513Gilles Debunne setHasOptionsMenu(true); 218e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 2199c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // After confirming PreferenceScreen is available, we call super. 2209c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onActivityCreated(savedInstanceState); 22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 22248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 22348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 2249c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onResume() { 22548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onResume(); 22648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 22748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.resume(); 22848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 229590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 2309c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().registerReceiver(mReceiver, mFilter); 231b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mKeyStoreNetworkId != INVALID_NETWORK_ID && 232d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) { 233d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff mWifiManager.connectNetwork(mKeyStoreNetworkId); 23448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 235b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mKeyStoreNetworkId = INVALID_NETWORK_ID; 236e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 23758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 23848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 23948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 24048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 2419c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onPause() { 24248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onPause(); 24348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 24448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.pause(); 24548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 2469c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().unregisterReceiver(mReceiver); 24748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 24848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 24948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.dismiss(); 25048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog = null; 25148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 25248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 25348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 25448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 2559c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 256d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // We don't want menus in Setup Wizard XL. 257d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (!mInXlSetupWizard) { 258e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); 259d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan) 260dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne //.setIcon(R.drawable.ic_menu_scan_network) 261dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setEnabled(wifiIsEnabled) 262dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 263e78c1879058571c00879f0d3e756951302adf513Gilles Debunne menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network) 264dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne //.setIcon(android.R.drawable.ic_menu_add) 265dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setEnabled(wifiIsEnabled) 266dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 267d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced) 268dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne //.setIcon(android.R.drawable.ic_menu_manage) 269dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 270d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 2719c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onCreateOptionsMenu(menu, inflater); 27248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 27348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 27448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 27548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onOptionsItemSelected(MenuItem item) { 27648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 27748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_SCAN: 2782215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff if (mWifiManager.isWifiEnabled()) { 279c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff mScanner.forceScan(); 2802215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff } 28148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 282e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case MENU_ID_ADD_NETWORK: 283e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mWifiManager.isWifiEnabled()) { 284e78c1879058571c00879f0d3e756951302adf513Gilles Debunne onAddNetworkPressed(); 285e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 286e78c1879058571c00879f0d3e756951302adf513Gilles Debunne return true; 28748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_ADVANCED: 2889eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani if (getActivity() instanceof PreferenceActivity) { 2899eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani ((PreferenceActivity) getActivity()).startPreferencePanel( 290dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne AdvancedWifiSettings.class.getCanonicalName(), 2919eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani null, 2929eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani R.string.wifi_advanced_titlebar, null, 2939eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani this, 0); 2949eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani } else { 295dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null); 2969eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani } 29748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 29848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 29948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onOptionsItemSelected(item); 30048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 30148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 30248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 30348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) { 304267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa if (mInXlSetupWizard) { 305267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onCreateContextMenu(menu, view, info); 306267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa } else if (info instanceof AdapterContextMenuInfo) { 30748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Preference preference = (Preference) getListView().getItemAtPosition( 30848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh ((AdapterContextMenuInfo) info).position); 30948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 31048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 311d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 312d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.setHeaderTitle(mSelectedAccessPoint.ssid); 313d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint.getLevel() != -1 314d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa && mSelectedAccessPoint.getState() == null) { 31548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); 31648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 317b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 31848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget); 319f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify); 32048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 32148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 32248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 32348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 32448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 32548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 32648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onContextItemSelected(MenuItem item) { 327d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint == null) { 32848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 32948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 33048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 331d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_CONNECT: { 332b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 333d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (!requireKeyStore(mSelectedAccessPoint.getConfig())) { 334d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mWifiManager.connectNetwork(mSelectedAccessPoint.networkId); 33548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 336d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) { 33748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Shortcut for open networks. 33848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiConfiguration config = new WifiConfiguration(); 339d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa config.SSID = AccessPoint.convertToQuotedString(mSelectedAccessPoint.ssid); 34048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.allowedKeyManagement.set(KeyMgmt.NONE); 341d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff mWifiManager.connectNetwork(config); 34248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 343d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(mSelectedAccessPoint, true); 34448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 34548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 346d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 347d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_FORGET: { 348d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId); 34948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 350d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 351d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_MODIFY: { 352d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(mSelectedAccessPoint, true); 35348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 354d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 35548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 35648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 35748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 35848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 35948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 36048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 362d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 363d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(mSelectedAccessPoint, false); 36448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 36548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onPreferenceTreeClick(screen, preference); 36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 36748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 36848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 36948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 370d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /** 37158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Shows an appropriate Wifi configuration component. 37258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when a user clicks "Add network" preference or one of available networks is selected. 373d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 374d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private void showConfigUi(AccessPoint accessPoint, boolean edit) { 375d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mInXlSetupWizard) { 37658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).showConfigUi(accessPoint, edit); 377d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else { 378d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showDialog(accessPoint, edit); 379d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 380d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 381d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 38248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void showDialog(AccessPoint accessPoint, boolean edit) { 38348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 38448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.dismiss(); 38548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 3869c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa mDialog = new WifiDialog(getActivity(), this, accessPoint, edit); 38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.show(); 38848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 38948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 39048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private boolean requireKeyStore(WifiConfiguration config) { 391d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (WifiConfigController.requireKeyStore(config) && 392d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.getInstance().state() != KeyStore.State.UNLOCKED) { 39348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mKeyStoreNetworkId = config.networkId; 3949c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Credentials.getInstance().unlock(getActivity()); 39548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return false; 39848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 400d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /** 401d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Shows the latest access points available with supplimental information like 402d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * the strength of network and the security for it. 403d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 40448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateAccessPoints() { 405e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final int wifiState = mWifiManager.getWifiState(); 406e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 407e78c1879058571c00879f0d3e756951302adf513Gilles Debunne switch (wifiState) { 408e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLED: 40918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 410e78c1879058571c00879f0d3e756951302adf513Gilles Debunne // AccessPoints are automatically sorted with TreeSet. 411e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final Collection<AccessPoint> accessPoints = constructAccessPoints(); 412e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (mInXlSetupWizard) { 413e78c1879058571c00879f0d3e756951302adf513Gilles Debunne ((WifiSettingsForSetupWizardXL)getActivity()).onAccessPointsUpdated( 414e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getPreferenceScreen(), accessPoints); 415e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } else { 416e78c1879058571c00879f0d3e756951302adf513Gilles Debunne for (AccessPoint accessPoint : accessPoints) { 417e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getPreferenceScreen().addPreference(accessPoint); 418e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 419e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 420e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 42186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 42218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne case WifiManager.WIFI_STATE_ENABLING: 42318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 42418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne break; 42518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne 426e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLING: 427e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_stopping); 428e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 429e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 430e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLED: 431e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_empty_list_wifi_off); 432e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 433d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 434d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 43548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 436e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private void addMessagePreference(int messageId) { 43718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne if (mEmptyView != null) mEmptyView.setText(messageId); 43818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne getPreferenceScreen().removeAll(); 439e78c1879058571c00879f0d3e756951302adf513Gilles Debunne } 440e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 441d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private Collection<AccessPoint> constructAccessPoints() { 44252727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriff Collection<AccessPoint> accessPoints = new ArrayList<AccessPoint>(); 443d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 444d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); 44548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (configs != null) { 44648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (WifiConfiguration config : configs) { 4479c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa AccessPoint accessPoint = new AccessPoint(getActivity(), config); 44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoint.update(mLastInfo, mLastState); 44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoints.add(accessPoint); 45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 45148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 45248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 453d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<ScanResult> results = mWifiManager.getScanResults(); 45448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (results != null) { 45548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (ScanResult result : results) { 45648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Ignore hidden and ad-hoc networks. 45748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (result.SSID == null || result.SSID.length() == 0 || 45848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh result.capabilities.contains("[IBSS]")) { 45948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh continue; 46048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 46148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 46248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh boolean found = false; 46348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (AccessPoint accessPoint : accessPoints) { 46448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (accessPoint.update(result)) { 46548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh found = true; 46648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 46748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 46848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!found) { 4699c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa accessPoints.add(new AccessPoint(getActivity(), result)); 47048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 474d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa return accessPoints; 47548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 4776377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff private void handleEvent(Context context, Intent intent) { 47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh String action = intent.getAction(); 47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { 48048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiManager.WIFI_STATE_UNKNOWN)); 482d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) || 483afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) || 484afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) { 485d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa updateAccessPoints(); 48648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 487582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //Ignore supplicant state changes when network is connected 488582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and 489582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //introduce a broadcast that combines the supplicant and network 490582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //network state change events so the apps dont have to worry about 491582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //ignoring supplicant state change when network is connected 492582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff //to get more fine grained information. 493582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff if (!mConnected.get()) { 494582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState) 495582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE))); 496582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff } 497cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 498cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa if (mInXlSetupWizard) { 499cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onSupplicantStateChanged(intent); 500cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 50148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 50279470d1a66f479919c13e27546391439cafa0ee7Freeman Ng NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( 50379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng WifiManager.EXTRA_NETWORK_INFO); 504582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff mConnected.set(info.isConnected()); 505d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(info.isConnected()); 506317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff updateAccessPoints(); 50779470d1a66f479919c13e27546391439cafa0ee7Freeman Ng updateConnectionState(info.getDetailedState()); 50848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) { 50948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(null); 5106377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff } else if (WifiManager.ERROR_ACTION.equals(action)) { 5116377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff int errorCode = intent.getIntExtra(WifiManager.EXTRA_ERROR_CODE, 0); 5126377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff switch (errorCode) { 5136377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff case WifiManager.WPS_OVERLAP_ERROR: 5146377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff Toast.makeText(context, R.string.wifi_wps_overlap_error, 5156377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff Toast.LENGTH_SHORT).show(); 5166377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff break; 5176377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff } 51848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 51948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 52048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 521af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private void updateConnectionState(DetailedState state) { 5222215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff /* sticky broadcasts can call this when wifi is disabled */ 523e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff if (!mWifiManager.isWifiEnabled()) { 524e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff mScanner.pause(); 5252215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff return; 526e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff } 5272215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff 528af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh if (state == DetailedState.OBTAINING_IPADDR) { 52948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 53048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 53148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 53248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 53348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 53448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastInfo = mWifiManager.getConnectionInfo(); 53548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state != null) { 53648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastState = state; 53748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 53848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 539e78c1879058571c00879f0d3e756951302adf513Gilles Debunne for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) { 540d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // Maybe there's a WifiConfigPreference 541e78c1879058571c00879f0d3e756951302adf513Gilles Debunne Preference preference = getPreferenceScreen().getPreference(i); 542d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (preference instanceof AccessPoint) { 54386eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa final AccessPoint accessPoint = (AccessPoint) preference; 54486eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa accessPoint.update(mLastInfo, mLastState); 545d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 546d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 547d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 54858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mInXlSetupWizard) { 54958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).updateConnectionState(mLastState); 55048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 55148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 55248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 55348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateWifiState(int state) { 554e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getActivity().invalidateOptionsMenu(); 555e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 556e78c1879058571c00879f0d3e756951302adf513Gilles Debunne switch (state) { 557e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLED: 558e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mScanner.resume(); 55918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne return; // not break, to avoid the call to pause() below 560e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 561e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_ENABLING: 562e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_starting); 563e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 564e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 565e78c1879058571c00879f0d3e756951302adf513Gilles Debunne case WifiManager.WIFI_STATE_DISABLED: 566e78c1879058571c00879f0d3e756951302adf513Gilles Debunne addMessagePreference(R.string.wifi_empty_list_wifi_off); 567e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 56848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 569e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 570e78c1879058571c00879f0d3e756951302adf513Gilles Debunne mScanner.pause(); 57148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 57248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 57348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private class Scanner extends Handler { 57448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private int mRetry = 0; 57548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 57648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void resume() { 57748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!hasMessages(0)) { 57848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh sendEmptyMessage(0); 57948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 58048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 58148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 582c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff void forceScan() { 583c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff sendEmptyMessage(0); 584c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff } 585c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff 58648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void pause() { 58748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 58848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh removeMessages(0); 58948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 59048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 59148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 59248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void handleMessage(Message message) { 59348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiManager.startScanActive()) { 59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 59548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (++mRetry >= 3) { 59648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 5979c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Toast.makeText(getActivity(), R.string.wifi_fail_to_scan, 59848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Toast.LENGTH_LONG).show(); 599e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff return; 60048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 6017add00049ac150c4b8c0e473a9baca70cf5e8aa8Irfan Sheriff // Combo scans can take 5-6s to complete. Increase interval to 10s. 6027add00049ac150c4b8c0e473a9baca70cf5e8aa8Irfan Sheriff sendEmptyMessageDelayed(0, 10000); 60348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 60448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 605d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 606590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff private class WifiServiceHandler extends Handler { 607590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 608590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff @Override 609590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff public void handleMessage(Message msg) { 610590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff switch (msg.what) { 611590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 612590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 613590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff //AsyncChannel in msg.obj 614590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff } else { 615590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff //AsyncChannel set up failure, ignore 616590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff Log.e(TAG, "Failed to establish AsyncChannel connection"); 617590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff } 618590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff break; 619590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff case WifiManager.CMD_WPS_COMPLETED: 620590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff WpsResult result = (WpsResult) msg.obj; 621590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff if (result == null) break; 622590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()) 623590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff .setTitle(R.string.wifi_wps_setup_title) 624590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff .setPositiveButton(android.R.string.ok, null); 625590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff switch (result.status) { 626590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff case FAILURE: 627590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff dialog.setMessage(R.string.wifi_wps_failed); 628590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff dialog.show(); 629590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff break; 630590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff case IN_PROGRESS: 631590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff dialog.setMessage(R.string.wifi_wps_in_progress); 632590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff dialog.show(); 633590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff break; 634590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff default: 635590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff if (result.pin != null) { 636590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff dialog.setMessage(getResources().getString( 637590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff R.string.wifi_wps_pin_output, result.pin)); 638590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff dialog.show(); 639590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff } 640590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff break; 641590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff } 642e78c1879058571c00879f0d3e756951302adf513Gilles Debunne break; 643590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff //TODO: more connectivity feedback 644590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff default: 645590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff //Ignore 646590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff break; 647590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff } 648590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff } 649590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff } 650590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 65158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 65258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Renames/replaces "Next" button when appropriate. "Next" button usually exists in 65358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Wifi setup screens, not in usual wifi settings screen. 65458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * 65558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * @param connected true when the device is connected to a wifi network. 65658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 65758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private void changeNextButtonState(boolean connected) { 658d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mInXlSetupWizard) { 65958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).changeNextButtonState(connected); 660d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (mEnableNextOnConnection && hasNextButton()) { 66158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa getNextButton().setEnabled(connected); 662d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 663d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 664d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 665d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa public void onClick(DialogInterface dialogInterface, int button) { 66658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mInXlSetupWizard) { 66758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { 66814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa forget(); 66958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (button == WifiDialog.BUTTON_SUBMIT) { 67058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onConnectButtonPressed(); 67158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 67258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else { 67358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { 67458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa forget(); 67558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (button == WifiDialog.BUTTON_SUBMIT) { 67658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa submit(mDialog.getController()); 6778b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa } 678d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 679d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 68058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 681d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 68258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void submit(WifiConfigController configController) { 683dee5b268925641c2e8f6280ce817fafa7e76d953Irfan Sheriff int networkSetup = configController.chosenNetworkSetupMethod(); 684dee5b268925641c2e8f6280ce817fafa7e76d953Irfan Sheriff switch(networkSetup) { 685b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff case WifiConfigController.WPS_PBC: 686e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff case WifiConfigController.WPS_PIN_FROM_ACCESS_POINT: 687e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff case WifiConfigController.WPS_PIN_FROM_DEVICE: 688590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff mWifiManager.startWps(configController.getWpsConfig()); 689b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff break; 690b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff case WifiConfigController.MANUAL: 691b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff final WifiConfiguration config = configController.getConfig(); 692b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff 693b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (config == null) { 694b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint != null 6955d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa && !requireKeyStore(mSelectedAccessPoint.getConfig()) 6965d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 697b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mWifiManager.connectNetwork(mSelectedAccessPoint.networkId); 698b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } 699b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } else if (config.networkId != INVALID_NETWORK_ID) { 700b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint != null) { 701cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa saveNetwork(config); 702b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } 703b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } else { 70458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (configController.isEdit() || requireKeyStore(config)) { 705cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa saveNetwork(config); 706b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } else { 707b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mWifiManager.connectNetwork(config); 708b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } 709b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } 710b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff break; 711d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 712d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 71358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 71458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 71586eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa } 71658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 717d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 718d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 719cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa private void saveNetwork(WifiConfiguration config) { 720cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa if (mInXlSetupWizard) { 721cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onSaveNetwork(config); 722cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } else { 723cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa mWifiManager.saveNetwork(config); 724cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 725cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 726cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 727d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void forget() { 728d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId); 729d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 73058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 73158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 73258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 73358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 734d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 73558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // We need to rename/replace "Next" button in wifi setup context. 736d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(false); 737d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 738d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 73958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 74058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Refreshes acccess points and ask Wifi module to scan networks again. 74158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 742d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void refreshAccessPoints() { 743d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 744d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mScanner.resume(); 745d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 746d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 747e78c1879058571c00879f0d3e756951302adf513Gilles Debunne getPreferenceScreen().removeAll(); 748d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 749d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 75058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 75158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when "add network" button is pressed. 75258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 753d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void onAddNetworkPressed() { 75458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // No exact access point is selected. 755d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = null; 756d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(null, true); 757d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 758b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa 759b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa /* package */ int getAccessPointsCount() { 760e78c1879058571c00879f0d3e756951302adf513Gilles Debunne final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); 761e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (wifiIsEnabled) { 762e78c1879058571c00879f0d3e756951302adf513Gilles Debunne return getPreferenceScreen().getPreferenceCount(); 763b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } else { 764b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa return 0; 765b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 766b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 76755de702961642521e247f155963644df81756215Daisuke Miyakawa 76858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 76958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to pause wifi scan. May be ignored when the module is disabled. 77058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 77158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void pauseWifiScan() { 77258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 77358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.pause(); 77458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 77558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 77658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 77758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 77858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to resume wifi scan. May be ignored when the module is disabled. 77958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 78058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void resumeWifiScan() { 78158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 78258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 78358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 78455de702961642521e247f155963644df81756215Daisuke Miyakawa } 78548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh} 786