diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
commit | de2d9f5f109265873196f1615e1f3546b114aaa7 (patch) | |
tree | cd79c0fdeba9e5564571422a549b9a84e4ac43bb /src/com/android/settings/wifi/WifiEnabler.java | |
download | packages_apps_Settings-de2d9f5f109265873196f1615e1f3546b114aaa7.zip packages_apps_Settings-de2d9f5f109265873196f1615e1f3546b114aaa7.tar.gz packages_apps_Settings-de2d9f5f109265873196f1615e1f3546b114aaa7.tar.bz2 |
Initial Contribution
Diffstat (limited to 'src/com/android/settings/wifi/WifiEnabler.java')
-rw-r--r-- | src/com/android/settings/wifi/WifiEnabler.java | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java new file mode 100644 index 0000000..88cfe06 --- /dev/null +++ b/src/com/android/settings/wifi/WifiEnabler.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wifi; + +import static android.net.wifi.WifiManager.WIFI_STATE_DISABLED; +import static android.net.wifi.WifiManager.WIFI_STATE_DISABLING; +import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED; +import static android.net.wifi.WifiManager.WIFI_STATE_ENABLING; +import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN; + +import com.android.settings.R; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.NetworkInfo; +import android.net.wifi.WifiManager; +import android.preference.Preference; +import android.preference.CheckBoxPreference; +import android.text.TextUtils; +import android.util.Config; +import android.util.Log; + +public class WifiEnabler implements Preference.OnPreferenceChangeListener { + + private static final boolean LOCAL_LOGD = Config.LOGD || WifiLayer.LOGV; + private static final String TAG = "SettingsWifiEnabler"; + + private final Context mContext; + private final WifiManager mWifiManager; + private final CheckBoxPreference mWifiCheckBoxPref; + private final CharSequence mOriginalSummary; + + private final IntentFilter mWifiStateFilter; + private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { + + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { + handleWifiStateChanged( + intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WIFI_STATE_UNKNOWN), + intent.getIntExtra(WifiManager.EXTRA_PREVIOUS_WIFI_STATE, + WIFI_STATE_UNKNOWN)); + } else if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { + handleNetworkStateChanged( + (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO)); + } + } + }; + + public WifiEnabler(Context context, WifiManager wifiManager, + CheckBoxPreference wifiCheckBoxPreference) { + mContext = context; + mWifiCheckBoxPref = wifiCheckBoxPreference; + mWifiManager = wifiManager; + + mOriginalSummary = wifiCheckBoxPreference.getSummary(); + wifiCheckBoxPreference.setPersistent(false); + + mWifiStateFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); + mWifiStateFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); + } + + public void resume() { + int state = mWifiManager.getWifiState(); + // This is the widget enabled state, not the preference toggled state + mWifiCheckBoxPref.setEnabled(state == WIFI_STATE_ENABLED || state == WIFI_STATE_DISABLED + || state == WIFI_STATE_UNKNOWN); + + mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter); + mWifiCheckBoxPref.setOnPreferenceChangeListener(this); + } + + public void pause() { + mContext.unregisterReceiver(mWifiStateReceiver); + mWifiCheckBoxPref.setOnPreferenceChangeListener(null); + } + + public boolean onPreferenceChange(Preference preference, Object value) { + // Turn on/off Wi-Fi + setWifiEnabled((Boolean) value); + + // Don't update UI to opposite state until we're sure + return false; + } + + private void setWifiEnabled(final boolean enable) { + // Disable button + mWifiCheckBoxPref.setEnabled(false); + + if (!mWifiManager.setWifiEnabled(enable)) { + mWifiCheckBoxPref.setSummary(enable ? R.string.error_starting : R.string.error_stopping); + } + } + + private void handleWifiStateChanged(int wifiState, int previousWifiState) { + + if (LOCAL_LOGD) { + Log.d(TAG, "Received wifi state changed from " + + getHumanReadableWifiState(previousWifiState) + " to " + + getHumanReadableWifiState(wifiState)); + } + + if (wifiState == WIFI_STATE_DISABLED || wifiState == WIFI_STATE_ENABLED) { + mWifiCheckBoxPref.setChecked(wifiState == WIFI_STATE_ENABLED); + mWifiCheckBoxPref + .setSummary(wifiState == WIFI_STATE_DISABLED ? mOriginalSummary : null); + + mWifiCheckBoxPref.setEnabled(isEnabledByDependency()); + + } else if (wifiState == WIFI_STATE_DISABLING || wifiState == WIFI_STATE_ENABLING) { + mWifiCheckBoxPref.setSummary(wifiState == WIFI_STATE_ENABLING ? R.string.wifi_starting + : R.string.wifi_stopping); + + } else if (wifiState == WIFI_STATE_UNKNOWN) { + int message = R.string.wifi_error; + if (previousWifiState == WIFI_STATE_ENABLING) message = R.string.error_starting; + else if (previousWifiState == WIFI_STATE_DISABLING) message = R.string.error_stopping; + + mWifiCheckBoxPref.setChecked(false); + mWifiCheckBoxPref.setSummary(message); + mWifiCheckBoxPref.setEnabled(true); + } + } + + private void handleNetworkStateChanged(NetworkInfo networkInfo) { + + if (LOCAL_LOGD) { + Log.d(TAG, "Received network state changed to " + networkInfo); + } + + if (mWifiManager.isWifiEnabled()) { + String summary = WifiStatus.getStatus(mContext, + mWifiManager.getConnectionInfo().getSSID(), networkInfo.getDetailedState()); + mWifiCheckBoxPref.setSummary(summary); + } + } + + private boolean isEnabledByDependency() { + Preference dep = getDependencyPreference(); + if (dep == null) { + return true; + } + + return !dep.shouldDisableDependents(); + } + + private Preference getDependencyPreference() { + String depKey = mWifiCheckBoxPref.getDependency(); + if (TextUtils.isEmpty(depKey)) { + return null; + } + + return mWifiCheckBoxPref.getPreferenceManager().findPreference(depKey); + } + + private static String getHumanReadableWifiState(int wifiState) { + switch (wifiState) { + case WIFI_STATE_DISABLED: + return "Disabled"; + case WIFI_STATE_DISABLING: + return "Disabling"; + case WIFI_STATE_ENABLED: + return "Enabled"; + case WIFI_STATE_ENABLING: + return "Enabling"; + case WIFI_STATE_UNKNOWN: + return "Unknown"; + default: + return "Some other state!"; + } + } +} |