1 package de.dhbwloe.campusapp.fragments;
4 import android.annotation.TargetApi;
5 import android.app.ActionBar;
6 import android.app.Activity;
7 import android.content.BroadcastReceiver;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.content.IntentFilter;
11 import android.content.res.Resources;
12 import android.net.ConnectivityManager;
13 import android.net.NetworkInfo;
14 import android.net.wifi.ScanResult;
15 import android.net.wifi.WifiConfiguration;
16 import android.net.wifi.WifiEnterpriseConfig;
17 import android.net.wifi.WifiInfo;
18 import android.net.wifi.WifiManager;
19 import android.os.Build;
20 import android.os.Bundle;
21 import android.support.design.widget.TabLayout;
22 import android.support.v4.app.Fragment;
23 import android.util.Base64;
24 import android.util.Log;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.widget.Button;
29 import android.widget.EditText;
30 import android.widget.RelativeLayout;
31 import android.widget.TableRow;
32 import android.widget.TextView;
34 import java.io.ByteArrayInputStream;
35 import java.io.IOException;
36 import java.io.StringReader;
37 import java.lang.reflect.Field;
38 import java.security.cert.CertificateException;
39 import java.security.cert.CertificateFactory;
40 import java.security.cert.X509Certificate;
41 import java.util.List;
43 import de.dhbwloe.campusapp.CampusAppContext;
44 import de.dhbwloe.campusapp.CampusAppFragment;
45 import de.dhbwloe.campusapp.R;
46 import de.dhbwloe.campusapp.search.SearchIndices;
49 * A simple {@link Fragment} subclass.
51 public class WifiSettings extends CampusAppFragment {
52 /* implement this for search results ;) */
53 public static SearchIndices[] GetSearchIndices() {
54 return new SearchIndices[]{
55 new SearchIndices("WifiSettings", true) {{
57 setTarget("#WifiSettings");
58 setTitle("Wifi Settings");
59 setDescription("WLAN Konfiguration für dieses Gerät");
60 addKeyWord("wlan, secure, dhbw-secure, wifi, w-lan, wireless, internet, netzwerk");
65 private enum WifiNetworkAuthenticationTypes {
69 WIFI_AUTHTYPE_WPA_ENTERPRISE,
72 private class WifiNetworkSettingsSet {
75 WifiNetworkAuthenticationTypes authType;
83 String usernameSuffix;
88 boolean isInScanResult = false;
90 public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) {
93 this.authType = authType;
96 public WifiNetworkSettingsSet setWpaEnterprise(int[] authAlgorithms, int eapMethod, int phase2Method, String username) {
97 this.authAlgorithms = authAlgorithms;
98 this.eapMethod = eapMethod;
99 this.phase2Method = phase2Method;
100 this.username = username;
104 public WifiNetworkSettingsSet setPassword(String password) {
105 this.password = password;
109 public WifiNetworkSettingsSet setCACertificate(String caname, String certificate) {
110 this.caName = caname;
111 this.caCertStr = certificate;
115 public WifiNetworkSettingsSet setUserSuffix(String suffix) {
116 this.usernameSuffix = suffix;
120 public void setAuthData(String username, String password) {
121 this.username = username;
122 this.password = password;
125 public void setAuthData(String password) {
126 this.password = password;
129 public X509Certificate generateCertificate() throws CertificateException, IOException {
130 byte[] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT);
131 return (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded));
136 private TabLayout tablayout;
137 private WifiNetworkSettingsSet[] wifiPresets;
138 private WifiManager wifiManager;
139 private ConnectivityManager connectivityManager;
140 private int selectedNetworkIndex = 0;
141 private boolean networkScanned = false;
142 private BroadcastReceiver wifiStateReceiver = new BroadcastReceiver() {
144 public void onReceive(Context arg0, Intent arg1) {
145 NetworkInfo networkInfo = (NetworkInfo) arg1.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
146 if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
151 private BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
153 public void onReceive(Context arg0, Intent arg1) {
154 updateWifiScanState();
158 private void loadDhbwWifiDefinitions() {
159 int numOfNetworks = 3;
161 wifiPresets = new WifiNetworkSettingsSet[numOfNetworks];
163 wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
165 new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
166 WifiEnterpriseConfig.Eap.PEAP,
167 WifiEnterpriseConfig.Phase2.MSCHAPV2,
169 ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" +
170 "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
171 "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
172 "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
173 "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
174 "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
175 "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
176 "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
177 "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
178 "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
179 "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
180 "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
181 "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
182 "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
183 "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
184 "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
185 "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
186 "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
187 "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
188 "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
189 "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
190 "-----END CERTIFICATE-----");
192 wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE));
194 wifiPresets[i++] = (new WifiNetworkSettingsSet("eduroam", "eduroam", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
196 new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
197 WifiEnterpriseConfig.Eap.PEAP,
198 WifiEnterpriseConfig.Phase2.MSCHAPV2,
200 ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" +
201 "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
202 "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
203 "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
204 "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
205 "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
206 "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
207 "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
208 "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
209 "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
210 "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
211 "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
212 "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
213 "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
214 "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
215 "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
216 "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
217 "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
218 "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
219 "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
220 "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
221 "-----END CERTIFICATE-----").
222 setUserSuffix("@dhbw-loerrach.de");
227 private void connectToWiFi(WifiNetworkSettingsSet settings) {
228 WifiConfiguration wifiConfig = new WifiConfiguration();
229 wifiConfig.SSID = settings.ssid;
230 for(int i = 0; i < settings.authAlgorithms.length; i++)
231 wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]);
233 switch(settings.authType) {
234 case WIFI_AUTHTYPE_NONE:
236 case WIFI_AUTHTYPE_WEP:
237 // not supported by our app
239 case WIFI_AUTHTYPE_WPA:
242 case WIFI_AUTHTYPE_WPA_ENTERPRISE:
243 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
244 String username = settings.username;
245 if(settings.usernameSuffix != null)
246 username += settings.usernameSuffix;
247 enterpriseConfig.setIdentity(username);
248 enterpriseConfig.setPassword(settings.password);
249 enterpriseConfig.setEapMethod(settings.eapMethod);
250 enterpriseConfig.setPhase2Method(settings.phase2Method);
252 enterpriseConfig.setCaCertificate(settings.generateCertificate());
253 } catch (CertificateException e) {
254 } catch (IOException e) {
256 wifiConfig.enterpriseConfig = enterpriseConfig;
259 int networkId = wifiManager.addNetwork(wifiConfig);
260 wifiManager.enableNetwork(networkId, true);
267 public void onCreate(Bundle savedInstanceState) {
268 super.onCreate(savedInstanceState);
269 loadDhbwWifiDefinitions();
270 wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
271 connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE);
274 private void updateSelectedNetworkInformation() {
277 if(selectedNetworkIndex >= wifiPresets.length)
280 WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
281 TextView ssidInfoView = (TextView) view.findViewById(R.id.ssidInfo);
282 TextView securityInfoView = (TextView) view.findViewById(R.id.securityInfo);
283 TextView eapInfoView = (TextView) view.findViewById(R.id.eapInfo);
284 TextView phase2InfoView = (TextView) view.findViewById(R.id.phase2Info);
285 TextView cacertInfoView = (TextView) view.findViewById(R.id.cacertInfo);
287 TableRow eapInfoRow = (TableRow) view.findViewById(R.id.eapInfoRow);
288 TableRow phase2InfoRow = (TableRow) view.findViewById(R.id.phase2InfoRow);
289 TableRow cacertInfoRow = (TableRow) view.findViewById(R.id.cacertInfoRow);
290 TableRow pskInfoRow = (TableRow) view.findViewById(R.id.pskInfoRow);
292 RelativeLayout insecureNetWarning = (RelativeLayout) view.findViewById(R.id.insecureNetWarning);
295 ssidInfoView.setText(settings.ssid);
297 eapInfoRow.setVisibility(View.GONE);
298 phase2InfoRow.setVisibility(View.GONE);
299 cacertInfoRow.setVisibility(View.GONE);
300 pskInfoRow.setVisibility(View.GONE);
301 insecureNetWarning.setVisibility(View.GONE);
303 switch(settings.authType) {
304 case WIFI_AUTHTYPE_NONE:
305 securityInfoView.setText(R.string.wifiopts_security_open);
307 insecureNetWarning.setVisibility(View.VISIBLE);
309 case WIFI_AUTHTYPE_WEP:
310 securityInfoView.setText(R.string.wifiopts_security_wep);
311 insecureNetWarning.setVisibility(View.VISIBLE);
314 case WIFI_AUTHTYPE_WPA:
315 securityInfoView.setText(R.string.wifiopts_security_wpa);
317 pskInfoRow.setVisibility(View.VISIBLE);
319 case WIFI_AUTHTYPE_WPA_ENTERPRISE:
320 securityInfoView.setText(R.string.wifiopts_security_wpa_enterprise);
322 eapInfoRow.setVisibility(View.VISIBLE);
323 phase2InfoRow.setVisibility(View.VISIBLE);
324 cacertInfoRow.setVisibility(View.VISIBLE);
328 if(settings.authType == WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) {
330 switch(settings.eapMethod) {
331 case WifiEnterpriseConfig.Eap.PEAP:
332 eapStringId = R.string.wifiopts_eap_peap;
334 case WifiEnterpriseConfig.Eap.TLS:
335 eapStringId = R.string.wifiopts_eap_tls;
337 case WifiEnterpriseConfig.Eap.TTLS:
338 eapStringId = R.string.wifiopts_eap_ttls;
340 case WifiEnterpriseConfig.Eap.PWD:
341 eapStringId = R.string.wifiopts_eap_pwd;
345 eapInfoView.setText(eapStringId);
347 eapInfoView.setText("");
349 int phase2StringId = 0;
350 switch(settings.phase2Method) {
351 case WifiEnterpriseConfig.Phase2.MSCHAPV2:
352 phase2StringId = R.string.wifiopts_phase2_mschapv2;
354 case WifiEnterpriseConfig.Phase2.GTC:
355 phase2StringId = R.string.wifiopts_phase2_gtc;
358 if(phase2StringId > 0)
359 phase2InfoView.setText(phase2StringId);
361 phase2InfoView.setText("");
363 cacertInfoView.setText(settings.caName);
367 updateWifiConnectButton();
370 private void updateWifiState() {
371 NetworkInfo myNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
372 WifiInfo myWifiInfo = wifiManager.getConnectionInfo();
374 Resources resources = AppContext.getMainActivity().getResources();
376 if(myNetworkInfo.isConnectedOrConnecting()) {
377 int statusId = (myNetworkInfo.isConnected() ? R.string.wifisettings_status_connected : R.string.wifisettings_status_connecting);
379 String ssid = myWifiInfo.getSSID();
381 status = String.format(resources.getString(statusId), ssid);
383 status = resources.getString(R.string.wifisettings_status_disconnected);
386 TextView statusTextView = (TextView)view.findViewById(R.id.wifiStatusText);
387 statusTextView.setText(status);
388 updateWifiConnectButton();
391 private void updateWifiScanState() {
392 networkScanned = true;
393 List<ScanResult> scanResultList = wifiManager.getScanResults();
394 for(int i = 0; i < wifiPresets.length; i++) {
395 boolean networkFound = false;
396 for(ScanResult result : scanResultList) {
397 if(result.SSID != null && result.SSID.equalsIgnoreCase(wifiPresets[i].ssid)) {
402 wifiPresets[i].isInScanResult = networkFound;
404 updateWifiConnectButton();
407 private void updateWifiConnectButton() {
408 if(selectedNetworkIndex >= wifiPresets.length)
410 WifiNetworkSettingsSet preset = wifiPresets[selectedNetworkIndex];
412 boolean buttonEnabled = false;
413 int buttonTextId = 0;
414 NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
415 WifiInfo wifiInfo = wifiManager.getConnectionInfo();
417 if(!wifiManager.isWifiEnabled()) {
418 buttonTextId = R.string.wifisettings_connect_button_disabled;
419 } else if(networkInfo.isConnectedOrConnecting() && wifiInfo.getSSID() != null && wifiInfo.getSSID().equalsIgnoreCase(preset.ssid)) {
420 buttonTextId = R.string.wifisettings_connect_button_ready;
421 } else if(!networkScanned) {
422 buttonTextId = R.string.wifisettings_connect_button_scan;
423 } else if(!preset.isInScanResult) {
424 buttonTextId = R.string.wifisettings_connect_button_notfound;
425 buttonEnabled = true;
427 buttonEnabled = true;
428 buttonTextId = R.string.wifisettings_connect_button;
431 Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
432 connectBtn.setEnabled(buttonEnabled);
433 connectBtn.setText(buttonTextId);
437 public View onCreateView(LayoutInflater inflater, ViewGroup container,
438 Bundle savedInstanceState) {
439 view = inflater.inflate(R.layout.fragment_wifi_settings, container, false);
440 AppContext.setTitle("DHBW WLAN Settings");
442 updateSelectedNetworkInformation();
444 tablayout = (TabLayout) view.findViewById(R.id.tabs);
445 tablayout.removeAllTabs();
446 for(int i = 0; i < wifiPresets.length; i++) {
447 TabLayout.Tab tab = tablayout.newTab();
448 tab.setText(wifiPresets[i].name);
449 tablayout.addTab(tab);
451 tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
453 public void onTabSelected(TabLayout.Tab tab) {
454 selectedNetworkIndex = tab.getPosition();
455 updateSelectedNetworkInformation();
459 public void onTabUnselected(TabLayout.Tab tab) {
463 public void onTabReselected(TabLayout.Tab tab) {
467 Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
468 connectBtn.setOnClickListener(new View.OnClickListener() {
470 public void onClick(View v) {
471 Button connectBtn = (Button) v;
472 connectBtn.setEnabled(false);
473 WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
474 if(!settings.isInScanResult) {
475 networkScanned = false;
476 wifiManager.startScan();
477 updateWifiConnectButton();
481 EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername);
482 EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword);
484 String username = usernameEdt.getText().toString();
485 String password = passwordEdt.getText().toString();
487 if (Build.VERSION.SDK_INT < 18) {
488 // connectToDHWiFi not supported!
489 // do something else?
490 } else if (username.length() > 0 && password.length() > 0) {
492 if(settings != null) {
493 settings.setAuthData(username, password);
494 connectToWiFi(settings);
498 connectBtn.setEnabled(true);
503 updateWifiScanState();
509 public void onResume() {
512 if(AppContext == null)
513 AppContext = CampusAppContext.getInstance();
515 AppContext.getMainActivity().registerReceiver(this.wifiStateReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
516 AppContext.getMainActivity().registerReceiver(this.wifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
518 networkScanned = false;
519 wifiManager.startScan();
520 updateWifiConnectButton();
522 Log.i("WifiSettings", "registered wifi state receiver");
526 public void onPause() {
529 AppContext.getMainActivity().unregisterReceiver(this.wifiStateReceiver);
530 AppContext.getMainActivity().unregisterReceiver(this.wifiScanReceiver);
532 Log.i("WifiSettings", "unregistered wifi state receiver");