alpha 0.0.2
[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.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.SupplicantState;
16 import android.net.wifi.WifiConfiguration;
17 import android.net.wifi.WifiEnterpriseConfig;
18 import android.net.wifi.WifiInfo;
19 import android.net.wifi.WifiManager;
20 import android.os.Build;
21 import android.os.Bundle;
22 import android.support.design.widget.TabLayout;
23 import android.support.v4.app.Fragment;
24 import android.util.Base64;
25 import android.util.Log;
26 import android.view.LayoutInflater;
27 import android.view.View;
28 import android.view.ViewGroup;
29 import android.widget.Button;
30 import android.widget.EditText;
31 import android.widget.RelativeLayout;
32 import android.widget.TableRow;
33 import android.widget.TextView;
34
35 import java.io.ByteArrayInputStream;
36 import java.io.IOException;
37 import java.io.StringReader;
38 import java.lang.reflect.Field;
39 import java.security.cert.CertificateException;
40 import java.security.cert.CertificateFactory;
41 import java.security.cert.X509Certificate;
42 import java.util.List;
43
44 import de.dhbwloe.campusapp.CampusAppContext;
45 import de.dhbwloe.campusapp.CampusAppFragment;
46 import de.dhbwloe.campusapp.R;
47 import de.dhbwloe.campusapp.search.SearchIndices;
48 import de.dhbwloe.campusapp.wifi.WifiConfigurationManager;
49 import de.dhbwloe.campusapp.wifi.WifiNetworkSettings;
50
51 /**
52  * A simple {@link Fragment} subclass.
53  */
54 public class WifiSettings extends CampusAppFragment {
55     /* implement this for search results ;) */
56     public static SearchIndices[] GetSearchIndices() {
57         return new SearchIndices[]{
58                 new SearchIndices("WifiSettings", true) {{
59                     setUpdateTime(1);
60                     setTarget("#WifiSettings");
61                     setTitle(R.string.search_wifi_title);
62                     setDescription(R.string.search_wifi_description);
63                     addKeyWord(R.string.search_wifi_keywords);
64                 }},
65         };
66     }
67
68     private View view;
69     private TabLayout tablayout;
70     private WifiNetworkSettings[] wifiPresets;
71     private WifiManager wifiManager;
72     private WifiConfigurationManager wifiConfigManager;
73     private ConnectivityManager connectivityManager;
74     private int selectedNetworkIndex = 0;
75     private boolean networkScanned = false;
76     private BroadcastReceiver wifiStateReceiver = new BroadcastReceiver() {
77         @Override
78         public void onReceive(Context arg0, Intent intent) {
79             String action  = intent.getAction();
80             if(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)){
81                 WifiInfo myWifiInfo = wifiManager.getConnectionInfo();
82
83                 WifiNetworkSettings settings = null;
84                 for(int i = 0; i < wifiPresets.length; i++) {
85                     if(wifiPresets[i].getSSID().equalsIgnoreCase(myWifiInfo.getSSID())) {
86                         settings = wifiPresets[i];
87                         break;
88                     }
89                 }
90
91                 if(settings != null) {
92                     SupplicantState supl_state = ((SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE));
93                     switch (supl_state) {
94                         case ASSOCIATING:
95                             settings.isAssociating = true;
96                             settings.isAssociated = false;
97                             settings.isAuthenticated = false;
98                             settings.isDisconnected = false;
99                             break;
100                         case ASSOCIATED:
101                             settings.isAssociated = true;
102                             break;
103                         case COMPLETED:
104                             settings.isAuthenticated = true;
105                             break;
106                         case DISCONNECTED:
107                             settings.isAssociated = false;
108                             settings.isAssociating = false;
109                             settings.isDisconnected = true;
110                             break;
111                         default:
112                             break;
113                     }
114                     updateWifiState();
115                 }
116             }
117
118             NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
119             if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
120                 updateWifiState();
121             }
122         }
123     };
124     private BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
125         @Override
126         public void onReceive(Context arg0, Intent arg1) {
127             updateWifiScanState();
128         }
129     };
130
131
132
133     @Override
134     public void onCreate(Bundle savedInstanceState) {
135         super.onCreate(savedInstanceState);
136
137         wifiPresets = WifiNetworkSettings.LoadNetworkSettingPresets(AppContext);
138
139         wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
140         connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE);
141
142         wifiConfigManager = new WifiConfigurationManager(wifiManager);
143     }
144
145     private void updateSelectedNetworkInformation() {
146         if(view == null)
147             return;
148         if(selectedNetworkIndex >= wifiPresets.length)
149             return;
150
151         WifiNetworkSettings settings = wifiPresets[selectedNetworkIndex];
152         TextView ssidInfoView = (TextView) view.findViewById(R.id.ssidInfo);
153         TextView securityInfoView = (TextView) view.findViewById(R.id.securityInfo);
154         TextView eapInfoView = (TextView) view.findViewById(R.id.eapInfo);
155         TextView phase2InfoView = (TextView) view.findViewById(R.id.phase2Info);
156         TextView cacertInfoView = (TextView) view.findViewById(R.id.cacertInfo);
157
158         TableRow eapInfoRow = (TableRow) view.findViewById(R.id.eapInfoRow);
159         TableRow phase2InfoRow = (TableRow) view.findViewById(R.id.phase2InfoRow);
160         TableRow cacertInfoRow = (TableRow) view.findViewById(R.id.cacertInfoRow);
161         TableRow pskInfoRow = (TableRow) view.findViewById(R.id.pskInfoRow);
162
163         RelativeLayout insecureNetWarning = (RelativeLayout) view.findViewById(R.id.insecureNetWarning);
164
165
166         ssidInfoView.setText(settings.getSSID());
167
168         eapInfoRow.setVisibility(View.GONE);
169         phase2InfoRow.setVisibility(View.GONE);
170         cacertInfoRow.setVisibility(View.GONE);
171         pskInfoRow.setVisibility(View.GONE);
172         insecureNetWarning.setVisibility(View.GONE);
173
174         switch(settings.getAuthType()) {
175             case WIFI_AUTHTYPE_NONE:
176                 securityInfoView.setText(R.string.wifiopts_security_open);
177
178                 insecureNetWarning.setVisibility(View.VISIBLE);
179                 break;
180             case WIFI_AUTHTYPE_WEP:
181                 securityInfoView.setText(R.string.wifiopts_security_wep);
182                 insecureNetWarning.setVisibility(View.VISIBLE);
183                 // unsupported!
184                 break;
185             case WIFI_AUTHTYPE_WPA:
186                 securityInfoView.setText(R.string.wifiopts_security_wpa);
187
188                 pskInfoRow.setVisibility(View.VISIBLE);
189                 break;
190             case WIFI_AUTHTYPE_WPA_ENTERPRISE:
191                 securityInfoView.setText(R.string.wifiopts_security_wpa_enterprise);
192
193                 eapInfoRow.setVisibility(View.VISIBLE);
194                 phase2InfoRow.setVisibility(View.VISIBLE);
195                 cacertInfoRow.setVisibility(View.VISIBLE);
196                 break;
197         }
198
199         if(settings.getAuthType() == WifiNetworkSettings.WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) {
200             int eapStringId = 0;
201             switch(settings.getEapMethod()) {
202                 case WifiEnterpriseConfig.Eap.PEAP:
203                     eapStringId = R.string.wifiopts_eap_peap;
204                     break;
205                 case WifiEnterpriseConfig.Eap.TLS:
206                     eapStringId = R.string.wifiopts_eap_tls;
207                     break;
208                 case WifiEnterpriseConfig.Eap.TTLS:
209                     eapStringId = R.string.wifiopts_eap_ttls;
210                     break;
211                 case WifiEnterpriseConfig.Eap.PWD:
212                     eapStringId = R.string.wifiopts_eap_pwd;
213                     break;
214             }
215             if(eapStringId > 0)
216                 eapInfoView.setText(eapStringId);
217             else
218                 eapInfoView.setText("");
219
220             int phase2StringId = 0;
221             switch(settings.getPhase2Method()) {
222                 case WifiEnterpriseConfig.Phase2.MSCHAPV2:
223                     phase2StringId = R.string.wifiopts_phase2_mschapv2;
224                     break;
225                 case WifiEnterpriseConfig.Phase2.GTC:
226                     phase2StringId = R.string.wifiopts_phase2_gtc;
227                     break;
228             }
229             if(phase2StringId > 0)
230                 phase2InfoView.setText(phase2StringId);
231             else
232                 phase2InfoView.setText("");
233
234             cacertInfoView.setText(settings.getCAName());
235         } else {
236
237         }
238         updateWifiConnectButton();
239     }
240
241     private void updateWifiState() {
242         NetworkInfo myNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
243         WifiInfo myWifiInfo = wifiManager.getConnectionInfo();
244         String ssid = (myWifiInfo != null ? myWifiInfo.getSSID() : null);
245         if(ssid == null)
246             return;
247
248         WifiNetworkSettings settings = null;
249         for(int i = 0; i < wifiPresets.length; i++) {
250             if(wifiPresets[i].getSSID().equalsIgnoreCase(ssid)) {
251                 settings = wifiPresets[i];
252                 break;
253             }
254         }
255         if(settings == null)
256             return;
257
258         if(settings.isTryConnecting) {
259             boolean success = false;
260             if(settings.isDisconnected) {
261                 settings.failedAuthentication = true;
262                 settings.isTryConnecting = false;
263             } else if(settings.isAssociated) {
264                 settings.isTryConnecting = false;
265                 success = true;
266             }
267             if(!settings.isTryConnecting) {
268                 // success
269                 // TODO: continue
270             }
271         }
272
273
274         Resources resources = AppContext.getMainActivity().getResources();
275         String status;
276         if(myNetworkInfo.isConnectedOrConnecting()) {
277             int statusId = (myNetworkInfo.isConnected() ? R.string.wifisettings_status_connected : R.string.wifisettings_status_connecting);
278
279
280             ssid = ssid.replace("\"", "");
281             status = String.format(resources.getString(statusId), ssid);
282
283
284
285
286             //if(networkConnecting && wifiPresets[connectingNetworkIndex].getSSID().equalsIgnoreCase(ssid)) {
287
288                 /*
289
290                 wifiConfigManager.finalizeConnection(wifiPresets[connectingNetworkIndex], myNetworkInfo, myWifiInfo, new WifiConfigurationManager.WifiConfigurationComplete() {
291                     @Override
292                     public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response) {
293                         networkConnecting = false;
294                         connectingNetworkIndex = 0;
295                         updateWifiConnectButton();
296                     }
297                 });
298                 */
299             //}
300         } else {
301             status = resources.getString(R.string.wifisettings_status_disconnected);
302         }
303
304         TextView statusTextView = (TextView)view.findViewById(R.id.wifiStatusText);
305         statusTextView.setText(status);
306         updateWifiConnectButton();
307     }
308
309     private void updateWifiScanState() {
310         networkScanned = true;
311         List<ScanResult> scanResultList = wifiManager.getScanResults();
312         for(int i = 0; i < wifiPresets.length; i++) {
313             boolean networkFound = false;
314             for(ScanResult result : scanResultList) {
315                 if(result.SSID != null && result.SSID.equalsIgnoreCase(wifiPresets[i].getSSID())) {
316                     networkFound = true;
317                     break;
318                 }
319             }
320             wifiPresets[i].isInScanResult = networkFound;
321         }
322         updateWifiConnectButton();
323     }
324
325     private void updateWifiConnectButton() {
326         if(selectedNetworkIndex >= wifiPresets.length)
327             return;
328         WifiNetworkSettings preset = wifiPresets[selectedNetworkIndex];
329
330         boolean buttonEnabled = false;
331         int buttonTextId = 0;
332         NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
333         WifiInfo wifiInfo = wifiManager.getConnectionInfo();
334
335         if(!wifiManager.isWifiEnabled()) {
336             buttonTextId = R.string.wifisettings_connect_button_disabled;
337         } else if(networkInfo.isConnectedOrConnecting() && wifiInfo.getSSID() != null && wifiInfo.getSSID().equalsIgnoreCase(preset.getSSID())) {
338             buttonTextId = R.string.wifisettings_connect_button_ready;
339         } else if(preset.isTryConnecting) {
340             buttonTextId = R.string.wifisettings_connect_button_connecting;
341         } else if(!networkScanned) {
342             buttonTextId = R.string.wifisettings_connect_button_scan;
343         } else if(!preset.isInScanResult) {
344             buttonTextId = R.string.wifisettings_connect_button_notfound;
345             buttonEnabled = true;
346         } else {
347             buttonEnabled = true;
348             buttonTextId = R.string.wifisettings_connect_button;
349         }
350
351         Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
352         connectBtn.setEnabled(buttonEnabled);
353         connectBtn.setText(buttonTextId);
354     }
355
356     @Override
357     public View onCreateView(LayoutInflater inflater, ViewGroup container,
358                              Bundle savedInstanceState) {
359         view = inflater.inflate(R.layout.fragment_wifi_settings, container, false);
360         AppContext.setTitle("DHBW WLAN Settings");
361
362         updateSelectedNetworkInformation();
363
364         tablayout = (TabLayout) view.findViewById(R.id.tabs);
365         tablayout.removeAllTabs();
366         for(int i = 0; i < wifiPresets.length; i++) {
367             TabLayout.Tab tab = tablayout.newTab();
368             tab.setText(wifiPresets[i].getName());
369             tablayout.addTab(tab);
370         }
371         tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
372             @Override
373             public void onTabSelected(TabLayout.Tab tab) {
374                 selectedNetworkIndex = tab.getPosition();
375                 updateSelectedNetworkInformation();
376             }
377
378             @Override
379             public void onTabUnselected(TabLayout.Tab tab) {
380             }
381
382             @Override
383             public void onTabReselected(TabLayout.Tab tab) {
384             }
385         });
386
387         Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
388         connectBtn.setOnClickListener(new View.OnClickListener() {
389             @Override
390             public void onClick(View v) {
391                 WifiNetworkSettings settings = wifiPresets[selectedNetworkIndex];
392                 if(!settings.isInScanResult) {
393                     networkScanned = false;
394                     wifiManager.startScan();
395                     updateWifiConnectButton();
396                     return;
397                 }
398
399
400
401                 EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername);
402                 EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword);
403
404                 String username = usernameEdt.getText().toString();
405                 String password = passwordEdt.getText().toString();
406
407                if (username.length() > 0 && password.length() > 0) {
408                     if(settings != null) {
409                         settings.isTryConnecting = true;
410                         settings.setAuthData(username, password);
411
412                         wifiConfigManager.connect(settings);
413                     }
414
415                    updateWifiConnectButton();
416                 }
417             }
418         });
419
420         updateWifiState();
421         updateWifiScanState();
422
423         return view;
424     }
425
426     @Override
427     public void onResume() {
428         super.onResume();
429
430         if(AppContext == null)
431             AppContext = CampusAppContext.getInstance();
432
433         IntentFilter filter = new IntentFilter();
434         filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
435         filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
436         AppContext.getMainActivity().registerReceiver(this.wifiStateReceiver, new IntentFilter(filter));
437         AppContext.getMainActivity().registerReceiver(this.wifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
438
439         networkScanned = false;
440         wifiManager.startScan();
441         updateWifiConnectButton();
442
443         Log.i("WifiSettings", "registered wifi state receiver");
444     }
445
446     @Override
447         public void onPause() {
448         super.onPause();
449
450         AppContext.getMainActivity().unregisterReceiver(this.wifiStateReceiver);
451         AppContext.getMainActivity().unregisterReceiver(this.wifiScanReceiver);
452
453         Log.i("WifiSettings", "unregistered wifi state receiver");
454     }
455
456 }