X-Git-Url: http://git.pk910.de/?p=DHBWCampusApp.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fde%2Fdhbwloe%2Fcampusapp%2Ffragments%2FWifiSettings.java;h=a9bd972e6f71527e980944b9203d86b6379cdc27;hp=fceca54869de7be2dcd55218aa419dd62426ead7;hb=304cb748086811c3c2dc0eaef097e781a7777686;hpb=15f3d5927d5f607f3f6e67461ae0ebc5814573a4 diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java index fceca54..a9bd972 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java @@ -3,19 +3,32 @@ package de.dhbwloe.campusapp.fragments; import android.annotation.TargetApi; import android.app.ActionBar; +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiEnterpriseConfig; +import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.util.Base64; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.TableRow; import android.widget.TextView; import java.io.ByteArrayInputStream; @@ -25,7 +38,9 @@ import java.lang.reflect.Field; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; +import java.util.List; +import de.dhbwloe.campusapp.CampusAppContext; import de.dhbwloe.campusapp.CampusAppFragment; import de.dhbwloe.campusapp.R; import de.dhbwloe.campusapp.search.SearchIndices; @@ -36,7 +51,7 @@ import de.dhbwloe.campusapp.search.SearchIndices; public class WifiSettings extends CampusAppFragment { /* implement this for search results ;) */ public static SearchIndices[] GetSearchIndices() { - return new SearchIndices[] { + return new SearchIndices[]{ new SearchIndices("WifiSettings", true) {{ setUpdateTime(1); setTarget("#WifiSettings"); @@ -53,13 +68,14 @@ public class WifiSettings extends CampusAppFragment { WIFI_AUTHTYPE_WPA, WIFI_AUTHTYPE_WPA_ENTERPRISE, }; + private class WifiNetworkSettingsSet { String name; String ssid; WifiNetworkAuthenticationTypes authType; int[] authAlgorithms; - int eapMethod; - int phase2Method; + int eapMethod; + int phase2Method; String caCertStr; String caName; @@ -69,6 +85,7 @@ public class WifiSettings extends CampusAppFragment { String password; TabLayout.Tab tab; + boolean isInScanResult = false; public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) { this.name = name; @@ -110,16 +127,33 @@ public class WifiSettings extends CampusAppFragment { } public X509Certificate generateCertificate() throws CertificateException, IOException { - byte [] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT); - return (X509Certificate)CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded)); + byte[] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT); + return (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded)); } } private View view; private TabLayout tablayout; private WifiNetworkSettingsSet[] wifiPresets; - private WifiManager wifimanager; + private WifiManager wifiManager; + private ConnectivityManager connectivityManager; private int selectedNetworkIndex = 0; + private boolean networkScanned = false; + private BroadcastReceiver wifiStateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context arg0, Intent arg1) { + NetworkInfo networkInfo = (NetworkInfo) arg1.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); + if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { + updateWifiState(); + } + } + }; + private BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context arg0, Intent arg1) { + updateWifiScanState(); + } + }; private void loadDhbwWifiDefinitions() { int numOfNetworks = 3; @@ -222,8 +256,8 @@ public class WifiSettings extends CampusAppFragment { wifiConfig.enterpriseConfig = enterpriseConfig; break; } - int networkId = wifimanager.addNetwork(wifiConfig); - wifimanager.enableNetwork(networkId, true); + int networkId = wifiManager.addNetwork(wifiConfig); + wifiManager.enableNetwork(networkId, true); } @@ -233,7 +267,8 @@ public class WifiSettings extends CampusAppFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); loadDhbwWifiDefinitions(); - wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE); + wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE); + connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE); } private void updateSelectedNetworkInformation() { @@ -249,20 +284,44 @@ public class WifiSettings extends CampusAppFragment { TextView phase2InfoView = (TextView) view.findViewById(R.id.phase2Info); TextView cacertInfoView = (TextView) view.findViewById(R.id.cacertInfo); + TableRow eapInfoRow = (TableRow) view.findViewById(R.id.eapInfoRow); + TableRow phase2InfoRow = (TableRow) view.findViewById(R.id.phase2InfoRow); + TableRow cacertInfoRow = (TableRow) view.findViewById(R.id.cacertInfoRow); + TableRow pskInfoRow = (TableRow) view.findViewById(R.id.pskInfoRow); + + RelativeLayout insecureNetWarning = (RelativeLayout) view.findViewById(R.id.insecureNetWarning); + + ssidInfoView.setText(settings.ssid); + + eapInfoRow.setVisibility(View.GONE); + phase2InfoRow.setVisibility(View.GONE); + cacertInfoRow.setVisibility(View.GONE); + pskInfoRow.setVisibility(View.GONE); + insecureNetWarning.setVisibility(View.GONE); + switch(settings.authType) { case WIFI_AUTHTYPE_NONE: securityInfoView.setText(R.string.wifiopts_security_open); + + insecureNetWarning.setVisibility(View.VISIBLE); break; case WIFI_AUTHTYPE_WEP: securityInfoView.setText(R.string.wifiopts_security_wep); + insecureNetWarning.setVisibility(View.VISIBLE); // unsupported! break; case WIFI_AUTHTYPE_WPA: securityInfoView.setText(R.string.wifiopts_security_wpa); + + pskInfoRow.setVisibility(View.VISIBLE); break; case WIFI_AUTHTYPE_WPA_ENTERPRISE: securityInfoView.setText(R.string.wifiopts_security_wpa_enterprise); + + eapInfoRow.setVisibility(View.VISIBLE); + phase2InfoRow.setVisibility(View.VISIBLE); + cacertInfoRow.setVisibility(View.VISIBLE); break; } @@ -303,11 +362,75 @@ public class WifiSettings extends CampusAppFragment { cacertInfoView.setText(settings.caName); } else { - eapInfoView.setText("-"); - phase2InfoView.setText("-"); - cacertInfoView.setText("-"); + + } + updateWifiConnectButton(); + } + + private void updateWifiState() { + NetworkInfo myNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + WifiInfo myWifiInfo = wifiManager.getConnectionInfo(); + + Resources resources = AppContext.getMainActivity().getResources(); + String status; + if(myNetworkInfo.isConnectedOrConnecting()) { + int statusId = (myNetworkInfo.isConnected() ? R.string.wifisettings_status_connected : R.string.wifisettings_status_connecting); + + String ssid = myWifiInfo.getSSID(); + + status = String.format(resources.getString(statusId), ssid); + } else { + status = resources.getString(R.string.wifisettings_status_disconnected); + } + + TextView statusTextView = (TextView)view.findViewById(R.id.wifiStatusText); + statusTextView.setText(status); + updateWifiConnectButton(); + } + + private void updateWifiScanState() { + networkScanned = true; + List scanResultList = wifiManager.getScanResults(); + for(int i = 0; i < wifiPresets.length; i++) { + boolean networkFound = false; + for(ScanResult result : scanResultList) { + if(result.SSID != null && result.SSID.equalsIgnoreCase(wifiPresets[i].ssid)) { + networkFound = true; + break; + } + } + wifiPresets[i].isInScanResult = networkFound; + } + updateWifiConnectButton(); + } + + private void updateWifiConnectButton() { + if(selectedNetworkIndex >= wifiPresets.length) + return; + WifiNetworkSettingsSet preset = wifiPresets[selectedNetworkIndex]; + + boolean buttonEnabled = false; + int buttonTextId = 0; + NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + WifiInfo wifiInfo = wifiManager.getConnectionInfo(); + + if(!wifiManager.isWifiEnabled()) { + buttonTextId = R.string.wifisettings_connect_button_disabled; + } else if(networkInfo.isConnectedOrConnecting() && wifiInfo.getSSID() != null && wifiInfo.getSSID().equalsIgnoreCase(preset.ssid)) { + buttonTextId = R.string.wifisettings_connect_button_ready; + } else if(!networkScanned) { + buttonTextId = R.string.wifisettings_connect_button_scan; + } else if(!preset.isInScanResult) { + buttonTextId = R.string.wifisettings_connect_button_notfound; + buttonEnabled = true; + } else { + buttonEnabled = true; + buttonTextId = R.string.wifisettings_connect_button; } + Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn); + connectBtn.setEnabled(buttonEnabled); + connectBtn.setText(buttonTextId); } @Override @@ -347,6 +470,13 @@ public class WifiSettings extends CampusAppFragment { public void onClick(View v) { Button connectBtn = (Button) v; connectBtn.setEnabled(false); + WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex]; + if(!settings.isInScanResult) { + networkScanned = false; + wifiManager.startScan(); + updateWifiConnectButton(); + return; + } EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername); EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword); @@ -358,7 +488,7 @@ public class WifiSettings extends CampusAppFragment { // connectToDHWiFi not supported! // do something else? } else if (username.length() > 0 && password.length() > 0) { - WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex]; + if(settings != null) { settings.setAuthData(username, password); connectToWiFi(settings); @@ -369,7 +499,37 @@ public class WifiSettings extends CampusAppFragment { } }); + updateWifiState(); + updateWifiScanState(); + return view; } + @Override + public void onResume() { + super.onResume(); + + if(AppContext == null) + AppContext = CampusAppContext.getInstance(); + + AppContext.getMainActivity().registerReceiver(this.wifiStateReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + AppContext.getMainActivity().registerReceiver(this.wifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); + + networkScanned = false; + wifiManager.startScan(); + updateWifiConnectButton(); + + Log.i("WifiSettings", "registered wifi state receiver"); + } + + @Override + public void onPause() { + super.onPause(); + + AppContext.getMainActivity().unregisterReceiver(this.wifiStateReceiver); + AppContext.getMainActivity().unregisterReceiver(this.wifiScanReceiver); + + Log.i("WifiSettings", "unregistered wifi state receiver"); + } + }