1 package de.dhbwloe.campusapp.fragments;
4 import android.annotation.TargetApi;
5 import android.app.ActionBar;
6 import android.net.wifi.WifiConfiguration;
7 import android.net.wifi.WifiEnterpriseConfig;
8 import android.net.wifi.WifiManager;
9 import android.os.Build;
10 import android.os.Bundle;
11 import android.support.design.widget.TabLayout;
12 import android.support.v4.app.Fragment;
13 import android.util.Base64;
14 import android.view.LayoutInflater;
15 import android.view.View;
16 import android.view.ViewGroup;
17 import android.widget.Button;
18 import android.widget.EditText;
19 import android.widget.TextView;
21 import java.io.ByteArrayInputStream;
22 import java.io.IOException;
23 import java.io.StringReader;
24 import java.lang.reflect.Field;
25 import java.security.cert.CertificateException;
26 import java.security.cert.CertificateFactory;
27 import java.security.cert.X509Certificate;
29 import de.dhbwloe.campusapp.CampusAppFragment;
30 import de.dhbwloe.campusapp.R;
31 import de.dhbwloe.campusapp.search.SearchIndices;
34 * A simple {@link Fragment} subclass.
36 public class WifiSettings extends CampusAppFragment {
37 /* implement this for search results ;) */
38 public static SearchIndices[] GetSearchIndices() {
39 return new SearchIndices[] {
40 new SearchIndices("WifiSettings", true) {{
42 setTarget("#WifiSettings");
43 setTitle("Wifi Settings");
44 setDescription("WLAN Konfiguration für dieses Gerät");
45 addKeyWord("wlan, secure, dhbw-secure, wifi, w-lan, wireless, internet, netzwerk");
50 private enum WifiNetworkAuthenticationTypes {
54 WIFI_AUTHTYPE_WPA_ENTERPRISE,
56 private class WifiNetworkSettingsSet {
59 WifiNetworkAuthenticationTypes authType;
67 String usernameSuffix;
73 public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) {
76 this.authType = authType;
79 public WifiNetworkSettingsSet setWpaEnterprise(int[] authAlgorithms, int eapMethod, int phase2Method, String username) {
80 this.authAlgorithms = authAlgorithms;
81 this.eapMethod = eapMethod;
82 this.phase2Method = phase2Method;
83 this.username = username;
87 public WifiNetworkSettingsSet setPassword(String password) {
88 this.password = password;
92 public WifiNetworkSettingsSet setCACertificate(String caname, String certificate) {
94 this.caCertStr = certificate;
98 public WifiNetworkSettingsSet setUserSuffix(String suffix) {
99 this.usernameSuffix = suffix;
103 public void setAuthData(String username, String password) {
104 this.username = username;
105 this.password = password;
108 public void setAuthData(String password) {
109 this.password = password;
112 public X509Certificate generateCertificate() throws CertificateException, IOException {
113 byte [] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT);
114 return (X509Certificate)CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded));
119 private TabLayout tablayout;
120 private WifiNetworkSettingsSet[] wifiPresets;
121 private WifiManager wifimanager;
122 private int selectedNetworkIndex = 0;
124 private void loadDhbwWifiDefinitions() {
125 int numOfNetworks = 3;
127 wifiPresets = new WifiNetworkSettingsSet[numOfNetworks];
129 wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
131 new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
132 WifiEnterpriseConfig.Eap.PEAP,
133 WifiEnterpriseConfig.Phase2.MSCHAPV2,
135 ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" +
136 "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
137 "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
138 "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
139 "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
140 "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
141 "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
142 "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
143 "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
144 "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
145 "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
146 "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
147 "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
148 "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
149 "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
150 "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
151 "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
152 "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
153 "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
154 "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
155 "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
156 "-----END CERTIFICATE-----");
158 wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE));
160 wifiPresets[i++] = (new WifiNetworkSettingsSet("eduroam", "eduroam", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
162 new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
163 WifiEnterpriseConfig.Eap.PEAP,
164 WifiEnterpriseConfig.Phase2.MSCHAPV2,
166 ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" +
167 "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
168 "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
169 "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
170 "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
171 "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
172 "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
173 "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
174 "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
175 "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
176 "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
177 "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
178 "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
179 "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
180 "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
181 "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
182 "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
183 "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
184 "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
185 "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
186 "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
187 "-----END CERTIFICATE-----").
188 setUserSuffix("@dhbw-loerrach.de");
193 private void connectToWiFi(WifiNetworkSettingsSet settings) {
194 WifiConfiguration wifiConfig = new WifiConfiguration();
195 wifiConfig.SSID = settings.ssid;
196 for(int i = 0; i < settings.authAlgorithms.length; i++)
197 wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]);
199 switch(settings.authType) {
200 case WIFI_AUTHTYPE_NONE:
202 case WIFI_AUTHTYPE_WEP:
203 // not supported by our app
205 case WIFI_AUTHTYPE_WPA:
208 case WIFI_AUTHTYPE_WPA_ENTERPRISE:
209 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
210 String username = settings.username;
211 if(settings.usernameSuffix != null)
212 username += settings.usernameSuffix;
213 enterpriseConfig.setIdentity(username);
214 enterpriseConfig.setPassword(settings.password);
215 enterpriseConfig.setEapMethod(settings.eapMethod);
216 enterpriseConfig.setPhase2Method(settings.phase2Method);
218 enterpriseConfig.setCaCertificate(settings.generateCertificate());
219 } catch (CertificateException e) {
220 } catch (IOException e) {
222 wifiConfig.enterpriseConfig = enterpriseConfig;
225 int networkId = wifimanager.addNetwork(wifiConfig);
226 wifimanager.enableNetwork(networkId, true);
233 public void onCreate(Bundle savedInstanceState) {
234 super.onCreate(savedInstanceState);
235 loadDhbwWifiDefinitions();
236 wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
239 private void updateSelectedNetworkInformation() {
242 if(selectedNetworkIndex >= wifiPresets.length)
245 WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
246 TextView ssidInfoView = (TextView) view.findViewById(R.id.ssidInfo);
247 TextView securityInfoView = (TextView) view.findViewById(R.id.securityInfo);
248 TextView eapInfoView = (TextView) view.findViewById(R.id.eapInfo);
249 TextView phase2InfoView = (TextView) view.findViewById(R.id.phase2Info);
250 TextView cacertInfoView = (TextView) view.findViewById(R.id.cacertInfo);
252 ssidInfoView.setText(settings.ssid);
253 switch(settings.authType) {
254 case WIFI_AUTHTYPE_NONE:
255 securityInfoView.setText(R.string.wifiopts_security_open);
257 case WIFI_AUTHTYPE_WEP:
258 securityInfoView.setText(R.string.wifiopts_security_wep);
261 case WIFI_AUTHTYPE_WPA:
262 securityInfoView.setText(R.string.wifiopts_security_wpa);
264 case WIFI_AUTHTYPE_WPA_ENTERPRISE:
265 securityInfoView.setText(R.string.wifiopts_security_wpa_enterprise);
269 if(settings.authType == WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) {
271 switch(settings.eapMethod) {
272 case WifiEnterpriseConfig.Eap.PEAP:
273 eapStringId = R.string.wifiopts_eap_peap;
275 case WifiEnterpriseConfig.Eap.TLS:
276 eapStringId = R.string.wifiopts_eap_tls;
278 case WifiEnterpriseConfig.Eap.TTLS:
279 eapStringId = R.string.wifiopts_eap_ttls;
281 case WifiEnterpriseConfig.Eap.PWD:
282 eapStringId = R.string.wifiopts_eap_pwd;
286 eapInfoView.setText(eapStringId);
288 eapInfoView.setText("");
290 int phase2StringId = 0;
291 switch(settings.phase2Method) {
292 case WifiEnterpriseConfig.Phase2.MSCHAPV2:
293 phase2StringId = R.string.wifiopts_phase2_mschapv2;
295 case WifiEnterpriseConfig.Phase2.GTC:
296 phase2StringId = R.string.wifiopts_phase2_gtc;
299 if(phase2StringId > 0)
300 phase2InfoView.setText(phase2StringId);
302 phase2InfoView.setText("");
304 cacertInfoView.setText(settings.caName);
306 eapInfoView.setText("-");
307 phase2InfoView.setText("-");
308 cacertInfoView.setText("-");
314 public View onCreateView(LayoutInflater inflater, ViewGroup container,
315 Bundle savedInstanceState) {
316 view = inflater.inflate(R.layout.fragment_wifi_settings, container, false);
317 AppContext.setTitle("DHBW WLAN Settings");
319 updateSelectedNetworkInformation();
321 tablayout = (TabLayout) view.findViewById(R.id.tabs);
322 tablayout.removeAllTabs();
323 for(int i = 0; i < wifiPresets.length; i++) {
324 TabLayout.Tab tab = tablayout.newTab();
325 tab.setText(wifiPresets[i].name);
326 tablayout.addTab(tab);
328 tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
330 public void onTabSelected(TabLayout.Tab tab) {
331 selectedNetworkIndex = tab.getPosition();
332 updateSelectedNetworkInformation();
336 public void onTabUnselected(TabLayout.Tab tab) {
340 public void onTabReselected(TabLayout.Tab tab) {
344 Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
345 connectBtn.setOnClickListener(new View.OnClickListener() {
347 public void onClick(View v) {
348 Button connectBtn = (Button) v;
349 connectBtn.setEnabled(false);
351 EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername);
352 EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword);
354 String username = usernameEdt.getText().toString();
355 String password = passwordEdt.getText().toString();
357 if (Build.VERSION.SDK_INT < 18) {
358 // connectToDHWiFi not supported!
359 // do something else?
360 } else if (username.length() > 0 && password.length() > 0) {
361 WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
362 if(settings != null) {
363 settings.setAuthData(username, password);
364 connectToWiFi(settings);
368 connectBtn.setEnabled(true);