Added README.txt and GPL Header to Source Files
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / wifi / WifiConfigurationManager.java
1 /* WifiConfigurationManager.java
2  *
3  * This program is free software: you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation, either version 3 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 package de.dhbwloe.campusapp.wifi;
17
18 import android.annotation.TargetApi;
19 import android.net.NetworkInfo;
20 import android.net.wifi.SupplicantState;
21 import android.net.wifi.WifiConfiguration;
22 import android.net.wifi.WifiEnterpriseConfig;
23 import android.net.wifi.WifiInfo;
24 import android.net.wifi.WifiManager;
25 import android.os.Build;
26 import android.util.Log;
27
28 import java.io.IOException;
29 import java.security.cert.CertificateException;
30 import java.util.List;
31
32 import de.dhbwloe.campusapp.fragments.WifiSettings;
33
34 /**
35  * Created by pk910 on 08.02.2016.
36  */
37 public class WifiConfigurationManager {
38     public interface WifiConfigurationComplete {
39         public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response);
40     }
41
42     public enum WifiConnectionStatus {
43         WIFISTATE_NULL,
44         WIFISTATE_CONNECTING,
45         WIFISTATE_AUTHENTICATING,
46         WIFISTATE_CONNECTED,
47         WIFISTATE_FAILED
48     }
49
50     private WifiSettings wifiSettingsFragment;
51     private WifiManager wifiManager;
52     private WifiNetworkSettings tryConnectTo;
53     private WifiConnectionStatus currentWifiState;
54     private boolean isLocked = false;
55
56
57     public WifiConfigurationManager(WifiManager wifiManager, WifiSettings fragment) {
58         this.wifiManager = wifiManager;
59         this.wifiSettingsFragment = fragment;
60     }
61
62     public void connect(WifiNetworkSettings settings) {
63         if (Build.VERSION.SDK_INT >= 18) {
64             connectToWiFi(settings);
65         }
66     }
67
68     public void updateWifiState(WifiInfo wifiInfo, SupplicantState wifiState) {
69         WifiConnectionStatus previousWifiState = currentWifiState;
70         currentWifiState = WifiConnectionStatus.WIFISTATE_NULL;
71         String ssid = wifiSettingsFragment.trimWifiSSID(wifiInfo != null ? wifiInfo.getSSID() : null);
72
73         if(tryConnectTo == null)
74             return;
75
76         boolean processedWifiState = true;
77         switch (wifiState) {
78             case ASSOCIATING:
79                 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTING;
80                 break;
81             case ASSOCIATED:
82                 currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
83                 break;
84             case COMPLETED:
85                 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
86                 break;
87             case DISCONNECTED:
88                 if(previousWifiState != WifiConnectionStatus.WIFISTATE_CONNECTED)
89                     currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
90                 else
91                     currentWifiState = WifiConnectionStatus.WIFISTATE_NULL;
92                 break;
93             default:
94                 processedWifiState = false;
95                 break;
96         }
97         Log.i("WiFiConf", "Handled: "+wifiState.name());
98         if(!processedWifiState || (ssid != null && !ssid.equalsIgnoreCase(tryConnectTo.getSSID()))) {
99             currentWifiState = previousWifiState;
100             return;
101         }
102
103         SecureLoginManager loginManager;
104         if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED && (loginManager = tryConnectTo.getSecureLoginManager()) != null)  {
105             currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
106
107             SecureLoginTask logintask = new SecureLoginTask();
108             logintask.loginCallback = new SecureLoginManager.SecureLoginResult() {
109                 @Override
110                 public void onSecureLoginFailed(String errMsg) {
111                     currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
112                     isLocked = false;
113
114                     wifiSettingsFragment.updateWifiState();
115                 }
116                 @Override
117                 public void onSecureLoginSuccess() {
118                     currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
119                     isLocked = false;
120
121                     wifiSettingsFragment.updateWifiState();
122                 }
123             };
124             logintask.settings = tryConnectTo;
125
126             loginManager.execute(logintask);
127         }
128
129         if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED || currentWifiState == WifiConnectionStatus.WIFISTATE_FAILED) {
130             isLocked = false;
131         }
132     }
133
134     public WifiConnectionStatus getWifiState(WifiNetworkSettings settings) {
135         if(settings == tryConnectTo)
136             return currentWifiState;
137         return WifiConnectionStatus.WIFISTATE_NULL;
138     }
139
140     @TargetApi(18)
141     private void connectToWiFi(WifiNetworkSettings settings) {
142         if(isLocked)
143             return;
144         tryConnectTo = settings;
145         isLocked = true;
146
147         WifiConfiguration wifiConfig = new WifiConfiguration();
148         wifiConfig.SSID = settings.ssid;
149         for(int i = 0; i < settings.authAlgorithms.length; i++)
150             wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]);
151
152         switch(settings.authType) {
153             case WIFI_AUTHTYPE_NONE:
154                 break;
155             case WIFI_AUTHTYPE_WEP:
156                 // not supported by our app
157                 break;
158             case WIFI_AUTHTYPE_WPA:
159
160                 break;
161             case WIFI_AUTHTYPE_WPA_ENTERPRISE:
162                 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
163                 String username = settings.username;
164                 if(settings.usernameSuffix != null)
165                     username += settings.usernameSuffix;
166                 enterpriseConfig.setIdentity(username);
167                 enterpriseConfig.setPassword(settings.password);
168                 enterpriseConfig.setEapMethod(settings.eapMethod);
169                 enterpriseConfig.setPhase2Method(settings.phase2Method);
170                 try {
171                     enterpriseConfig.setCaCertificate(settings.generateCertificate());
172                 } catch (CertificateException e) {
173                 } catch (IOException e) {
174                 }
175                 wifiConfig.enterpriseConfig = enterpriseConfig;
176                 break;
177         }
178
179         // remove old configurations for this network
180         List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
181         for(WifiConfiguration k : list) {
182             if(k.SSID.equalsIgnoreCase(wifiConfig.SSID)) {
183                 int networkId = wifiManager.getConnectionInfo().getNetworkId();
184                 wifiManager.removeNetwork(networkId);
185             }
186         }
187
188         int networkId = wifiManager.addNetwork(wifiConfig);
189         wifiManager.enableNetwork(networkId, true);
190
191         wifiManager.saveConfiguration();
192     }
193
194     public boolean isLocked(WifiNetworkSettings settings) {
195         return isLocked && (tryConnectTo == settings);
196     }
197
198 }