WifiSettings.java revision 065cd4be6471084863c6560b8404dfdeaf4f2154
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 1948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport com.android.settings.ProgressCategory; 2048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport com.android.settings.R; 2148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 2248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver; 2348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context; 2448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface; 2548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent; 2648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter; 2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo; 2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult; 2948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState; 3048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration; 3148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration.KeyMgmt; 3248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration.Status; 3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo; 3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager; 3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle; 3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler; 3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message; 3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.CheckBoxPreference; 3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference; 4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceActivity; 4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen; 4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.provider.Settings.Secure; 4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials; 4448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore; 4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.text.TextUtils; 4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu; 4748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu.ContextMenuInfo; 4848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu; 4948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem; 5048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View; 5148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.widget.AdapterView.AdapterContextMenuInfo; 5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.widget.Toast; 5348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.ArrayList; 5548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List; 5648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 57065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yehpublic class WifiSettings extends PreferenceActivity implements DialogInterface.OnClickListener { 5848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_SCAN = Menu.FIRST; 5948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_ADVANCED = Menu.FIRST + 1; 6048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_CONNECT = Menu.FIRST + 2; 6148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_FORGET = Menu.FIRST + 3; 6248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private static final int MENU_ID_MODIFY = Menu.FIRST + 4; 6348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 6448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final IntentFilter mFilter; 6548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final BroadcastReceiver mReceiver; 6648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private final Scanner mScanner; 6748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 6848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiManager mWifiManager; 6948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiEnabler mWifiEnabler; 7048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private CheckBoxPreference mNotifyOpenNetworks; 7148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private ProgressCategory mAccessPoints; 7248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private Preference mAddNetwork; 7348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 7448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private NetworkInfo.DetailedState mLastState; 7548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiInfo mLastInfo; 7648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private int mLastPriority; 7748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 7848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private boolean mResetNetworks = false; 7948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private int mKeyStoreNetworkId = -1; 8048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 8148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private AccessPoint mSelected; 8248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private WifiDialog mDialog; 8348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 84065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh public WifiSettings() { 8548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter = new IntentFilter(); 8648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 8748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 8848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION); 8948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 9048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 9148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); 9248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 9348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mReceiver = new BroadcastReceiver() { 9448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 9548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onReceive(Context context, Intent intent) { 9648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh handleEvent(intent); 9748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 9848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh }; 9948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 10048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner = new Scanner(); 10148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 10248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 10348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 10448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh protected void onCreate(Bundle savedInstanceState) { 10548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onCreate(savedInstanceState); 10648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 10748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 10848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 10948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (getIntent().getBooleanExtra("only_access_points", false)) { 110065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh addPreferencesFromResource(R.xml.wifi_access_points); 11148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 112065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh addPreferencesFromResource(R.xml.wifi_settings); 11348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler = new WifiEnabler(this, mWifiManager, 11448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh (CheckBoxPreference) findPreference("enable_wifi")); 11548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mNotifyOpenNetworks = 11648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh (CheckBoxPreference) findPreference("notify_open_networks"); 11748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mNotifyOpenNetworks.setChecked(Secure.getInt(getContentResolver(), 11848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1); 11948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 12048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 12148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints = (ProgressCategory) findPreference("access_points"); 12248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.setOrderingAsAdded(false); 12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAddNetwork = findPreference("add_network"); 12448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh registerForContextMenu(getListView()); 12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 12748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh protected void onResume() { 13048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onResume(); 13148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh registerReceiver(mReceiver, mFilter); 13248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 13348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.resume(); 13448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 13548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mKeyStoreNetworkId != -1 && KeyStore.getInstance().test() == KeyStore.NO_ERROR) { 13648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh connect(mKeyStoreNetworkId); 13748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 13848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mKeyStoreNetworkId = -1; 13948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 14048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 14148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 14248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh protected void onPause() { 14348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh super.onPause(); 14448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh unregisterReceiver(mReceiver); 14548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiEnabler != null) { 14648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiEnabler.pause(); 14748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 14848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 14948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 15048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.dismiss(); 15148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog = null; 15248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 15348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mResetNetworks) { 15448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh enableNetworks(); 15548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 15648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 15748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 15848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 15948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onCreateOptionsMenu(Menu menu) { 16048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan) 16148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh .setIcon(R.drawable.ic_menu_scan_network); 16248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced) 16348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh .setIcon(android.R.drawable.ic_menu_manage); 16448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onCreateOptionsMenu(menu); 16548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 16648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 16748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onOptionsItemSelected(MenuItem item) { 16948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_SCAN: 17148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 17248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 17348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_ADVANCED: 17448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh startActivity(new Intent(this, AdvancedSettings.class)); 17548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 17648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 17748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onOptionsItemSelected(item); 17848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 17948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 18048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 18148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) { 18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (info instanceof AdapterContextMenuInfo) { 18348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Preference preference = (Preference) getListView().getItemAtPosition( 18448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh ((AdapterContextMenuInfo) info).position); 18548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 18648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 18748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mSelected = (AccessPoint) preference; 18848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.setHeaderTitle(mSelected.ssid); 18948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mSelected.getLevel() != -1 && mSelected.getState() == null) { 19048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); 19148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 19248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mSelected.networkId != -1) { 19348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget); 19448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mSelected.security != AccessPoint.SECURITY_NONE) { 19548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify); 19648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 19748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 19848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 19948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 20048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 20148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 20248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 20348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onContextItemSelected(MenuItem item) { 20448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mSelected == null) { 20548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 20648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 20748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh switch (item.getItemId()) { 20848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_CONNECT: 20948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mSelected.networkId != -1) { 21048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!requireKeyStore(mSelected.getConfig())) { 21148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh connect(mSelected.networkId); 21248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 21348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (mSelected.security == AccessPoint.SECURITY_NONE) { 21448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Shortcut for open networks. 21548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiConfiguration config = new WifiConfiguration(); 21648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.SSID = mSelected.ssid; 21748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.allowedKeyManagement.set(KeyMgmt.NONE); 21848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh int networkId = mWifiManager.addNetwork(config); 21948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.enableNetwork(networkId, false); 22048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh connect(networkId); 22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 22248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh showDialog(mSelected, false); 22348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 22448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 22548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_FORGET: 22648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh forget(mSelected.networkId); 22748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 22848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh case MENU_ID_MODIFY: 22948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh showDialog(mSelected, true); 23048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 23148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 23248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onContextItemSelected(item); 23348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 23448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 23548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 23648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 23748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (preference instanceof AccessPoint) { 23848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mSelected = (AccessPoint) preference; 23948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh showDialog(mSelected, false); 24048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (preference == mAddNetwork) { 24148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mSelected = null; 24248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh showDialog(null, true); 24348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (preference == mNotifyOpenNetworks) { 24448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Secure.putInt(getContentResolver(), 24548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 24648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mNotifyOpenNetworks.isChecked() ? 1 : 0); 24748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 24848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return super.onPreferenceTreeClick(screen, preference); 24948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 25048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 25148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 25248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 25348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void onClick(DialogInterface dialogInterface, int button) { 25448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (button == WifiDialog.BUTTON_FORGET && mSelected != null) { 25548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh forget(mSelected.networkId); 25648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (button == WifiDialog.BUTTON_SUBMIT) { 25748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiConfiguration config = mDialog.getConfig(); 25848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 25948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (config == null) { 26048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mSelected != null && !requireKeyStore(mSelected.getConfig())) { 26148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh connect(mSelected.networkId); 26248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 26348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (config.networkId != -1) { 26448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mSelected != null) { 26548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.updateNetwork(config); 26648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh saveNetworks(); 26748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 26848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 26948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh int networkId = mWifiManager.addNetwork(config); 27048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (networkId != -1) { 27148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.enableNetwork(networkId, false); 27248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.networkId = networkId; 27348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog.edit || requireKeyStore(config)) { 27448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh saveNetworks(); 27548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 27648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh connect(networkId); 27748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 27848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 27948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 28048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 28148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 28248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 28348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void showDialog(AccessPoint accessPoint, boolean edit) { 28448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mDialog != null) { 28548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.dismiss(); 28648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 28748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog = new WifiDialog(this, this, accessPoint, edit); 28848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mDialog.show(); 28948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 29048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 29148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private boolean requireKeyStore(WifiConfiguration config) { 29248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (WifiDialog.requireKeyStore(config) && 29348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh KeyStore.getInstance().test() != KeyStore.NO_ERROR) { 29448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mKeyStoreNetworkId = config.networkId; 29548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Credentials.getInstance().unlock(this); 29648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return true; 29748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 29848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return false; 29948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 30048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 30148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void forget(int networkId) { 30248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.removeNetwork(networkId); 30348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh saveNetworks(); 30448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 30548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 30648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void connect(int networkId) { 30748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (networkId == -1) { 30848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh return; 30948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 31048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 31148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Reset the priority of each network if it goes too high. 31248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mLastPriority > 1000000) { 31348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) { 31448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh AccessPoint accessPoint = (AccessPoint) mAccessPoints.getPreference(i); 31548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (accessPoint.networkId != -1) { 31648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiConfiguration config = new WifiConfiguration(); 31748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.networkId = accessPoint.networkId; 31848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.priority = 0; 31948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.updateNetwork(config); 32048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 32148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 32248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastPriority = 0; 32348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 32448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 32548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Set to the highest priority and save the configuration. 32648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiConfiguration config = new WifiConfiguration(); 32748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.networkId = networkId; 32848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.priority = ++mLastPriority; 32948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.updateNetwork(config); 33048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh saveNetworks(); 33148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 33248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Connect to network by disabling others. 33348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.enableNetwork(networkId, true); 33448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.reconnect(); 33548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mResetNetworks = true; 33648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 33748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 33848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void enableNetworks() { 33948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) { 34048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiConfiguration config = ((AccessPoint) mAccessPoints.getPreference(i)).getConfig(); 34148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (config != null && config.status != Status.ENABLED) { 34248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.enableNetwork(config.networkId, false); 34348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 34448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 34548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mResetNetworks = false; 34648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 34748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 34848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void saveNetworks() { 34948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Always save the configuration with all networks enabled. 35048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh enableNetworks(); 35148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mWifiManager.saveConfiguration(); 35248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateAccessPoints(); 35348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 35448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 35548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateAccessPoints() { 35648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh List<AccessPoint> accessPoints = new ArrayList<AccessPoint>(); 35748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 35848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); 35948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (configs != null) { 36048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastPriority = 0; 36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (WifiConfiguration config : configs) { 36248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (config.priority > mLastPriority) { 36348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastPriority = config.priority; 36448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 36548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Shift the status to make enableNetworks() more efficient. 36748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (config.status == Status.CURRENT) { 36848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.status = Status.ENABLED; 36948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (mResetNetworks && config.status == Status.DISABLED) { 37048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh config.status = Status.CURRENT; 37148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 37248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 37348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh AccessPoint accessPoint = new AccessPoint(this, config); 37448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoint.update(mLastInfo, mLastState); 37548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoints.add(accessPoint); 37648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 37748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 37848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 37948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh List<ScanResult> results = mWifiManager.getScanResults(); 38048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (results != null) { 38148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (ScanResult result : results) { 38248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh // Ignore hidden and ad-hoc networks. 38348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (result.SSID == null || result.SSID.length() == 0 || 38448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh result.capabilities.contains("[IBSS]")) { 38548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh continue; 38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 38848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh boolean found = false; 38948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (AccessPoint accessPoint : accessPoints) { 39048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (accessPoint.update(result)) { 39148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh found = true; 39248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!found) { 39548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh accessPoints.add(new AccessPoint(this, result)); 39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 39948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 40048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.removeAll(); 40148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (AccessPoint accessPoint : accessPoints) { 40248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.addPreference(accessPoint); 40348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 40448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 40548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 40648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void handleEvent(Intent intent) { 40748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh String action = intent.getAction(); 40848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { 40948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 41048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiManager.WIFI_STATE_UNKNOWN)); 41148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) { 41248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateAccessPoints(); 41348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.NETWORK_IDS_CHANGED_ACTION.equals(action)) { 41448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mSelected != null && mSelected.networkId != -1) { 41548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mSelected = null; 41648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 41748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateAccessPoints(); 41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 41948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState) 42048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE))); 42148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 42248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(((NetworkInfo) intent.getParcelableExtra( 42348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh WifiManager.EXTRA_NETWORK_INFO)).getDetailedState()); 42448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) { 42548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateConnectionState(null); 42648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 42748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 42848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 42948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateConnectionState(NetworkInfo.DetailedState state) { 43048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state == NetworkInfo.DetailedState.OBTAINING_IPADDR) { 43148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 43248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 43348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 43448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 43548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 43648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastInfo = mWifiManager.getConnectionInfo(); 43748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state != null) { 43848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mLastState = state; 43948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 44048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 44148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) { 44248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh ((AccessPoint) mAccessPoints.getPreference(i)).update(mLastInfo, mLastState); 44348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 44448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 44548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 44648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private void updateWifiState(int state) { 44748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (state == WifiManager.WIFI_STATE_ENABLED) { 44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.resume(); 44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh updateAccessPoints(); 45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else { 45148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mScanner.pause(); 45248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.removeAll(); 45348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 45448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 45548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 45648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private class Scanner extends Handler { 45748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh private int mRetry = 0; 45848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 45948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void resume() { 46048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (!hasMessages(0)) { 46148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh sendEmptyMessage(0); 46248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 46348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 46448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 46548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh void pause() { 46648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 46748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.setProgress(false); 46848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh removeMessages(0); 46948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 47048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh 47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh @Override 47248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh public void handleMessage(Message message) { 47348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh if (mWifiManager.startScanActive()) { 47448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 47548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } else if (++mRetry >= 3) { 47648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mRetry = 0; 477065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh Toast.makeText(WifiSettings.this, R.string.wifi_fail_to_scan, 47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh Toast.LENGTH_LONG).show(); 47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 48048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh mAccessPoints.setProgress(mRetry != 0); 48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh sendEmptyMessageDelayed(0, 6000); 48248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 48348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh } 48448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh} 485