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.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;
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;
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;
52 * A simple {@link Fragment} subclass.
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) {{
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");
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() {
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();
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];
91 SupplicantState supl_state=((SupplicantState)intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE));
94 settings.isAssociating = true;
95 settings.isAssociated = false;
96 settings.isAuthenticated = false;
97 settings.isDisconnected = false;
100 settings.isAssociated = true;
103 settings.isAuthenticated = true;
106 settings.isAssociated = false;
107 settings.isAssociating = false;
108 settings.isDisconnected = true;
116 NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
117 if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
122 private BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
124 public void onReceive(Context arg0, Intent arg1) {
125 updateWifiScanState();
132 public void onCreate(Bundle savedInstanceState) {
133 super.onCreate(savedInstanceState);
135 wifiPresets = WifiNetworkSettings.LoadNetworkSettingPresets(AppContext);
137 wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
138 connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE);
140 wifiConfigManager = new WifiConfigurationManager(wifiManager);
143 private void updateSelectedNetworkInformation() {
146 if(selectedNetworkIndex >= wifiPresets.length)
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);
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);
161 RelativeLayout insecureNetWarning = (RelativeLayout) view.findViewById(R.id.insecureNetWarning);
164 ssidInfoView.setText(settings.getSSID());
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);
172 switch(settings.getAuthType()) {
173 case WIFI_AUTHTYPE_NONE:
174 securityInfoView.setText(R.string.wifiopts_security_open);
176 insecureNetWarning.setVisibility(View.VISIBLE);
178 case WIFI_AUTHTYPE_WEP:
179 securityInfoView.setText(R.string.wifiopts_security_wep);
180 insecureNetWarning.setVisibility(View.VISIBLE);
183 case WIFI_AUTHTYPE_WPA:
184 securityInfoView.setText(R.string.wifiopts_security_wpa);
186 pskInfoRow.setVisibility(View.VISIBLE);
188 case WIFI_AUTHTYPE_WPA_ENTERPRISE:
189 securityInfoView.setText(R.string.wifiopts_security_wpa_enterprise);
191 eapInfoRow.setVisibility(View.VISIBLE);
192 phase2InfoRow.setVisibility(View.VISIBLE);
193 cacertInfoRow.setVisibility(View.VISIBLE);
197 if(settings.getAuthType() == WifiNetworkSettings.WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) {
199 switch(settings.getEapMethod()) {
200 case WifiEnterpriseConfig.Eap.PEAP:
201 eapStringId = R.string.wifiopts_eap_peap;
203 case WifiEnterpriseConfig.Eap.TLS:
204 eapStringId = R.string.wifiopts_eap_tls;
206 case WifiEnterpriseConfig.Eap.TTLS:
207 eapStringId = R.string.wifiopts_eap_ttls;
209 case WifiEnterpriseConfig.Eap.PWD:
210 eapStringId = R.string.wifiopts_eap_pwd;
214 eapInfoView.setText(eapStringId);
216 eapInfoView.setText("");
218 int phase2StringId = 0;
219 switch(settings.getPhase2Method()) {
220 case WifiEnterpriseConfig.Phase2.MSCHAPV2:
221 phase2StringId = R.string.wifiopts_phase2_mschapv2;
223 case WifiEnterpriseConfig.Phase2.GTC:
224 phase2StringId = R.string.wifiopts_phase2_gtc;
227 if(phase2StringId > 0)
228 phase2InfoView.setText(phase2StringId);
230 phase2InfoView.setText("");
232 cacertInfoView.setText(settings.getCAName());
236 updateWifiConnectButton();
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);
246 WifiNetworkSettings settings = null;
247 for(int i = 0; i < wifiPresets.length; i++) {
248 if(wifiPresets[i].getSSID().equalsIgnoreCase(ssid)) {
249 settings = wifiPresets[i];
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;
265 if(!settings.isTryConnecting) {
272 Resources resources = AppContext.getMainActivity().getResources();
274 if(myNetworkInfo.isConnectedOrConnecting()) {
275 int statusId = (myNetworkInfo.isConnected() ? R.string.wifisettings_status_connected : R.string.wifisettings_status_connecting);
278 ssid = ssid.replace("\"", "");
279 status = String.format(resources.getString(statusId), ssid);
284 //if(networkConnecting && wifiPresets[connectingNetworkIndex].getSSID().equalsIgnoreCase(ssid)) {
288 wifiConfigManager.finalizeConnection(wifiPresets[connectingNetworkIndex], myNetworkInfo, myWifiInfo, new WifiConfigurationManager.WifiConfigurationComplete() {
290 public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response) {
291 networkConnecting = false;
292 connectingNetworkIndex = 0;
293 updateWifiConnectButton();
299 status = resources.getString(R.string.wifisettings_status_disconnected);
302 TextView statusTextView = (TextView)view.findViewById(R.id.wifiStatusText);
303 statusTextView.setText(status);
304 updateWifiConnectButton();
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())) {
318 wifiPresets[i].isInScanResult = networkFound;
320 updateWifiConnectButton();
323 private void updateWifiConnectButton() {
324 if(selectedNetworkIndex >= wifiPresets.length)
326 WifiNetworkSettings preset = wifiPresets[selectedNetworkIndex];
328 boolean buttonEnabled = false;
329 int buttonTextId = 0;
330 NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
331 WifiInfo wifiInfo = wifiManager.getConnectionInfo();
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;
345 buttonEnabled = true;
346 buttonTextId = R.string.wifisettings_connect_button;
349 Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
350 connectBtn.setEnabled(buttonEnabled);
351 connectBtn.setText(buttonTextId);
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");
360 updateSelectedNetworkInformation();
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);
369 tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
371 public void onTabSelected(TabLayout.Tab tab) {
372 selectedNetworkIndex = tab.getPosition();
373 updateSelectedNetworkInformation();
377 public void onTabUnselected(TabLayout.Tab tab) {
381 public void onTabReselected(TabLayout.Tab tab) {
385 Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
386 connectBtn.setOnClickListener(new View.OnClickListener() {
388 public void onClick(View v) {
389 WifiNetworkSettings settings = wifiPresets[selectedNetworkIndex];
390 if(!settings.isInScanResult) {
391 networkScanned = false;
392 wifiManager.startScan();
393 updateWifiConnectButton();
399 EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername);
400 EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword);
402 String username = usernameEdt.getText().toString();
403 String password = passwordEdt.getText().toString();
405 if (username.length() > 0 && password.length() > 0) {
406 if(settings != null) {
407 settings.isTryConnecting = true;
408 settings.setAuthData(username, password);
410 wifiConfigManager.connect(settings);
413 updateWifiConnectButton();
419 updateWifiScanState();
425 public void onResume() {
428 if(AppContext == null)
429 AppContext = CampusAppContext.getInstance();
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));
437 networkScanned = false;
438 wifiManager.startScan();
439 updateWifiConnectButton();
441 Log.i("WifiSettings", "registered wifi state receiver");
445 public void onPause() {
448 AppContext.getMainActivity().unregisterReceiver(this.wifiStateReceiver);
449 AppContext.getMainActivity().unregisterReceiver(this.wifiScanReceiver);
451 Log.i("WifiSettings", "unregistered wifi state receiver");