WifiEnabler.java revision a6a74e222a994e29a1daa7178943a1fc9dd06c47
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh * Copyright (C) 2010 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings.wifi; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R; 20b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yehimport com.android.settings.WirelessSettings; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.BroadcastReceiver; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.NetworkInfo; 27feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yehimport android.net.wifi.SupplicantState; 28feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yehimport android.net.wifi.WifiInfo; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.wifi.WifiManager; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference; 3283bcc98af19597a213a8d174e8f1b47453d513ceMike Lockwoodimport android.provider.Settings; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils; 34b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yehimport android.widget.Toast; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class WifiEnabler implements Preference.OnPreferenceChangeListener { 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private final Context mContext; 38b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh private final CheckBoxPreference mCheckBox; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private final CharSequence mOriginalSummary; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 41b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh private final WifiManager mWifiManager; 42b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh private final IntentFilter mIntentFilter; 43b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onReceive(Context context, Intent intent) { 46b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh String action = intent.getAction(); 47b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { 48b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh handleWifiStateChanged(intent.getIntExtra( 49b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN)); 50feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 51feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState) 52feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE))); 53b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 54feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh handleStateChanged(((NetworkInfo) intent.getParcelableExtra( 55feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh WifiManager.EXTRA_NETWORK_INFO)).getDetailedState()); 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 594e14211d21387d645ecdad406f3350d36e5a8643Chia-chi Yeh 60b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh public WifiEnabler(Context context, CheckBoxPreference checkBox) { 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mContext = context; 62b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox = checkBox; 63b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mOriginalSummary = checkBox.getSummary(); 64b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh checkBox.setPersistent(false); 659dee8a96c5682aebff50adc8c87519ee6c36e3efChia-chi Yeh 669dee8a96c5682aebff50adc8c87519ee6c36e3efChia-chi Yeh mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 67b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); 68feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh // The order matters! We really should not depend on this. :( 69feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 70b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void resume() { 74b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh // Wi-Fi state is sticky, so just let the receiver update UI 75b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mContext.registerReceiver(mReceiver, mIntentFilter); 76b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setOnPreferenceChangeListener(this); 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void pause() { 80b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mContext.unregisterReceiver(mReceiver); 81b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setOnPreferenceChangeListener(null); 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onPreferenceChange(Preference preference, Object value) { 85b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh boolean enable = (Boolean) value; 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 87b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh // Show toast message if Wi-Fi is not allowed in airplane mode 88b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh if (enable && !WirelessSettings 89b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh .isRadioAllowed(mContext, Settings.System.RADIO_WIFI)) { 90b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh Toast.makeText(mContext, R.string.wifi_in_airplane_mode, 91b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh Toast.LENGTH_SHORT).show(); 92b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh return false; 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 95a6a74e222a994e29a1daa7178943a1fc9dd06c47Irfan Sheriff /** 96a6a74e222a994e29a1daa7178943a1fc9dd06c47Irfan Sheriff * Disable tethering if enabling Wifi 97a6a74e222a994e29a1daa7178943a1fc9dd06c47Irfan Sheriff */ 98a6a74e222a994e29a1daa7178943a1fc9dd06c47Irfan Sheriff int wifiApState = mWifiManager.getWifiApState(); 99a6a74e222a994e29a1daa7178943a1fc9dd06c47Irfan Sheriff if (enable && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || 100a6a74e222a994e29a1daa7178943a1fc9dd06c47Irfan Sheriff (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) { 101a6a74e222a994e29a1daa7178943a1fc9dd06c47Irfan Sheriff mWifiManager.setWifiApEnabled(null, false); 102a6a74e222a994e29a1daa7178943a1fc9dd06c47Irfan Sheriff } 103b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh if (mWifiManager.setWifiEnabled(enable)) { 104b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setEnabled(false); 105b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh } else { 106b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setSummary(R.string.wifi_error); 107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1081c4e96864f054f0d3d754d21eb4803fe0df6d89fJeff Sharkey 109b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh // Don't update UI to opposite state until we're sure 110b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh return false; 111b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh } 112b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh 113b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh private void handleWifiStateChanged(int state) { 114b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh switch (state) { 115b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh case WifiManager.WIFI_STATE_ENABLING: 116b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setSummary(R.string.wifi_starting); 117b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setEnabled(false); 118b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh break; 119b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh case WifiManager.WIFI_STATE_ENABLED: 120b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setChecked(true); 121b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setSummary(null); 122b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setEnabled(true); 123b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh break; 124b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh case WifiManager.WIFI_STATE_DISABLING: 125b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setSummary(R.string.wifi_stopping); 126b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setEnabled(false); 127b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh break; 128b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh case WifiManager.WIFI_STATE_DISABLED: 129b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setChecked(false); 130b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setSummary(mOriginalSummary); 131b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setEnabled(true); 132b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh break; 133b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh default: 134b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setChecked(false); 135b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setSummary(R.string.wifi_error); 136b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mCheckBox.setEnabled(true); 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 140feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh private void handleStateChanged(NetworkInfo.DetailedState state) { 141feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh // WifiInfo is valid if and only if Wi-Fi is enabled. 142feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh // Here we use the state of the check box as an optimization. 143feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh if (state != null && mCheckBox.isChecked()) { 144feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh WifiInfo info = mWifiManager.getConnectionInfo(); 145feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh if (info != null) { 146feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh mCheckBox.setSummary(Summary.get(mContext, info.getSSID(), state)); 147feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh } 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 151