X-Git-Url: http://git.pk910.de/?p=DHBWCampusApp.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fde%2Fdhbwloe%2Fcampusapp%2Fwifi%2FWifiConfigurationManager.java;h=7554c324955ed7b00b3364d02f8e3dc42b441837;hp=a58f128340cbcfb53ff1c4d807e802626b65a0b5;hb=8e51b33658d14e953b211fbfbc6255d72ba48fbc;hpb=5b19adec4e1c709d0166b6a10319ba807d1e4b8b diff --git a/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiConfigurationManager.java b/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiConfigurationManager.java index a58f128..7554c32 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiConfigurationManager.java +++ b/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiConfigurationManager.java @@ -2,14 +2,19 @@ package de.dhbwloe.campusapp.wifi; 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. @@ -19,10 +24,24 @@ public class WifiConfigurationManager { 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) { @@ -31,9 +50,85 @@ public class WifiConfigurationManager { } } + 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++) @@ -65,8 +160,24 @@ public class WifiConfigurationManager { wifiConfig.enterpriseConfig = enterpriseConfig; break; } + + // remove old configurations for this network + List 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); } }