package com.android.settings.widget.buttons; import com.android.settings.R; import com.android.settings.widget.SettingsAppWidgetProvider; import com.android.settings.widget.StateTracker; import com.android.settings.widget.WidgetSettings; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.util.Log; public class WifiButton extends WidgetButton{ static WifiButton ownButton=null; private static final StateTracker sWifiState = new WifiStateTracker(); /** * Subclass of StateTracker to get/set Wifi state. */ private static final class WifiStateTracker extends StateTracker { @Override public int getActualState(Context context) { WifiManager wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); if (wifiManager != null) { return wifiStateToFiveState(wifiManager.getWifiState()); } return SettingsAppWidgetProvider.STATE_UNKNOWN; } @Override protected void requestStateChange(Context context, final boolean desiredState) { final WifiManager wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); if (wifiManager == null) { Log.d(SettingsAppWidgetProvider.TAG, "No wifiManager."); return; } // Actually request the wifi change and persistent // settings write off the UI thread, as it can take a // user-noticeable amount of time, especially if there's // disk contention. new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... args) { /** * Disable tethering if enabling Wifi */ int wifiApState = wifiManager.getWifiApState(); if (desiredState && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) { wifiManager.setWifiApEnabled(null, false); } wifiManager.setWifiEnabled(desiredState); return null; } }.execute(); } @Override public void onActualStateChange(Context context, Intent intent) { if (!WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent .getAction())) { return; } int wifiState = intent .getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1); int widgetState=wifiStateToFiveState(wifiState); setCurrentState(context, widgetState); } /** * Converts WifiManager's state values into our Wifi/Bluetooth-common * state values. */ private static int wifiStateToFiveState(int wifiState) { switch (wifiState) { case WifiManager.WIFI_STATE_DISABLED: return SettingsAppWidgetProvider.STATE_DISABLED; case WifiManager.WIFI_STATE_ENABLED: return SettingsAppWidgetProvider.STATE_ENABLED; case WifiManager.WIFI_STATE_DISABLING: return SettingsAppWidgetProvider.STATE_TURNING_OFF; case WifiManager.WIFI_STATE_ENABLING: return SettingsAppWidgetProvider.STATE_TURNING_ON; default: return SettingsAppWidgetProvider.STATE_UNKNOWN; } } } public void updateState(Context context, SharedPreferences globalPreferences, int[] appWidgetIds) { currentState=sWifiState.getTriState(context); switch (currentState) { case SettingsAppWidgetProvider.STATE_DISABLED: currentIcon=R.drawable.ic_appwidget_settings_wifi_off; break; case SettingsAppWidgetProvider.STATE_ENABLED: currentIcon=R.drawable.ic_appwidget_settings_wifi_on; break; case SettingsAppWidgetProvider.STATE_INTERMEDIATE: // In the transitional state, the bottom green bar // shows the tri-state (on, off, transitioning), but // the top dark-gray-or-bright-white logo shows the // user's intent. This is much easier to see in // sunlight. if (sWifiState.isTurningOn()) { currentIcon=R.drawable.ic_appwidget_settings_wifi_on; } else { currentIcon=R.drawable.ic_appwidget_settings_wifi_off; } break; } } public void onReceive(Context context, Intent intent) { sWifiState.onActualStateChange(context, intent); } public void toggleState(Context context) { int realstate = sWifiState.getActualState(context); sWifiState.toggleState(context); SharedPreferences preferences = context.getSharedPreferences(WidgetSettings.WIDGET_PREF_MAIN, Context.MODE_PRIVATE); if (realstate==SettingsAppWidgetProvider.STATE_DISABLED && preferences.getBoolean(WidgetSettings.AUTO_DISABLE_3G_WITH_WIFI, false)){ NetworkModeButton.getInstance().toggleState(context, SettingsAppWidgetProvider.STATE_DISABLED); } else if (realstate==SettingsAppWidgetProvider.STATE_ENABLED && preferences.getBoolean(WidgetSettings.AUTO_ENABLE_3G_WITH_WIFI, false)){ NetworkModeButton.getInstance().toggleState(context, SettingsAppWidgetProvider.STATE_ENABLED); } if (realstate==SettingsAppWidgetProvider.STATE_DISABLED && preferences.getBoolean(WidgetSettings.AUTO_ENABLE_SYNC_WITH_WIFI, false)){ SyncButton.getInstance().toggleState(context, SettingsAppWidgetProvider.STATE_ENABLED); } else if (realstate==SettingsAppWidgetProvider.STATE_ENABLED && preferences.getBoolean(WidgetSettings.AUTO_DISABLE_SYNC_WITH_WIFI, false)){ SyncButton.getInstance().toggleState(context, SettingsAppWidgetProvider.STATE_DISABLED); } } public static WifiButton getInstance() { if (ownButton==null) { ownButton = new WifiButton(); } return ownButton; } @Override void initButton() { buttonID=WidgetButton.BUTTON_WIFI; preferenceName=WidgetSettings.TOGGLE_WIFI; } public void toggleState(Context context, int newState) { int curState = sWifiState.getTriState(context); if (curState!= SettingsAppWidgetProvider.STATE_INTERMEDIATE && curState!=newState) { toggleState(context); } } }