import android.annotation.TargetApi;
import android.net.NetworkInfo;
+import android.net.wifi.SupplicantState;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
+import android.util.Log;
import java.io.IOException;
import java.security.cert.CertificateException;
+import java.util.List;
+
+import de.dhbwloe.campusapp.fragments.WifiSettings;
/**
* Created by pk910 on 08.02.2016.
public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response);
}
+ public enum WifiConnectionStatus {
+ WIFISTATE_NULL,
+ WIFISTATE_CONNECTING,
+ WIFISTATE_AUTHENTICATING,
+ WIFISTATE_CONNECTED,
+ WIFISTATE_FAILED
+ }
+
+ private WifiSettings wifiSettingsFragment;
private WifiManager wifiManager;
+ private WifiNetworkSettings tryConnectTo;
+ private WifiConnectionStatus currentWifiState;
+ private boolean isLocked = false;
- public WifiConfigurationManager(WifiManager wifiManager) {
+
+ public WifiConfigurationManager(WifiManager wifiManager, WifiSettings fragment) {
this.wifiManager = wifiManager;
+ this.wifiSettingsFragment = fragment;
}
public void connect(WifiNetworkSettings settings) {
}
}
+ public void updateWifiState(WifiInfo wifiInfo, SupplicantState wifiState) {
+ WifiConnectionStatus previousWifiState = currentWifiState;
+ currentWifiState = WifiConnectionStatus.WIFISTATE_NULL;
+ String ssid = wifiSettingsFragment.trimWifiSSID(wifiInfo != null ? wifiInfo.getSSID() : null);
+
+ if(tryConnectTo == null)
+ return;
+
+ boolean processedWifiState = true;
+ switch (wifiState) {
+ case ASSOCIATING:
+ currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTING;
+ break;
+ case ASSOCIATED:
+ currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
+ break;
+ case COMPLETED:
+ currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
+ break;
+ case DISCONNECTED:
+ if(previousWifiState != WifiConnectionStatus.WIFISTATE_CONNECTED)
+ currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
+ else
+ currentWifiState = WifiConnectionStatus.WIFISTATE_NULL;
+ break;
+ default:
+ processedWifiState = false;
+ break;
+ }
+ Log.i("WiFiConf", "Handled: "+wifiState.name());
+ if(!processedWifiState || (ssid != null && !ssid.equalsIgnoreCase(tryConnectTo.getSSID()))) {
+ currentWifiState = previousWifiState;
+ return;
+ }
+
+ SecureLoginManager loginManager;
+ if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED && (loginManager = tryConnectTo.getSecureLoginManager()) != null) {
+ currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
+
+ SecureLoginTask logintask = new SecureLoginTask();
+ logintask.loginCallback = new SecureLoginManager.SecureLoginResult() {
+ @Override
+ public void onSecureLoginFailed(String errMsg) {
+ currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
+ isLocked = false;
+
+ wifiSettingsFragment.updateWifiState();
+ }
+ @Override
+ public void onSecureLoginSuccess() {
+ currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
+ isLocked = false;
+
+ wifiSettingsFragment.updateWifiState();
+ }
+ };
+ logintask.settings = tryConnectTo;
+
+ loginManager.execute(logintask);
+ }
+
+ if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED || currentWifiState == WifiConnectionStatus.WIFISTATE_FAILED) {
+ isLocked = false;
+ }
+ }
+
+ public WifiConnectionStatus getWifiState(WifiNetworkSettings settings) {
+ if(settings == tryConnectTo)
+ return currentWifiState;
+ return WifiConnectionStatus.WIFISTATE_NULL;
+ }
@TargetApi(18)
private void connectToWiFi(WifiNetworkSettings settings) {
+ if(isLocked)
+ return;
+ tryConnectTo = settings;
+ isLocked = true;
+
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = settings.ssid;
for(int i = 0; i < settings.authAlgorithms.length; i++)
wifiConfig.enterpriseConfig = enterpriseConfig;
break;
}
+
+ // remove old configurations for this network
+ List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
+ for(WifiConfiguration k : list) {
+ if(k.SSID.equalsIgnoreCase(wifiConfig.SSID)) {
+ int networkId = wifiManager.getConnectionInfo().getNetworkId();
+ wifiManager.removeNetwork(networkId);
+ }
+ }
+
int networkId = wifiManager.addNetwork(wifiConfig);
wifiManager.enableNetwork(networkId, true);
+
+ wifiManager.saveConfiguration();
+ }
+
+ public boolean isLocked(WifiNetworkSettings settings) {
+ return isLocked && (tryConnectTo == settings);
}
}