1 package de.dhbwloe.campusapp.wifi;
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;
13 import java.io.IOException;
14 import java.security.cert.CertificateException;
15 import java.util.List;
17 import de.dhbwloe.campusapp.fragments.WifiSettings;
20 * Created by pk910 on 08.02.2016.
22 public class WifiConfigurationManager {
23 public interface WifiConfigurationComplete {
24 public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response);
27 public enum WifiConnectionStatus {
30 WIFISTATE_AUTHENTICATING,
35 private WifiSettings wifiSettingsFragment;
36 private WifiManager wifiManager;
37 private WifiNetworkSettings tryConnectTo;
38 private WifiConnectionStatus currentWifiState;
39 private boolean isLocked = false;
42 public WifiConfigurationManager(WifiManager wifiManager, WifiSettings fragment) {
43 this.wifiManager = wifiManager;
44 this.wifiSettingsFragment = fragment;
47 public void connect(WifiNetworkSettings settings) {
48 if (Build.VERSION.SDK_INT >= 18) {
49 connectToWiFi(settings);
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);
58 if(tryConnectTo == null)
61 boolean processedWifiState = true;
64 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTING;
67 currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
70 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
73 if(previousWifiState != WifiConnectionStatus.WIFISTATE_CONNECTED)
74 currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
76 currentWifiState = WifiConnectionStatus.WIFISTATE_NULL;
79 processedWifiState = false;
82 Log.i("WiFiConf", "Handled: "+wifiState.name());
83 if(!processedWifiState || (ssid != null && !ssid.equalsIgnoreCase(tryConnectTo.getSSID()))) {
84 currentWifiState = previousWifiState;
88 SecureLoginManager loginManager;
89 if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED && (loginManager = tryConnectTo.getSecureLoginManager()) != null) {
90 currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
92 SecureLoginTask logintask = new SecureLoginTask();
93 logintask.loginCallback = new SecureLoginManager.SecureLoginResult() {
95 public void onSecureLoginFailed(String errMsg) {
96 currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
99 wifiSettingsFragment.updateWifiState();
102 public void onSecureLoginSuccess() {
103 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
106 wifiSettingsFragment.updateWifiState();
109 logintask.settings = tryConnectTo;
111 loginManager.execute(logintask);
114 if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED || currentWifiState == WifiConnectionStatus.WIFISTATE_FAILED) {
119 public WifiConnectionStatus getWifiState(WifiNetworkSettings settings) {
120 if(settings == tryConnectTo)
121 return currentWifiState;
122 return WifiConnectionStatus.WIFISTATE_NULL;
126 private void connectToWiFi(WifiNetworkSettings settings) {
129 tryConnectTo = settings;
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]);
137 switch(settings.authType) {
138 case WIFI_AUTHTYPE_NONE:
140 case WIFI_AUTHTYPE_WEP:
141 // not supported by our app
143 case WIFI_AUTHTYPE_WPA:
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);
156 enterpriseConfig.setCaCertificate(settings.generateCertificate());
157 } catch (CertificateException e) {
158 } catch (IOException e) {
160 wifiConfig.enterpriseConfig = enterpriseConfig;
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);
173 int networkId = wifiManager.addNetwork(wifiConfig);
174 wifiManager.enableNetwork(networkId, true);
176 wifiManager.saveConfiguration();
179 public boolean isLocked(WifiNetworkSettings settings) {
180 return isLocked && (tryConnectTo == settings);