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 android.content.BroadcastReceiver; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 23f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Lingimport android.net.ConnectivityManager; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.NetworkInfo; 25feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yehimport android.net.wifi.SupplicantState; 26feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yehimport android.net.wifi.WifiInfo; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.wifi.WifiManager; 283f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Banimport android.os.UserHandle; 293f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Banimport android.os.UserManager; 3083bcc98af19597a213a8d174e8f1b47453d513ceMike Lockwoodimport android.provider.Settings; 31f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Lingimport android.support.annotation.VisibleForTesting; 32b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yehimport android.widget.Toast; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 34265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 35e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport com.android.settings.R; 36aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhangimport com.android.settings.core.instrumentation.MetricsFeatureProvider; 37c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Lingimport com.android.settings.widget.SwitchWidgetController; 383f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Banimport com.android.settingslib.RestrictedLockUtils; 393f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Banimport com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; 40fc1b00cfe439b0c462b3acbba709c3cbc1132a1fJason Monkimport com.android.settingslib.WirelessUtils; 41e78c1879058571c00879f0d3e756951302adf513Gilles Debunne 42cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean; 43cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff 44c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Lingpublic class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListener { 45aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang 46c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling private final SwitchWidgetController mSwitchWidget; 47aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang private final WifiManager mWifiManager; 48f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling private final ConnectivityManagerWrapper mConnectivityManager; 49aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang private final MetricsFeatureProvider mMetricsFeatureProvider; 50aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang 51d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private Context mContext; 52e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande private boolean mListeningToOnSwitchChange = false; 53cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff private AtomicBoolean mConnected = new AtomicBoolean(false); 54cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff 55aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang 56b1c0e0b1c93acbc71a2063411ae4ac86f9fc9fbfIrfan Sheriff private boolean mStateMachineEvent; 57b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh private final IntentFilter mIntentFilter; 58b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onReceive(Context context, Intent intent) { 61b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh String action = intent.getAction(); 62b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { 6319b74d92139ee4cd47afe07685bcceddec190d13Stephen Chen handleWifiStateChanged(mWifiManager.getWifiState()); 64feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 65cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff if (!mConnected.get()) { 66cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState) 67cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE))); 68cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff } 69b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 70cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( 71cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff WifiManager.EXTRA_NETWORK_INFO); 72cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff mConnected.set(info.isConnected()); 73cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff handleStateChanged(info.getDetailedState()); 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 774e14211d21387d645ecdad406f3350d36e5a8643Chia-chi Yeh 78784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio private static final String EVENT_DATA_IS_WIFI_ON = "is_wifi_on"; 79784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio private static final int EVENT_UPDATE_INDEX = 0; 80784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio 81c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling public WifiEnabler(Context context, SwitchWidgetController switchWidget, 82f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling MetricsFeatureProvider metricsFeatureProvider) { 83f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling this(context, switchWidget, metricsFeatureProvider, new ConnectivityManagerWrapper( 84f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE))); 85f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling } 86f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling 87f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling @VisibleForTesting 88f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling WifiEnabler(Context context, SwitchWidgetController switchWidget, 89f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling MetricsFeatureProvider metricsFeatureProvider, 90f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling ConnectivityManagerWrapper connectivityManagerWrapper) { 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mContext = context; 92c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget = switchWidget; 93c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setListener(this); 94aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang mMetricsFeatureProvider = metricsFeatureProvider; 959dee8a96c5682aebff50adc8c87519ee6c36e3efChia-chi Yeh mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 96f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling mConnectivityManager = connectivityManagerWrapper; 9792239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio 98b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); 99feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh // The order matters! We really should not depend on this. :( 100feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 101b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 10292239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio 103c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling setupSwitchController(); 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 106c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling public void setupSwitchController() { 10792239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio final int state = mWifiManager.getWifiState(); 10892239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio handleWifiStateChanged(state); 109e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande if (!mListeningToOnSwitchChange) { 110c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.startListening(); 111e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande mListeningToOnSwitchChange = true; 112e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande } 113c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setupView(); 114138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio } 115138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio 116c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling public void teardownSwitchController() { 117e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande if (mListeningToOnSwitchChange) { 118c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.stopListening(); 119e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande mListeningToOnSwitchChange = false; 120e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande } 121c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.teardownView(); 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 124d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public void resume(Context context) { 125d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mContext = context; 126b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh // Wi-Fi state is sticky, so just let the receiver update UI 127b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mContext.registerReceiver(mReceiver, mIntentFilter); 128e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande if (!mListeningToOnSwitchChange) { 129c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.startListening(); 130e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande mListeningToOnSwitchChange = true; 131e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande } 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 133cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void pause() { 135b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh mContext.unregisterReceiver(mReceiver); 136e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande if (mListeningToOnSwitchChange) { 137c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.stopListening(); 138e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande mListeningToOnSwitchChange = false; 139e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande } 140b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh } 141cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff 142b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh private void handleWifiStateChanged(int state) { 1433f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban // Clear any previous state 144c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setDisabledByAdmin(null); 1453f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban 146b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh switch (state) { 147b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh case WifiManager.WIFI_STATE_ENABLING: 148b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh break; 149b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh case WifiManager.WIFI_STATE_ENABLED: 15092239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio setSwitchBarChecked(true); 151c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setEnabled(true); 152b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh break; 153b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh case WifiManager.WIFI_STATE_DISABLING: 154b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh break; 155b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh case WifiManager.WIFI_STATE_DISABLED: 15692239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio setSwitchBarChecked(false); 157c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setEnabled(true); 158b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh break; 159b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh default: 16092239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio setSwitchBarChecked(false); 161c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setEnabled(true); 162b1c0e0b1c93acbc71a2063411ae4ac86f9fc9fbfIrfan Sheriff } 163c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling if (mayDisableTethering(!mSwitchWidget.isChecked())) { 1643f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban if (RestrictedLockUtils.hasBaseUserRestriction(mContext, 1653f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId())) { 166c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setEnabled(false); 1673f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban } else { 1683f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext, 1693f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()); 170c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setDisabledByAdmin(admin); 1713f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban } 1723f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban } 173b1c0e0b1c93acbc71a2063411ae4ac86f9fc9fbfIrfan Sheriff } 174b1c0e0b1c93acbc71a2063411ae4ac86f9fc9fbfIrfan Sheriff 17592239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio private void setSwitchBarChecked(boolean checked) { 17692239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio mStateMachineEvent = true; 177c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setChecked(checked); 17892239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio mStateMachineEvent = false; 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 181e78c1879058571c00879f0d3e756951302adf513Gilles Debunne private void handleStateChanged(@SuppressWarnings("unused") NetworkInfo.DetailedState state) { 182e78c1879058571c00879f0d3e756951302adf513Gilles Debunne // After the refactoring from a CheckBoxPreference to a Switch, this method is useless since 183e78c1879058571c00879f0d3e756951302adf513Gilles Debunne // there is nowhere to display a summary. 184e78c1879058571c00879f0d3e756951302adf513Gilles Debunne // This code is kept in case a future change re-introduces an associated text. 185e78c1879058571c00879f0d3e756951302adf513Gilles Debunne /* 186feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh // WifiInfo is valid if and only if Wi-Fi is enabled. 187e78c1879058571c00879f0d3e756951302adf513Gilles Debunne // Here we use the state of the switch as an optimization. 188e78c1879058571c00879f0d3e756951302adf513Gilles Debunne if (state != null && mSwitch.isChecked()) { 189feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh WifiInfo info = mWifiManager.getConnectionInfo(); 190feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh if (info != null) { 191e78c1879058571c00879f0d3e756951302adf513Gilles Debunne //setSummary(Summary.get(mContext, info.getSSID(), state)); 192feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh } 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 194e78c1879058571c00879f0d3e756951302adf513Gilles Debunne */ 195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 19641937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio 19741937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio @Override 198c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling public boolean onSwitchToggled(boolean isChecked) { 19941937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio //Do nothing if called as a result of a state machine event 20041937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio if (mStateMachineEvent) { 201c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling return true; 20241937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio } 20341937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio // Show toast message if Wi-Fi is not allowed in airplane mode 204fc1b00cfe439b0c462b3acbba709c3cbc1132a1fJason Monk if (isChecked && !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_WIFI)) { 20541937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show(); 20641937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio // Reset switch to off. No infinite check/listenenr loop. 207c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setChecked(false); 208c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling return false; 20941937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio } 21041937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio 21141937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio // Disable tethering if enabling Wifi 2123f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban if (mayDisableTethering(isChecked)) { 213f38ed2fbb20f9f3b0a73d7bd990cab963e9115f0Doris Ling mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI); 21441937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio } 215d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen if (isChecked) { 216d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_WIFI_ON); 217d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen } else { 218d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen // Log if user was connected at the time of switching off. 219d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_WIFI_OFF, 220d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen mConnected.get()); 221d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen } 22241937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio if (!mWifiManager.setWifiEnabled(isChecked)) { 22341937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio // Error 224c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling mSwitchWidget.setEnabled(true); 22541937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show(); 22641937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio } 227c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling return true; 22841937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio } 2293f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban 2303f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban private boolean mayDisableTethering(boolean isChecked) { 2313f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban final int wifiApState = mWifiManager.getWifiApState(); 2323f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban return isChecked && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || 2333f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED)); 2343f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban } 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 236