WifiEnabler.java revision d9e2c946af8cebeaf9fa81ca5657d3932ee56d1b
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;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.NetworkInfo;
24feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yehimport android.net.wifi.SupplicantState;
25feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yehimport android.net.wifi.WifiInfo;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.wifi.WifiManager;
27784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglioimport android.os.Handler;
28784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglioimport android.os.Message;
293f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Banimport android.os.UserHandle;
303f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Banimport android.os.UserManager;
3183bcc98af19597a213a8d174e8f1b47453d513ceMike Lockwoodimport android.provider.Settings;
32e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch;
33b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yehimport android.widget.Toast;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
359d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
36e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport com.android.settings.R;
37aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhangimport com.android.settings.core.instrumentation.MetricsFeatureProvider;
385f3442af6f1d1141f8f4dff033d4176214281b81Fabrice Di Meglioimport com.android.settings.search.Index;
3941937766981423c9252e12e3319b2e7532739627Fabrice Di Meglioimport com.android.settings.widget.SwitchBar;
403f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Banimport com.android.settingslib.RestrictedLockUtils;
413f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Banimport com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
42fc1b00cfe439b0c462b3acbba709c3cbc1132a1fJason Monkimport com.android.settingslib.WirelessUtils;
43e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
44cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean;
45cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff
4641937766981423c9252e12e3319b2e7532739627Fabrice Di Megliopublic class WifiEnabler implements SwitchBar.OnSwitchChangeListener  {
47aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang
48aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang    private final SwitchBar mSwitchBar;
49aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang    private final WifiManager mWifiManager;
50aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang    private final MetricsFeatureProvider mMetricsFeatureProvider;
51aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang
52d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio    private Context mContext;
53e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande    private boolean mListeningToOnSwitchChange = false;
54cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff    private AtomicBoolean mConnected = new AtomicBoolean(false);
55cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff
56aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang
57b1c0e0b1c93acbc71a2063411ae4ac86f9fc9fbfIrfan Sheriff    private boolean mStateMachineEvent;
58b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    private final IntentFilter mIntentFilter;
59b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
62b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            String action = intent.getAction();
63b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
64b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                handleWifiStateChanged(intent.getIntExtra(
65b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                        WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN));
66feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh            } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
67cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff                if (!mConnected.get()) {
68cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff                    handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState)
69cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff                            intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
70cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff                }
71b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
72cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff                NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
73cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff                        WifiManager.EXTRA_NETWORK_INFO);
74cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff                mConnected.set(info.isConnected());
75cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff                handleStateChanged(info.getDetailedState());
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
794e14211d21387d645ecdad406f3350d36e5a8643Chia-chi Yeh
80784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio    private static final String EVENT_DATA_IS_WIFI_ON = "is_wifi_on";
81784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio    private static final int EVENT_UPDATE_INDEX = 0;
82784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio
83784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio    private Handler mHandler = new Handler() {
84784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio        @Override
85784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio        public void handleMessage(Message msg) {
86784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio            switch (msg.what) {
87784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio                case EVENT_UPDATE_INDEX:
88784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio                    final boolean isWiFiOn = msg.getData().getBoolean(EVENT_DATA_IS_WIFI_ON);
89784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio                    Index.getInstance(mContext).updateFromClassNameResource(
90da0e6ff8c25fad17f71166bd14ca655eb11d13b4Fabrice Di Meglio                            WifiSettings.class.getName(), true, isWiFiOn);
91784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio                    break;
92784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio            }
93784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio        }
94784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio    };
95784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio
96aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang    public WifiEnabler(Context context, SwitchBar switchBar,
97aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang            MetricsFeatureProvider metricsFeatureProvider) {
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mContext = context;
9941937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        mSwitchBar = switchBar;
100aa71afe5978b1340a2d702f3a75d22baf8c96348Fan Zhang        mMetricsFeatureProvider = metricsFeatureProvider;
1019dee8a96c5682aebff50adc8c87519ee6c36e3efChia-chi Yeh        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
10292239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio
103b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
104feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh        // The order matters! We really should not depend on this. :(
105feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
106b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
10792239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio
108204521626f63bef4a8ac2d76334b94dbb0f3aa3bFabrice Di Meglio        setupSwitchBar();
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
111138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio    public void setupSwitchBar() {
11292239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio        final int state = mWifiManager.getWifiState();
11392239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio        handleWifiStateChanged(state);
114e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande        if (!mListeningToOnSwitchChange) {
115e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande            mSwitchBar.addOnSwitchChangeListener(this);
116e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande            mListeningToOnSwitchChange = true;
117e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande        }
118138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        mSwitchBar.show();
119138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio    }
120138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio
121138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio    public void teardownSwitchBar() {
122e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande        if (mListeningToOnSwitchChange) {
123e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande            mSwitchBar.removeOnSwitchChangeListener(this);
124e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande            mListeningToOnSwitchChange = false;
125e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande        }
126138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        mSwitchBar.hide();
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
129d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio    public void resume(Context context) {
130d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        mContext = context;
131b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        // Wi-Fi state is sticky, so just let the receiver update UI
132b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mContext.registerReceiver(mReceiver, mIntentFilter);
133e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande        if (!mListeningToOnSwitchChange) {
134e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande            mSwitchBar.addOnSwitchChangeListener(this);
135e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande            mListeningToOnSwitchChange = true;
136e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande        }
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
138cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void pause() {
140b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mContext.unregisterReceiver(mReceiver);
141e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande        if (mListeningToOnSwitchChange) {
142e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande            mSwitchBar.removeOnSwitchChangeListener(this);
143e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande            mListeningToOnSwitchChange = false;
144e2c1d504fc02c08078284841424dc9e6ce49c7d7Vinit Deshpande        }
145b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    }
146cb52d4b4ab1156aa326fc51c878c2e7ba3f1146cIrfan Sheriff
147b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    private void handleWifiStateChanged(int state) {
1483f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban        // Clear any previous state
1493f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban        mSwitchBar.setDisabledByAdmin(null);
1503f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban
151b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        switch (state) {
152b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            case WifiManager.WIFI_STATE_ENABLING:
15392239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio                mSwitchBar.setEnabled(false);
154b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                break;
155b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            case WifiManager.WIFI_STATE_ENABLED:
15692239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio                setSwitchBarChecked(true);
15792239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio                mSwitchBar.setEnabled(true);
1585f3442af6f1d1141f8f4dff033d4176214281b81Fabrice Di Meglio                updateSearchIndex(true);
159b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                break;
160b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            case WifiManager.WIFI_STATE_DISABLING:
16192239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio                mSwitchBar.setEnabled(false);
162b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                break;
163b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            case WifiManager.WIFI_STATE_DISABLED:
16492239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio                setSwitchBarChecked(false);
16592239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio                mSwitchBar.setEnabled(true);
1665f3442af6f1d1141f8f4dff033d4176214281b81Fabrice Di Meglio                updateSearchIndex(false);
167b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                break;
168b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            default:
16992239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio                setSwitchBarChecked(false);
17092239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio                mSwitchBar.setEnabled(true);
1715f3442af6f1d1141f8f4dff033d4176214281b81Fabrice Di Meglio                updateSearchIndex(false);
172b1c0e0b1c93acbc71a2063411ae4ac86f9fc9fbfIrfan Sheriff        }
1733f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban        if (mayDisableTethering(!mSwitchBar.isChecked())) {
1743f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban            if (RestrictedLockUtils.hasBaseUserRestriction(mContext,
1753f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban                    UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId())) {
1763f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban                mSwitchBar.setEnabled(false);
1773f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban            } else {
1783f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban                final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext,
1793f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban                    UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId());
1803f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban                mSwitchBar.setDisabledByAdmin(admin);
1813f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban            }
1823f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban        }
183b1c0e0b1c93acbc71a2063411ae4ac86f9fc9fbfIrfan Sheriff    }
184b1c0e0b1c93acbc71a2063411ae4ac86f9fc9fbfIrfan Sheriff
1855f3442af6f1d1141f8f4dff033d4176214281b81Fabrice Di Meglio    private void updateSearchIndex(boolean isWiFiOn) {
186784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio        mHandler.removeMessages(EVENT_UPDATE_INDEX);
187784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio
188784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio        Message msg = new Message();
189784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio        msg.what = EVENT_UPDATE_INDEX;
190784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio        msg.getData().putBoolean(EVENT_DATA_IS_WIFI_ON, isWiFiOn);
191784f266cbd0b5934bec8229cf8dbe87180afdda2Fabrice Di Meglio        mHandler.sendMessage(msg);
1925f3442af6f1d1141f8f4dff033d4176214281b81Fabrice Di Meglio    }
1935f3442af6f1d1141f8f4dff033d4176214281b81Fabrice Di Meglio
19492239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio    private void setSwitchBarChecked(boolean checked) {
19592239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio        mStateMachineEvent = true;
19692239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio        mSwitchBar.setChecked(checked);
19792239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio        mStateMachineEvent = false;
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
200e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private void handleStateChanged(@SuppressWarnings("unused") NetworkInfo.DetailedState state) {
201e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        // After the refactoring from a CheckBoxPreference to a Switch, this method is useless since
202e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        // there is nowhere to display a summary.
203e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        // This code is kept in case a future change re-introduces an associated text.
204e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        /*
205feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh        // WifiInfo is valid if and only if Wi-Fi is enabled.
206e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        // Here we use the state of the switch as an optimization.
207e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (state != null && mSwitch.isChecked()) {
208feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh            WifiInfo info = mWifiManager.getConnectionInfo();
209feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh            if (info != null) {
210e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                //setSummary(Summary.get(mContext, info.getSSID(), state));
211feeb75613241556ee2a6504a55a2f3849fb4ce4cChia-chi Yeh            }
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
213e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        */
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
21541937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio
21641937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio    @Override
21741937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio    public void onSwitchChanged(Switch switchView, boolean isChecked) {
21841937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        //Do nothing if called as a result of a state machine event
21941937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        if (mStateMachineEvent) {
22041937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio            return;
22141937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        }
22241937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        // Show toast message if Wi-Fi is not allowed in airplane mode
223fc1b00cfe439b0c462b3acbba709c3cbc1132a1fJason Monk        if (isChecked && !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_WIFI)) {
22441937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio            Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show();
22541937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio            // Reset switch to off. No infinite check/listenenr loop.
22692239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio            mSwitchBar.setChecked(false);
22741937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio            return;
22841937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        }
22941937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio
23041937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        // Disable tethering if enabling Wifi
2313f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban        if (mayDisableTethering(isChecked)) {
23241937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio            mWifiManager.setWifiApEnabled(null, false);
23341937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        }
234d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen        if (isChecked) {
235d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen            mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_WIFI_ON);
236d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen        } else {
237d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen            // Log if user was connected at the time of switching off.
238d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen            mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_WIFI_OFF,
239d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen                    mConnected.get());
240d9e2c946af8cebeaf9fa81ca5657d3932ee56d1bStephen Chen        }
24141937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        if (!mWifiManager.setWifiEnabled(isChecked)) {
24241937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio            // Error
24392239ed799c81f3842302dd65f347d726c8c908dFabrice Di Meglio            mSwitchBar.setEnabled(true);
24441937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio            Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show();
24541937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio        }
24641937766981423c9252e12e3319b2e7532739627Fabrice Di Meglio    }
2473f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban
2483f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban    private boolean mayDisableTethering(boolean isChecked) {
2493f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban        final int wifiApState = mWifiManager.getWifiApState();
2503f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban        return isChecked && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) ||
2513f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban            (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED));
2523f6208170df1e8635a5d45947a2703c895da6970Zoltan Szatmary-Ban    }
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
254