package com.bwx.bequick.handlers; import java.lang.reflect.Method; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.provider.Settings; import android.util.Log; import com.bwx.bequick.Constants; import com.bwx.bequick.MainSettingsActivity; import com.bwx.bequick.R; import com.bwx.bequick.fwk.Setting; import com.bwx.bequick.fwk.SettingHandler; public class WifiHotspotSettingHandler extends SettingHandler { static final String TAG = "qs.wifihs"; public static class WifiApManager { public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED"; public static final String EXTRA_WIFI_AP_STATE = "wifi_state"; public static final int WIFI_AP_STATE_DISABLING = 0; public static final int WIFI_AP_STATE_DISABLED = 1; public static final int WIFI_AP_STATE_ENABLING = 2; public static final int WIFI_AP_STATE_ENABLED = 3; public static final int WIFI_AP_STATE_FAILED = 4; private final WifiManager mWifiManager; public WifiApManager(Context context) { mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); } public boolean setWifiApEnabled(boolean enabled) { if (Constants.DEBUG) { Log.d(TAG, "setWifiApEnabled(" + enabled + ")"); } if (enabled) { // disable WiFi in any case mWifiManager.setWifiEnabled(false); } try { // TODO comment from here /* Method getWifiApConfigurationMethod = mWifiManager.getClass().getMethod("getWifiApConfiguration"); Object config = getWifiApConfigurationMethod.invoke(mWifiManager); */ // configuration = null works for many devices Method setWifiApEnabledMethod = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); return (Boolean) setWifiApEnabledMethod.invoke(mWifiManager, null, enabled); } catch (Exception e) { Log.e(TAG, "", e); return false; } } public int getWifiApState() { try { Method method = mWifiManager.getClass().getMethod("getWifiApState"); return (Integer) method.invoke(mWifiManager); } catch (Exception e) { Log.e(TAG, "", e); return WIFI_AP_STATE_FAILED; } } } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (WifiApManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) { int state = intent.getIntExtra(WifiApManager.EXTRA_WIFI_AP_STATE, WifiApManager.WIFI_AP_STATE_FAILED); updateState(state); } } }; private final IntentFilter mIntentFilter; private WifiApManager mWifiApManager; public WifiHotspotSettingHandler(Setting setting) { super(setting); mIntentFilter = new IntentFilter(WifiApManager.WIFI_AP_STATE_CHANGED_ACTION); } @Override public void activate(MainSettingsActivity activity) throws Exception { mActivity = activity; mWifiApManager = new WifiApManager(activity); updateState(mWifiApManager.getWifiApState()); activity.registerReceiver(mReceiver, mIntentFilter); } /* private static String[] getStrings(Object obj, String methodName) throws Exception { Method method = obj.getClass().getMethod(methodName); return (String[]) method.invoke(obj); } */ @Override public void deactivate() { mActivity.unregisterReceiver(mReceiver); } @Override public void onSelected(int buttonIndex) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.setClassName("com.android.settings", "com.android.settings.wifi.WifiApSettings"); mActivity.startActivitiesSafely(intent, new Intent(Settings.ACTION_WIRELESS_SETTINGS), new Intent(Settings.ACTION_WIFI_SETTINGS)); } @Override public void onSwitched(boolean switched) { if (mWifiApManager.setWifiApEnabled(switched)) { updateState(switched ? WifiApManager.WIFI_AP_STATE_ENABLING : WifiApManager.WIFI_AP_STATE_DISABLING); } else { Log.e(TAG, "cannot " + (switched ? "enable" : "disable") + " wifi hotspot"); } } @Override public void onValueChanged(int value) { // do nothing } private void updateState(int wifiApState) { boolean enabled = false, checked = false; int stateTextId = R.string.txt_status_unknown; switch (wifiApState) { case WifiApManager.WIFI_AP_STATE_DISABLING: { enabled = false; checked = true; stateTextId = R.string.txt_status_turning_off; break; } case WifiApManager.WIFI_AP_STATE_DISABLED: { enabled = true; checked = false; stateTextId = R.string.txt_status_turned_off; break; } case WifiApManager.WIFI_AP_STATE_ENABLING: { enabled = false; checked = false; stateTextId = R.string.txt_status_turning_on; break; } case WifiApManager.WIFI_AP_STATE_ENABLED: { enabled = true; checked = true; stateTextId = R.string.txt_status_turned_on; break; } case WifiApManager.WIFI_AP_STATE_FAILED: { enabled = true; checked = false; stateTextId = R.string.txt_net_status_failed; break; } } Setting s = mSetting; s.checked = checked; s.enabled = enabled; s.descr = mActivity.getString(stateTextId); s.updateView(); } }