package eu.hgross.blaubot.android.wifi;
import java.lang.reflect.Method;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.util.Log;
public class WifiApUtil {
private static final String LOG_TAG = "WifiApUtil";
private static Method getWifiApState;
private static Method isWifiApEnabled;
private static Method setWifiApEnabled;
private static Method getWifiApConfiguration;
public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";
public static final int WIFI_AP_STATE_DISABLED = WifiManager.WIFI_STATE_DISABLED;
public static final int WIFI_AP_STATE_DISABLING = WifiManager.WIFI_STATE_DISABLING;
public static final int WIFI_AP_STATE_ENABLED = WifiManager.WIFI_STATE_ENABLED;
public static final int WIFI_AP_STATE_ENABLING = WifiManager.WIFI_STATE_ENABLING;
public static final int WIFI_AP_STATE_FAILED = WifiManager.WIFI_STATE_UNKNOWN;
public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = WifiManager.EXTRA_PREVIOUS_WIFI_STATE;
public static final String EXTRA_WIFI_AP_STATE = WifiManager.EXTRA_WIFI_STATE;
static {
// lookup methods and fields not defined publicly in the SDK.
Class<?> cls = WifiManager.class;
for (Method method : cls.getDeclaredMethods()) {
String methodName = method.getName();
if (methodName.equals("getWifiApState")) {
getWifiApState = method;
} else if (methodName.equals("isWifiApEnabled")) {
isWifiApEnabled = method;
} else if (methodName.equals("setWifiApEnabled")) {
setWifiApEnabled = method;
} else if (methodName.equals("getWifiApConfiguration")) {
getWifiApConfiguration = method;
}
}
}
public static boolean isApSupported() {
return (getWifiApState != null && isWifiApEnabled != null
&& setWifiApEnabled != null && getWifiApConfiguration != null);
}
private WifiManager mgr;
private WifiApUtil(WifiManager mgr) {
this.mgr = mgr;
}
/**
*
* @param mgr android's wifi manager service
* @return instance or null, if ap mode is not supported
*/
public static WifiApUtil createInstance(WifiManager mgr) {
if (!isApSupported())
return null;
return new WifiApUtil(mgr);
}
public boolean isWifiApEnabled() {
try {
return (Boolean) isWifiApEnabled.invoke(mgr);
} catch (Exception e) {
Log.v(LOG_TAG, e.toString(), e); // shouldn't happen
return false;
}
}
public int getWifiApState() {
try {
return (Integer) getWifiApState.invoke(mgr);
} catch (Exception e) {
Log.v(LOG_TAG, e.toString(), e); // shouldn't happen
return -1;
}
}
public WifiConfiguration getWifiApConfiguration() {
try {
return (WifiConfiguration) getWifiApConfiguration.invoke(mgr);
} catch (Exception e) {
Log.v(LOG_TAG, e.toString(), e); // shouldn't happen
return null;
}
}
public boolean setWifiApEnabled(WifiConfiguration config, boolean enabled) {
try {
return (Boolean) setWifiApEnabled.invoke(mgr, config, enabled);
} catch (Exception e) {
Log.v(LOG_TAG, e.toString(), e); // shouldn't happen
return false;
}
}
private static final String[] WIFI_STATE_TEXTSTATE = new String[] {
"DISABLING","DISABLED","ENABLING","ENABLED","FAILED"
};
/**
* @param wifiState wifi state code
* @return human readable string for the wifiState constant
*/
public static String getTextForWifiState(int wifiState) {
if(WIFI_STATE_TEXTSTATE.length > wifiState || wifiState < 0) {
return "Unknown (" + wifiState + ")";
}
return WIFI_STATE_TEXTSTATE[wifiState];
}
/**
* Gets the wifi state code state.
* For human readable representations use getTextForWifiState(int)
* @return the wifi state
*/
public int getWifiAPState() {
int state = -1;
try {
Method method2 = mgr.getClass().getMethod("getWifiApState");
state = (Integer) method2.invoke(mgr);
} catch (Exception e) {}
Log.d(LOG_TAG, "getWifiAPState.state: " + getTextForWifiState(state));
return state;
}
}