added launcher icon, fixed crash due to AppContext = null (damn Android GC), made...
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / fragments / WifiSettings.java
1 package de.dhbwloe.campusapp.fragments;
2
3
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;
17
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;
25
26 import de.dhbwloe.campusapp.CampusAppFragment;
27 import de.dhbwloe.campusapp.R;
28 import de.dhbwloe.campusapp.search.SearchIndices;
29
30 /**
31  * A simple {@link Fragment} subclass.
32  */
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) {{
38                     setUpdateTime(1);
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");
43                 }},
44         };
45     }
46
47     private enum WifiNetworkAuthenticationTypes {
48         WIFI_AUTHTYPE_NONE,
49         WIFI_AUTHTYPE_WEP,
50         WIFI_AUTHTYPE_WPA,
51         WIFI_AUTHTYPE_WPA_ENTERPRISE,
52     };
53     private class WifiNetworkSettingsSet {
54         String name;
55         String ssid;
56         WifiNetworkAuthenticationTypes authType;
57         int[] authAlgorithms;
58         int   eapMethod;
59         int   phase2Method;
60
61         String caCertStr;
62
63         String username;
64         String password;
65
66         public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) {
67             this.name = name;
68             this.ssid = ssid;
69             this.authType = authType;
70         }
71
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;
77             return this;
78         }
79
80         public WifiNetworkSettingsSet setPassword(String password) {
81             this.password = password;
82             return this;
83         }
84
85         public WifiNetworkSettingsSet setCACertificate(String certificate) {
86             this.caCertStr = certificate;
87             return this;
88         }
89
90         public void setAuthData(String username, String password) {
91             this.username = username;
92             this.password = password;
93         }
94
95         public void setAuthData(String password) {
96             this.password = password;
97         }
98
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));
102         }
103     }
104
105     private View view;
106     private WifiNetworkSettingsSet[] wifiPresets;
107     private WifiManager wifimanager;
108
109     private void loadDhbwWifiDefinitions() {
110         int numOfNetworks = 2;
111         int i = 0;
112         wifiPresets = new WifiNetworkSettingsSet[numOfNetworks];
113
114         wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
115                 setWpaEnterprise(
116                         new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
117                         WifiEnterpriseConfig.Eap.PEAP,
118                         WifiEnterpriseConfig.Phase2.MSCHAPV2,
119                         null
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-----");
142
143         wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE));
144     }
145
146
147     @TargetApi(18)
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]);
153
154         switch(settings.authType) {
155             case WIFI_AUTHTYPE_NONE:
156                 break;
157             case WIFI_AUTHTYPE_WEP:
158                 // not supported by our app
159                 break;
160             case WIFI_AUTHTYPE_WPA:
161
162                 break;
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);
169                 try {
170                     enterpriseConfig.setCaCertificate(settings.generateCertificate());
171                 } catch (CertificateException e) {
172                 } catch (IOException e) {
173                 }
174                 wifiConfig.enterpriseConfig = enterpriseConfig;
175                 break;
176         }
177         int networkId = wifimanager.addNetwork(wifiConfig);
178         wifimanager.enableNetwork(networkId, true);
179     }
180
181
182
183
184     @Override
185     public void onCreate(Bundle savedInstanceState) {
186         super.onCreate(savedInstanceState);
187         loadDhbwWifiDefinitions();
188         wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
189     }
190
191
192     @Override
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");
197
198         Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
199         connectBtn.setOnClickListener(new View.OnClickListener() {
200             @Override
201             public void onClick(View v) {
202                 Button connectBtn = (Button) v;
203                 connectBtn.setEnabled(false);
204
205                 EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername);
206                 EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword);
207
208                 String username = usernameEdt.getText().toString();
209                 String password = passwordEdt.getText().toString();
210
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);
218                 }
219
220                 connectBtn.setEnabled(true);
221             }
222         });
223
224         return view;
225     }
226
227 }