WifiSettings überarbeitet, kleine fixes
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / wifi / WifiConfigurationManager.java
index a58f128340cbcfb53ff1c4d807e802626b65a0b5..7554c324955ed7b00b3364d02f8e3dc42b441837 100644 (file)
@@ -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<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);
     }
 
 }