1 package de.dhbwloe.campusapp.fragments;
4 import android.annotation.TargetApi;
5 import android.net.wifi.WifiConfiguration;
6 import android.net.wifi.WifiEnterpriseConfig;
7 import android.net.wifi.WifiManager;
8 import android.os.Build;
9 import android.os.Bundle;
10 import android.support.v4.app.Fragment;
11 import android.util.Base64;
12 import android.view.LayoutInflater;
13 import android.view.View;
14 import android.view.ViewGroup;
15 import android.widget.Button;
16 import android.widget.EditText;
18 import java.io.ByteArrayInputStream;
19 import java.io.IOException;
20 import java.io.StringReader;
21 import java.lang.reflect.Field;
22 import java.security.cert.CertificateException;
23 import java.security.cert.CertificateFactory;
24 import java.security.cert.X509Certificate;
26 import de.dhbwloe.campusapp.CampusAppFragment;
27 import de.dhbwloe.campusapp.R;
28 import de.dhbwloe.campusapp.search.SearchIndices;
31 * A simple {@link Fragment} subclass.
33 public class WifiSettings extends CampusAppFragment {
34 /* implement this for search results ;) */
35 public static SearchIndices[] GetSearchIndices() {
36 return new SearchIndices[] {
37 new SearchIndices("WifiSettings", true) {{
39 setTarget("#WifiSettings");
40 setTitle("Wifi Settings");
41 setDescription("WLAN Konfiguration für dieses Gerät");
42 addKeyWord("wlan, secure, dhbw-secure, wifi, w-lan, wireless, internet, netzwerk");
47 private enum WifiNetworkAuthenticationTypes {
51 WIFI_AUTHTYPE_WPA_ENTERPRISE,
53 private class WifiNetworkSettingsSet {
56 WifiNetworkAuthenticationTypes authType;
66 public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) {
69 this.authType = authType;
72 public WifiNetworkSettingsSet setWpaEnterprise(int[] authAlgorithms, int eapMethod, int phase2Method, String username) {
73 this.authAlgorithms = authAlgorithms;
74 this.eapMethod = eapMethod;
75 this.phase2Method = phase2Method;
76 this.username = username;
80 public WifiNetworkSettingsSet setPassword(String password) {
81 this.password = password;
85 public WifiNetworkSettingsSet setCACertificate(String certificate) {
86 this.caCertStr = certificate;
90 public void setAuthData(String username, String password) {
91 this.username = username;
92 this.password = password;
95 public void setAuthData(String password) {
96 this.password = password;
99 public X509Certificate generateCertificate() throws CertificateException, IOException {
100 byte [] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT);
101 return (X509Certificate)CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded));
106 private WifiNetworkSettingsSet[] wifiPresets;
107 private WifiManager wifimanager;
109 private void loadDhbwWifiDefinitions() {
110 int numOfNetworks = 2;
112 wifiPresets = new WifiNetworkSettingsSet[numOfNetworks];
114 wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
116 new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
117 WifiEnterpriseConfig.Eap.PEAP,
118 WifiEnterpriseConfig.Phase2.MSCHAPV2,
120 ).setCACertificate("-----BEGIN CERTIFICATE-----\n" +
121 "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
122 "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
123 "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
124 "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
125 "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
126 "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
127 "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
128 "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
129 "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
130 "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
131 "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
132 "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
133 "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
134 "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
135 "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
136 "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
137 "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
138 "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
139 "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
140 "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
141 "-----END CERTIFICATE-----");
143 wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE));
148 private void connectToWiFi(WifiNetworkSettingsSet settings) {
149 WifiConfiguration wifiConfig = new WifiConfiguration();
150 wifiConfig.SSID = settings.ssid;
151 for(int i = 0; i < settings.authAlgorithms.length; i++)
152 wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]);
154 switch(settings.authType) {
155 case WIFI_AUTHTYPE_NONE:
157 case WIFI_AUTHTYPE_WEP:
158 // not supported by our app
160 case WIFI_AUTHTYPE_WPA:
163 case WIFI_AUTHTYPE_WPA_ENTERPRISE:
164 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
165 enterpriseConfig.setIdentity(settings.username);
166 enterpriseConfig.setPassword(settings.password);
167 enterpriseConfig.setEapMethod(settings.eapMethod);
168 enterpriseConfig.setPhase2Method(settings.phase2Method);
170 enterpriseConfig.setCaCertificate(settings.generateCertificate());
171 } catch (CertificateException e) {
172 } catch (IOException e) {
174 wifiConfig.enterpriseConfig = enterpriseConfig;
177 int networkId = wifimanager.addNetwork(wifiConfig);
178 wifimanager.enableNetwork(networkId, true);
185 public void onCreate(Bundle savedInstanceState) {
186 super.onCreate(savedInstanceState);
187 loadDhbwWifiDefinitions();
188 wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
193 public View onCreateView(LayoutInflater inflater, ViewGroup container,
194 Bundle savedInstanceState) {
195 view = inflater.inflate(R.layout.fragment_wifi_settings, container, false);
196 AppContext.setTitle("DHBW WLAN Settings");
198 Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
199 connectBtn.setOnClickListener(new View.OnClickListener() {
201 public void onClick(View v) {
202 Button connectBtn = (Button) v;
203 connectBtn.setEnabled(false);
205 EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername);
206 EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword);
208 String username = usernameEdt.getText().toString();
209 String password = passwordEdt.getText().toString();
211 if (Build.VERSION.SDK_INT < 18) {
212 // connectToDHWiFi not supported!
213 // do something else?
214 } else if (username.length() > 0 && password.length() > 0) {
215 WifiNetworkSettingsSet settings = wifiPresets[0];
216 settings.setAuthData(username, password);
217 connectToWiFi(settings);
220 connectBtn.setEnabled(true);