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