/* * Copyright (C) 2010 beworx.com * * 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.bwx.bequick.handlers; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.wifi.WifiManager; import android.os.Build; import android.provider.Settings; import com.bwx.bequick.MainSettingsActivity; import com.bwx.bequick.R; import com.bwx.bequick.fwk.Setting; import com.bwx.bequick.fwk.SettingHandler; import com.bwx.bequick.handlers.WifiHotspotSettingHandler.WifiApManager; public class WiFiSettingHandler extends SettingHandler { private static final int STATE_INPROCESS = 0; private static final int STATE_DONE = 1; /** * WiFi status listener dynamically registered at start up * * @author sergej@beworx.com */ class WiFiStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent == null) return; if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) { int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN); updateWiFiState(wifiState); } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) { NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); DetailedState state = info.getDetailedState(); String descr = null; switch (state) { case CONNECTING: descr = mActivity.getString(R.string.txt_net_status_connecting); break; case OBTAINING_IPADDR: descr = mActivity.getString(R.string.txt_net_status_obtainingip); break; case CONNECTED: // String name = // intent.getStringExtra(WifiManager.EXTRA_BSSID); String name = getWiFiManager().getConnectionInfo().getSSID(); descr = mActivity.getString(R.string.txt_net_status_connected_to, name); break; case FAILED: descr = mActivity.getString(R.string.txt_net_status_failed); break; case DISCONNECTING: descr = mActivity.getString(R.string.txt_net_status_disconnecting); break; case DISCONNECTED: descr = mActivity.getString(R.string.txt_net_status_disconnected); break; } if (descr != null) { mSetting.descr = descr; // update description mSetting.updateView(); } } } } private WiFiStateReceiver mWifiStateReceiver; private WifiManager mWiFiManager; private int mActionState = STATE_DONE; private IntentFilter mFilter; public WiFiSettingHandler(Setting setting) { super(setting); } @Override public void onSwitched(boolean checked) { // disable hotspot if it was enabled (important for android 2.2) if (checked && Integer.parseInt(Build.VERSION.SDK) >= 8) { WifiApManager wifiApManager = new WifiApManager(mActivity); int state = wifiApManager.getWifiApState(); if (state == WifiApManager.WIFI_AP_STATE_ENABLED || state == WifiApManager.WIFI_AP_STATE_ENABLING) { wifiApManager.setWifiApEnabled(false); } } getWiFiManager().setWifiEnabled(checked); updateWiFiState(checked ? WifiManager.WIFI_STATE_ENABLING : WifiManager.WIFI_STATE_DISABLING); } private WifiManager getWiFiManager() { if (mWiFiManager == null) mWiFiManager = (WifiManager) mActivity.getSystemService(Context.WIFI_SERVICE); return mWiFiManager; } @Override public void onSelected(int buttonIndex) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.setClassName("com.android.settings", "com.android.settings.wifi.WifiSettings"); mActivity.startActivitiesSafely(intent, new Intent(Settings.ACTION_WIRELESS_SETTINGS), new Intent( Settings.ACTION_WIFI_SETTINGS)); } @Override public void activate(MainSettingsActivity activity) { mActivity = activity; // update state updateWiFiState(getWiFiManager().getWifiState()); // register wifi event receiver IntentFilter filter = mFilter; WiFiStateReceiver receiver = mWifiStateReceiver; if (receiver == null) { receiver = new WiFiStateReceiver(); mWifiStateReceiver = receiver; filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); mFilter = filter; } activity.registerReceiver(receiver, filter); } private void updateWiFiState(int wifiState) { int state; int actionState; switch (wifiState) { case WifiManager.WIFI_STATE_DISABLING: state = R.string.txt_status_turning_off; actionState = STATE_INPROCESS; break; case WifiManager.WIFI_STATE_DISABLED: state = R.string.txt_status_turned_off; actionState = STATE_DONE; break; case WifiManager.WIFI_STATE_ENABLING: state = R.string.txt_status_turning_on; actionState = STATE_INPROCESS; break; case WifiManager.WIFI_STATE_ENABLED: state = R.string.txt_status_turned_on; actionState = STATE_DONE; break; default: state = R.string.txt_status_unknown; actionState = STATE_DONE; break; } String stateText = mActivity.getString(state); setActionState(actionState); // update description Setting setting = mSetting; setting.descr = stateText; setting.checked = wifiState == WifiManager.WIFI_STATE_ENABLED || wifiState == WifiManager.WIFI_STATE_DISABLING; setting.updateView(); } private void setActionState(int state) { if (mActionState != state) { mActionState = state; mSetting.enabled = state == STATE_DONE; } } @Override public void deactivate() { mActivity.unregisterReceiver(mWifiStateReceiver); } @Override public void onValueChanged(int value) { // do nothing } }