WifiSettings.java revision 58b0291fe6e6e47bf3d7457d8cf2648b8ce4a1ae
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 215cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawaimport com.android.settings.ProgressCategoryBase; 225cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawaimport com.android.settings.R; 235cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawaimport com.android.settings.SettingsPreferenceFragment; 245cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawa 259c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.app.Activity; 26e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriffimport android.app.AlertDialog; 2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver; 2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context; 2948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface; 3048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent; 3148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter; 3279470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager; 3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo; 34af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState; 3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult; 3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState; 3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration; 3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration.KeyMgmt; 3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo; 4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager; 4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle; 4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler; 4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message; 4448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.CheckBoxPreference; 4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference; 4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen; 4748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.provider.Settings.Secure; 4848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials; 4948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore; 5048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu; 5148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu.ContextMenuInfo; 5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu; 539c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater; 5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem; 5548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View; 5648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.widget.AdapterView.AdapterContextMenuInfo; 5748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.widget.Toast; 5848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 59d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection; 6048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List; 61d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.TreeSet; 6248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 63d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/** 64d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * This currently provides three types of UI. 65d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 66d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Two are for phones with relatively small screens: "for SetupWizard" and "for usual Settings". 67d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Users just need to launch WifiSettings Activity as usual. The request will be appropriately 68d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * handled by ActivityManager, and they will have appropriate look-and-feel with this fragment. 69d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 70d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Third type is for Setup Wizard with X-Large, landscape UI. Users need to launch 71d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * {@link WifiSettingsForSetupWizardXL} Activity, which contains this fragment but also has 72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * other decorations specific to that screen. 73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 749c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment 759c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa implements DialogInterface.OnClickListener { 7648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_SCAN = Menu.FIRST; 7748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_ADVANCED = Menu.FIRST + 1; 7848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_CONNECT = Menu.FIRST + 2; 7948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_FORGET = Menu.FIRST + 3; 8048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_MODIFY = Menu.FIRST + 4; 8148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 8248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final IntentFilter mFilter; 8348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final BroadcastReceiver mReceiver; 8448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final Scanner mScanner; 8548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 8648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiManager mWifiManager; 8748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiEnabler mWifiEnabler; 8848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private CheckBoxPreference mNotifyOpenNetworks; 89d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private ProgressCategoryBase mAccessPoints; 9048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private Preference mAddNetwork; 91d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // An access point being editted is stored here. 92d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private AccessPoint mSelectedAccessPoint; 931dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa private boolean mEdit; 9448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 95af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private DetailedState mLastState; 9648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiInfo mLastInfo; 9748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 98b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff private int mKeyStoreNetworkId = INVALID_NETWORK_ID; 9948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 10058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private WifiDialog mDialog; 101d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 10258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* Used in Wifi Setup context */ 103d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 10458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // this boolean extra specifies whether to disable the Next button when not connected 10558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect"; 106d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 10758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // Indicates that this fragment is used as a part of Setup Wizard with XL screen settings. 10858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // This fragment should show information which has been shown as Dialog in combined UI 10958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // inside this fragment. 11058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ static final String IN_XL_SETUP_WIZARD = "in_setup_wizard"; 11158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 11258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // should Next button only be enabled when we have a connection? 11358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private boolean mEnableNextOnConnection; 11458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private boolean mInXlSetupWizard; 11586eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 11658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* End of "used in Wifi Setup context" */ 11779470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 118065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh public WifiSettings() { 11948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter = new IntentFilter(); 12048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 12148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 12248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION); 12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 124d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff mFilter.addAction(WifiManager.SUPPLICANT_CONFIG_CHANGED_ACTION); 12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); 12748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mReceiver = new BroadcastReceiver() { 12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 13048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onReceive(Context context, Intent intent) { 13148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh handleEvent(intent); 13248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 13348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh }; 13448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 13548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner = new Scanner(); 13648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 13748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 13848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 1399c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onActivityCreated(Bundle savedInstanceState) { 1409c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // We don't call super.onActivityCreated() here, since it assumes we already set up 1419c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // Preference (probably in onCreate()), while WifiSettings exceptionally set it up in 1429c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // this method. 14348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 14448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 14548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 1469c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Activity activity = getActivity(); 1479c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa final Intent intent = activity.getIntent(); 1489c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa 149d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 15079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // if we're supposed to enable/disable the Next button based on our current connection 15179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng // state, start it off in the right state 1529c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false); 15358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mInXlSetupWizard = intent.getBooleanExtra(IN_XL_SETUP_WIZARD, false); 154d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 155d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mEnableNextOnConnection) { 156d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mEnableNextOnConnection && hasNextButton()) { 157d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final ConnectivityManager connectivity = (ConnectivityManager) 158d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 159d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (connectivity != null) { 160d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa NetworkInfo info = connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 161d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(info.isConnected()); 162d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 16379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng } 16479470d1a66f479919c13e27546391439cafa0ee7Freeman Ng } 16579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng 166d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mInXlSetupWizard) { 167d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa addPreferencesFromResource(R.xml.wifi_access_points_for_wifi_setup_xl); 168d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (intent.getBooleanExtra("only_access_points", false)) { 169065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh addPreferencesFromResource(R.xml.wifi_access_points); 17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 171065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh addPreferencesFromResource(R.xml.wifi_settings); 1729c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa mWifiEnabler = new WifiEnabler(activity, 17348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh (CheckBoxPreference) findPreference("enable_wifi")); 17448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mNotifyOpenNetworks = 17548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh (CheckBoxPreference) findPreference("notify_open_networks"); 17648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mNotifyOpenNetworks.setChecked(Secure.getInt(getContentResolver(), 17748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1); 17848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 17948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 1809c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa // After confirming PreferenceScreen is available, we call super. 1819c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onActivityCreated(savedInstanceState); 1829c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa 183d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // This may be either ProgressCategory or AccessPointCategoryForXL. 184d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final ProgressCategoryBase preference = 185d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa (ProgressCategoryBase) findPreference("access_points"); 186d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mAccessPoints = preference; 187d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mAccessPoints.setOrderingAsAdded(true); 18848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAddNetwork = findPreference("add_network"); 18948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 19048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh registerForContextMenu(getListView()); 1919c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa setHasOptionsMenu(true); 19248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 19348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 19448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 1959c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onResume() { 19648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onResume(); 19748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 19848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.resume(); 19948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 2009c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().registerReceiver(mReceiver, mFilter); 201b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mKeyStoreNetworkId != INVALID_NETWORK_ID && 202b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff KeyStore.getInstance().test() == KeyStore.NO_ERROR) { 203d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff mWifiManager.connectNetwork(mKeyStoreNetworkId); 20448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 205b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mKeyStoreNetworkId = INVALID_NETWORK_ID; 20658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 20748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 20848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 20948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 2109c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onPause() { 21148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onPause(); 21248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 21348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.pause(); 21448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 2159c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa getActivity().unregisterReceiver(mReceiver); 21648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 21748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 21848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.dismiss(); 21948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog = null; 22048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 22248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 22348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 2249c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 225d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // We don't want menus in Setup Wizard XL. 226d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (!mInXlSetupWizard) { 227d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan) 228d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa .setIcon(R.drawable.ic_menu_scan_network); 229d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced) 230d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa .setIcon(android.R.drawable.ic_menu_manage); 231d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 2329c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa super.onCreateOptionsMenu(menu, inflater); 23348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 23448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 23548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 23648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onOptionsItemSelected(MenuItem item) { 23748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 23848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_SCAN: 2392215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff if (mWifiManager.isWifiEnabled()) { 2402215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff mScanner.resume(); 2412215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff } 24248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 24348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_ADVANCED: 2447e7ae9e59d1d3b7f1346955ccb58f39f3ee769dbDaisuke Miyakawa startFragment(this, AdvancedSettings.class.getCanonicalName(), -1, null); 24548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 24648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 24748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onOptionsItemSelected(item); 24848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 24948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 25048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 25148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) { 25248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (info instanceof AdapterContextMenuInfo) { 25348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Preference preference = (Preference) getListView().getItemAtPosition( 25448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh ((AdapterContextMenuInfo) info).position); 25548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 25648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 257d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 258d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa menu.setHeaderTitle(mSelectedAccessPoint.ssid); 259d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint.getLevel() != -1 260d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa && mSelectedAccessPoint.getState() == null) { 26148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); 26248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 263b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 26448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget); 265f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify); 26648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 26748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 26848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 26948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 27048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 27148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 27248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onContextItemSelected(MenuItem item) { 273d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mSelectedAccessPoint == null) { 27448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 27548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 27648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 277d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_CONNECT: { 278b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 279d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (!requireKeyStore(mSelectedAccessPoint.getConfig())) { 280d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mWifiManager.connectNetwork(mSelectedAccessPoint.networkId); 28148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 282d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) { 28348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Shortcut for open networks. 28448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiConfiguration config = new WifiConfiguration(); 285d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa config.SSID = AccessPoint.convertToQuotedString(mSelectedAccessPoint.ssid); 28648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.allowedKeyManagement.set(KeyMgmt.NONE); 287d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff mWifiManager.connectNetwork(config); 28848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 289d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(mSelectedAccessPoint, true); 29048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 29148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 292d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 293d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_FORGET: { 294d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId); 29548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 296d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 297d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case MENU_ID_MODIFY: { 298d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(mSelectedAccessPoint, true); 29948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 300d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 30148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 30248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 30348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 30448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 30548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 30648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 30748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 308d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = (AccessPoint) preference; 309d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(mSelectedAccessPoint, false); 31048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (preference == mAddNetwork) { 311d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa onAddNetworkPressed(); 31248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (preference == mNotifyOpenNetworks) { 31348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Secure.putInt(getContentResolver(), 31448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 31548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mNotifyOpenNetworks.isChecked() ? 1 : 0); 31648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 31748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onPreferenceTreeClick(screen, preference); 31848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 31948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 32048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 32148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 322d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /** 32358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Shows an appropriate Wifi configuration component. 32458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when a user clicks "Add network" preference or one of available networks is selected. 325d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 326d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private void showConfigUi(AccessPoint accessPoint, boolean edit) { 3271dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa mEdit = edit; 328d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mInXlSetupWizard) { 32958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).showConfigUi(accessPoint, edit); 330d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else { 331d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showDialog(accessPoint, edit); 332d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 333d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 334d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 33548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void showDialog(AccessPoint accessPoint, boolean edit) { 33648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 33748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.dismiss(); 33848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 3399c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa mDialog = new WifiDialog(getActivity(), this, accessPoint, edit); 34048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.show(); 34148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 34248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 34358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 34458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called from {@link WifiSettingsForSetupWizardXL} when the object wants to open 34558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * {@link WifiDialog} anyway, though usually it prepares its own simplified UI for 34658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * configuring a wifi network. 34758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 3481dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa /* package */ void showDialogForSelectedPreference() { 3491dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa showDialog(mSelectedAccessPoint, mEdit); 3501dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa } 3511dc3715e3ac5100b1531fb2bdc7232d2c3508846Daisuke Miyakawa 35248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private boolean requireKeyStore(WifiConfiguration config) { 353d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (WifiConfigController.requireKeyStore(config) && 35448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh KeyStore.getInstance().test() != KeyStore.NO_ERROR) { 35548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mKeyStoreNetworkId = config.networkId; 3569c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Credentials.getInstance().unlock(getActivity()); 35748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 35848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 35948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return false; 36048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 362d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /** 363d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Shows the latest access points available with supplimental information like 364d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * the strength of network and the security for it. 365d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateAccessPoints() { 36786eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa mAccessPoints.removeAll(); 36886eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa 36958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // AccessPoints are automatically sorted with TreeSet. 37058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa final Collection<AccessPoint> accessPoints = constructAccessPoints(); 37158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mInXlSetupWizard) { 37258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onAccessPointsUpdated( 37358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mAccessPoints, accessPoints); 37458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else { 37558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa for (AccessPoint accessPoint : accessPoints) { 37658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mAccessPoints.addPreference(accessPoint); 377d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 378d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 379d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 38048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 381d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private Collection<AccessPoint> constructAccessPoints() { 382d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa Collection<AccessPoint> accessPoints = 383d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa new TreeSet<AccessPoint>(new AccessPoint.Comparater()); 384d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 385d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); 38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (configs != null) { 38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (WifiConfiguration config : configs) { 3889c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa AccessPoint accessPoint = new AccessPoint(getActivity(), config); 38948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoint.update(mLastInfo, mLastState); 39048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoints.add(accessPoint); 39148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 394d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa final List<ScanResult> results = mWifiManager.getScanResults(); 39548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (results != null) { 39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (ScanResult result : results) { 39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Ignore hidden and ad-hoc networks. 39848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (result.SSID == null || result.SSID.length() == 0 || 39948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh result.capabilities.contains("[IBSS]")) { 40048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh continue; 40148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 40248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 40348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh boolean found = false; 40448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (AccessPoint accessPoint : accessPoints) { 40548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (accessPoint.update(result)) { 40648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh found = true; 40748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 40848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 40948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!found) { 4109c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa accessPoints.add(new AccessPoint(getActivity(), result)); 41148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 415d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa return accessPoints; 41648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void handleEvent(Intent intent) { 41948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh String action = intent.getAction(); 42048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { 42148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 42248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiManager.WIFI_STATE_UNKNOWN)); 423d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) || 424d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff WifiManager.SUPPLICANT_CONFIG_CHANGED_ACTION.equals(action)) { 425d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa updateAccessPoints(); 42648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 42748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState) 42848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE))); 42948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 43079470d1a66f479919c13e27546391439cafa0ee7Freeman Ng NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( 43179470d1a66f479919c13e27546391439cafa0ee7Freeman Ng WifiManager.EXTRA_NETWORK_INFO); 432d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(info.isConnected()); 43379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng updateConnectionState(info.getDetailedState()); 43448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) { 43548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(null); 43648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 43748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 43848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 439af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh private void updateConnectionState(DetailedState state) { 4402215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff /* sticky broadcasts can call this when wifi is disabled */ 441e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff if (!mWifiManager.isWifiEnabled()) { 442e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff mScanner.pause(); 4432215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff return; 444e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff } 4452215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff 446af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh if (state == DetailedState.OBTAINING_IPADDR) { 44748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 45148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 45248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastInfo = mWifiManager.getConnectionInfo(); 45348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state != null) { 45448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastState = state; 45548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 45648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 45748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) { 458d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa // Maybe there's a WifiConfigPreference 459d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa Preference preference = mAccessPoints.getPreference(i); 460d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (preference instanceof AccessPoint) { 46186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa final AccessPoint accessPoint = (AccessPoint) preference; 46286eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa accessPoint.update(mLastInfo, mLastState); 463d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 464d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 465d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 46658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mInXlSetupWizard) { 46758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).updateConnectionState(mLastState); 46848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 46948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateWifiState(int state) { 47248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state == WifiManager.WIFI_STATE_ENABLED) { 47348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 47448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 47548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 47648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.removeAll(); 47748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 48048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private class Scanner extends Handler { 48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private int mRetry = 0; 48248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 48348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void resume() { 48448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!hasMessages(0)) { 48548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh sendEmptyMessage(0); 48648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 48748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 48848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 48948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void pause() { 49048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 49148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.setProgress(false); 49248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh removeMessages(0); 49348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 49448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 49548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 49648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void handleMessage(Message message) { 49748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiManager.startScanActive()) { 49848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 49948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (++mRetry >= 3) { 50048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 5019c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa Toast.makeText(getActivity(), R.string.wifi_fail_to_scan, 50248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Toast.LENGTH_LONG).show(); 503e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff return; 50448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 50548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.setProgress(mRetry != 0); 5067add00049ac150c4b8c0e473a9baca70cf5e8aa8Irfan Sheriff // Combo scans can take 5-6s to complete. Increase interval to 10s. 5077add00049ac150c4b8c0e473a9baca70cf5e8aa8Irfan Sheriff sendEmptyMessageDelayed(0, 10000); 50848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 50948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 510d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 51158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 51258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Renames/replaces "Next" button when appropriate. "Next" button usually exists in 51358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Wifi setup screens, not in usual wifi settings screen. 51458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * 51558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * @param connected true when the device is connected to a wifi network. 51658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 51758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private void changeNextButtonState(boolean connected) { 518d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mInXlSetupWizard) { 51958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).changeNextButtonState(connected); 520d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } else if (mEnableNextOnConnection && hasNextButton()) { 52158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa getNextButton().setEnabled(connected); 522d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 523d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 524d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 525d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa public void onClick(DialogInterface dialogInterface, int button) { 52658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mInXlSetupWizard) { 52758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { 52858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onForgetButtonPressed(); 52958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (button == WifiDialog.BUTTON_SUBMIT) { 53058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa ((WifiSettingsForSetupWizardXL)getActivity()).onConnectButtonPressed(); 53158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 53258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else { 53358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { 53458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa forget(); 53558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (button == WifiDialog.BUTTON_SUBMIT) { 53658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa submit(mDialog.getController()); 5378b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa } 538d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 539d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 54058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 541d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 54258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void submit(WifiConfigController configController) { 543b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff switch(configController.chosenNetworkSetupMethod()) { 544b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff case WifiConfigController.WPS_PBC: 545b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mWifiManager.startWpsPbc(mSelectedAccessPoint.bssid); 546b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff break; 547e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff case WifiConfigController.WPS_PIN_FROM_ACCESS_POINT: 548b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff int apPin = configController.getWpsPin(); 549e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff mWifiManager.startWpsWithPinFromAccessPoint(mSelectedAccessPoint.bssid, apPin); 550e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff break; 551e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff case WifiConfigController.WPS_PIN_FROM_DEVICE: 552e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff int pin = mWifiManager.startWpsWithPinFromDevice(mSelectedAccessPoint.bssid); 553e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff new AlertDialog.Builder(getActivity()) 55458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa .setTitle(R.string.wifi_wps_pin_method_configuration) 55558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa .setMessage(getResources().getString(R.string.wifi_wps_pin_output, pin)) 55658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa .setPositiveButton(android.R.string.ok, null) 55758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa .show(); 558b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff break; 559b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff case WifiConfigController.MANUAL: 560b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff final WifiConfiguration config = configController.getConfig(); 561b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff 562b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (config == null) { 563b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint != null 5645d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa && !requireKeyStore(mSelectedAccessPoint.getConfig()) 5655d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { 566b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mWifiManager.connectNetwork(mSelectedAccessPoint.networkId); 567b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } 568b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } else if (config.networkId != INVALID_NETWORK_ID) { 569b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff if (mSelectedAccessPoint != null) { 570b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mWifiManager.saveNetwork(config); 571b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } 572b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } else { 57358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (configController.isEdit() || requireKeyStore(config)) { 574b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mWifiManager.saveNetwork(config); 575b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } else { 576b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff mWifiManager.connectNetwork(config); 577b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } 578b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff } 579b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff break; 580d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 581d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 58258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 58358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 58486eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa } 58558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 586d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 587d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 588d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void forget() { 589d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId); 590d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 59158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 59258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 59358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 59458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa updateAccessPoints(); 595d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 59658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // We need to rename/replace "Next" button in wifi setup context. 597d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa changeNextButtonState(false); 598d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 599d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 60058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 60158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Refreshes acccess points and ask Wifi module to scan networks again. 60258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 603d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void refreshAccessPoints() { 604d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 605d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mScanner.resume(); 606d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 607d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 608d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mAccessPoints.removeAll(); 609d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 610d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 61158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 61258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when "add network" button is pressed. 61358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 614d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa /* package */ void onAddNetworkPressed() { 61558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // No exact access point is selected. 616d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mSelectedAccessPoint = null; 617d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa showConfigUi(null, true); 618d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 619b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa 620b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa /* package */ int getAccessPointsCount() { 621b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa if (mAccessPoints != null) { 622b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa return mAccessPoints.getPreferenceCount(); 623b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } else { 624b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa return 0; 625b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 626b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 62755de702961642521e247f155963644df81756215Daisuke Miyakawa 62858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 62958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to pause wifi scan. May be ignored when the module is disabled. 63058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 63158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void pauseWifiScan() { 63258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 63358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.pause(); 63458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 63558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 63658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 63758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 63858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Requests wifi module to resume wifi scan. May be ignored when the module is disabled. 63958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 64058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void resumeWifiScan() { 64158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (mWifiManager.isWifiEnabled()) { 64258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mScanner.resume(); 64358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 64455de702961642521e247f155963644df81756215Daisuke Miyakawa } 64548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh} 646