WifiEnabler.java revision b90452f3d26201ea6a231f2150204241e66cd3fb
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;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.wifi.WifiManager;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
3083bcc98af19597a213a8d174e8f1b47453d513ceMike Lockwoodimport android.provider.Settings;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils;
32b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yehimport android.widget.Toast;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class WifiEnabler implements Preference.OnPreferenceChangeListener {
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private final Context mContext;
36b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    private final CheckBoxPreference mCheckBox;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private final CharSequence mOriginalSummary;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
39b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    private final WifiManager mWifiManager;
40b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    private final IntentFilter mIntentFilter;
41b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
44b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            String action = intent.getAction();
45b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
46b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                handleWifiStateChanged(intent.getIntExtra(
47b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                        WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN));
48b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
49b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                handleNetworkStateChanged((NetworkInfo)
50b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                        intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO));
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
544e14211d21387d645ecdad406f3350d36e5a8643Chia-chi Yeh
55b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    public WifiEnabler(Context context, CheckBoxPreference checkBox) {
564e14211d21387d645ecdad406f3350d36e5a8643Chia-chi Yeh        this(context, (WifiManager) context.getSystemService(Context.WIFI_SERVICE),
57b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                checkBox);
584e14211d21387d645ecdad406f3350d36e5a8643Chia-chi Yeh    }
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public WifiEnabler(Context context, WifiManager wifiManager,
61b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            CheckBoxPreference checkBox) {
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mContext = context;
63b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mCheckBox = checkBox;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mWifiManager = wifiManager;
65b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mOriginalSummary = checkBox.getSummary();
66b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        checkBox.setPersistent(false);
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
68b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
69b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void resume() {
73b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        // Wi-Fi state is sticky, so just let the receiver update UI
74b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mContext.registerReceiver(mReceiver, mIntentFilter);
75b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mCheckBox.setOnPreferenceChangeListener(this);
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void pause() {
79b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mContext.unregisterReceiver(mReceiver);
80b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        mCheckBox.setOnPreferenceChangeListener(null);
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceChange(Preference preference, Object value) {
84b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        boolean enable = (Boolean) value;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
86b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        // Show toast message if Wi-Fi is not allowed in airplane mode
87b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        if (enable && !WirelessSettings
88b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                .isRadioAllowed(mContext, Settings.System.RADIO_WIFI)) {
89b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            Toast.makeText(mContext, R.string.wifi_in_airplane_mode,
90b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                    Toast.LENGTH_SHORT).show();
91b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            return false;
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
94b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        if (mWifiManager.setWifiEnabled(enable)) {
95b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            mCheckBox.setEnabled(false);
96b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        } else {
97b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            mCheckBox.setSummary(R.string.wifi_error);
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
991c4e96864f054f0d3d754d21eb4803fe0df6d89fJeff Sharkey
100b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        // Don't update UI to opposite state until we're sure
101b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        return false;
102b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    }
103b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh
104b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh    private void handleWifiStateChanged(int state) {
105b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh        switch (state) {
106b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            case WifiManager.WIFI_STATE_ENABLING:
107b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setSummary(R.string.wifi_starting);
108b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setEnabled(false);
109b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                break;
110b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            case WifiManager.WIFI_STATE_ENABLED:
111b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setChecked(true);
112b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setSummary(null);
113b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setEnabled(true);
114b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                break;
115b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            case WifiManager.WIFI_STATE_DISABLING:
116b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setSummary(R.string.wifi_stopping);
117b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setEnabled(false);
118b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                break;
119b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            case WifiManager.WIFI_STATE_DISABLED:
120b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setChecked(false);
121b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setSummary(mOriginalSummary);
122b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setEnabled(true);
123b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                break;
124b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            default:
125b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setChecked(false);
126b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setSummary(R.string.wifi_error);
127b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh                mCheckBox.setEnabled(true);
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void handleNetworkStateChanged(NetworkInfo networkInfo) {
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (mWifiManager.isWifiEnabled()) {
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String summary = WifiStatus.getStatus(mContext,
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mWifiManager.getConnectionInfo().getSSID(), networkInfo.getDetailedState());
135b90452f3d26201ea6a231f2150204241e66cd3fbChia-chi Yeh            mCheckBox.setSummary(summary);
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
139