1 /* WifiConfigurationManager.java
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.
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.
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/>.
16 package de.dhbwloe.campusapp.wifi;
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;
28 import java.io.IOException;
29 import java.security.cert.CertificateException;
30 import java.util.List;
32 import de.dhbwloe.campusapp.fragments.WifiSettings;
35 * Created by pk910 on 08.02.2016.
37 public class WifiConfigurationManager {
38 public interface WifiConfigurationComplete {
39 public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response);
42 public enum WifiConnectionStatus {
45 WIFISTATE_AUTHENTICATING,
50 private WifiSettings wifiSettingsFragment;
51 private WifiManager wifiManager;
52 private WifiNetworkSettings tryConnectTo;
53 private WifiConnectionStatus currentWifiState;
54 private boolean isLocked = false;
57 public WifiConfigurationManager(WifiManager wifiManager, WifiSettings fragment) {
58 this.wifiManager = wifiManager;
59 this.wifiSettingsFragment = fragment;
62 public void connect(WifiNetworkSettings settings) {
63 if (Build.VERSION.SDK_INT >= 18) {
64 connectToWiFi(settings);
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);
73 if(tryConnectTo == null)
76 boolean processedWifiState = true;
79 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTING;
82 currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
85 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
88 if(previousWifiState != WifiConnectionStatus.WIFISTATE_CONNECTED)
89 currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
91 currentWifiState = WifiConnectionStatus.WIFISTATE_NULL;
94 processedWifiState = false;
97 Log.i("WiFiConf", "Handled: "+wifiState.name());
98 if(!processedWifiState || (ssid != null && !ssid.equalsIgnoreCase(tryConnectTo.getSSID()))) {
99 currentWifiState = previousWifiState;
103 SecureLoginManager loginManager;
104 if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED && (loginManager = tryConnectTo.getSecureLoginManager()) != null) {
105 currentWifiState = WifiConnectionStatus.WIFISTATE_AUTHENTICATING;
107 SecureLoginTask logintask = new SecureLoginTask();
108 logintask.loginCallback = new SecureLoginManager.SecureLoginResult() {
110 public void onSecureLoginFailed(String errMsg) {
111 currentWifiState = WifiConnectionStatus.WIFISTATE_FAILED;
114 wifiSettingsFragment.updateWifiState();
117 public void onSecureLoginSuccess() {
118 currentWifiState = WifiConnectionStatus.WIFISTATE_CONNECTED;
121 wifiSettingsFragment.updateWifiState();
124 logintask.settings = tryConnectTo;
126 loginManager.execute(logintask);
129 if(currentWifiState == WifiConnectionStatus.WIFISTATE_CONNECTED || currentWifiState == WifiConnectionStatus.WIFISTATE_FAILED) {
134 public WifiConnectionStatus getWifiState(WifiNetworkSettings settings) {
135 if(settings == tryConnectTo)
136 return currentWifiState;
137 return WifiConnectionStatus.WIFISTATE_NULL;
141 private void connectToWiFi(WifiNetworkSettings settings) {
144 tryConnectTo = settings;
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]);
152 switch(settings.authType) {
153 case WIFI_AUTHTYPE_NONE:
155 case WIFI_AUTHTYPE_WEP:
156 // not supported by our app
158 case WIFI_AUTHTYPE_WPA:
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);
171 enterpriseConfig.setCaCertificate(settings.generateCertificate());
172 } catch (CertificateException e) {
173 } catch (IOException e) {
175 wifiConfig.enterpriseConfig = enterpriseConfig;
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);
188 int networkId = wifiManager.addNetwork(wifiConfig);
189 wifiManager.enableNetwork(networkId, true);
191 wifiManager.saveConfiguration();
194 public boolean isLocked(WifiNetworkSettings settings) {
195 return isLocked && (tryConnectTo == settings);