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