WifiSettings überarbeitet, kleine fixes
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / wifi / WifiConfigurationManager.java
1 package de.dhbwloe.campusapp.wifi;
2
3 import android.annotation.TargetApi;
4 import android.net.NetworkInfo;
5 import android.net.wifi.SupplicantState;
6 import android.net.wifi.WifiConfiguration;
7 import android.net.wifi.WifiEnterpriseConfig;
8 import android.net.wifi.WifiInfo;
9 import android.net.wifi.WifiManager;
10 import android.os.Build;
11 import android.util.Log;
12
13 import java.io.IOException;
14 import java.security.cert.CertificateException;
15 import java.util.List;
16
17 import de.dhbwloe.campusapp.fragments.WifiSettings;
18
19 /**
20  * Created by pk910 on 08.02.2016.
21  */
22 public class WifiConfigurationManager {
23     public interface WifiConfigurationComplete {
24         public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response);
25     }
26
27     public enum WifiConnectionStatus {
28         WIFISTATE_NULL,
29         WIFISTATE_CONNECTING,
30         WIFISTATE_AUTHENTICATING,
31         WIFISTATE_CONNECTED,
32         WIFISTATE_FAILED
33     }
34
35     private WifiSettings wifiSettingsFragment;
36     private WifiManager wifiManager;
37     private WifiNetworkSettings tryConnectTo;
38     private WifiConnectionStatus currentWifiState;
39     private boolean isLocked = false;
40
41
42     public WifiConfigurationManager(WifiManager wifiManager, WifiSettings fragment) {
43         this.wifiManager = wifiManager;
44         this.wifiSettingsFragment = fragment;
45     }
46
47     public void connect(WifiNetworkSettings settings) {
48         if (Build.VERSION.SDK_INT >= 18) {
49             connectToWiFi(settings);
50         }
51     }
52
53     public void updateWifiState(WifiInfo wifiInfo, SupplicantState wifiState) {
54         WifiConnectionStatus previousWifiState = currentWifiState;
55         currentWifiState = WifiConnectionStatus.WIFISTATE_NULL;
56         String ssid = wifiSettingsFragment.trimWifiSSID(wifiInfo != null ? wifiInfo.getSSID() : null);
57
58         if(tryConnectTo == null)
59             return;
60
61         boolean processedWifiState = true;
62         switch (wifiState) {
63             case ASSOCIATING:
64                 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTING;
65                 break;
66             case ASSOCIATED:
67                 currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
68                 break;
69             case COMPLETED:
70                 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
71                 break;
72             case DISCONNECTED:
73                 if(previousWifiState != WifiConnectionStatus.WIFISTATE_CONNECTED)
74                     currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
75                 else
76                     currentWifiState = WifiConnectionStatus.WIFISTATE_NULL;
77                 break;
78             default:
79                 processedWifiState = false;
80                 break;
81         }
82         Log.i("WiFiConf", "Handled: "+wifiState.name());
83         if(!processedWifiState || (ssid != null && !ssid.equalsIgnoreCase(tryConnectTo.getSSID()))) {
84             currentWifiState = previousWifiState;
85             return;
86         }
87
88         SecureLoginManager loginManager;
89         if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED && (loginManager = tryConnectTo.getSecureLoginManager()) != null)  {
90             currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
91
92             SecureLoginTask logintask = new SecureLoginTask();
93             logintask.loginCallback = new SecureLoginManager.SecureLoginResult() {
94                 @Override
95                 public void onSecureLoginFailed(String errMsg) {
96                     currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
97                     isLocked = false;
98
99                     wifiSettingsFragment.updateWifiState();
100                 }
101                 @Override
102                 public void onSecureLoginSuccess() {
103                     currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
104                     isLocked = false;
105
106                     wifiSettingsFragment.updateWifiState();
107                 }
108             };
109             logintask.settings = tryConnectTo;
110
111             loginManager.execute(logintask);
112         }
113
114         if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED || currentWifiState == WifiConnectionStatus.WIFISTATE_FAILED) {
115             isLocked = false;
116         }
117     }
118
119     public WifiConnectionStatus getWifiState(WifiNetworkSettings settings) {
120         if(settings == tryConnectTo)
121             return currentWifiState;
122         return WifiConnectionStatus.WIFISTATE_NULL;
123     }
124
125     @TargetApi(18)
126     private void connectToWiFi(WifiNetworkSettings settings) {
127         if(isLocked)
128             return;
129         tryConnectTo = settings;
130         isLocked = true;
131
132         WifiConfiguration wifiConfig = new WifiConfiguration();
133         wifiConfig.SSID = settings.ssid;
134         for(int i = 0; i < settings.authAlgorithms.length; i++)
135             wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]);
136
137         switch(settings.authType) {
138             case WIFI_AUTHTYPE_NONE:
139                 break;
140             case WIFI_AUTHTYPE_WEP:
141                 // not supported by our app
142                 break;
143             case WIFI_AUTHTYPE_WPA:
144
145                 break;
146             case WIFI_AUTHTYPE_WPA_ENTERPRISE:
147                 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
148                 String username = settings.username;
149                 if(settings.usernameSuffix != null)
150                     username += settings.usernameSuffix;
151                 enterpriseConfig.setIdentity(username);
152                 enterpriseConfig.setPassword(settings.password);
153                 enterpriseConfig.setEapMethod(settings.eapMethod);
154                 enterpriseConfig.setPhase2Method(settings.phase2Method);
155                 try {
156                     enterpriseConfig.setCaCertificate(settings.generateCertificate());
157                 } catch (CertificateException e) {
158                 } catch (IOException e) {
159                 }
160                 wifiConfig.enterpriseConfig = enterpriseConfig;
161                 break;
162         }
163
164         // remove old configurations for this network
165         List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
166         for(WifiConfiguration k : list) {
167             if(k.SSID.equalsIgnoreCase(wifiConfig.SSID)) {
168                 int networkId = wifiManager.getConnectionInfo().getNetworkId();
169                 wifiManager.removeNetwork(networkId);
170             }
171         }
172
173         int networkId = wifiManager.addNetwork(wifiConfig);
174         wifiManager.enableNetwork(networkId, true);
175
176         wifiManager.saveConfiguration();
177     }
178
179     public boolean isLocked(WifiNetworkSettings settings) {
180         return isLocked && (tryConnectTo == settings);
181     }
182
183 }