X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fde%2Fdhbwloe%2Fcampusapp%2Ffragments%2FWifiSettings.java;h=1ce70019a32a47e44d283259d6e0685076a9cee4;hb=9a28e7b4c1520f629721693a04b4978fec9692e7;hp=c172ed5f241f0e10da180a002c94031218eef751;hpb=b5169aeadcc32f9c7388447e5bf9096936837072;p=DHBWCampusApp.git 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 c172ed5..1ce7001 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java @@ -2,18 +2,35 @@ 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.SupplicantState; 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; import java.io.IOException; @@ -22,10 +39,14 @@ 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; +import de.dhbwloe.campusapp.wifi.WifiConfigurationManager; +import de.dhbwloe.campusapp.wifi.WifiNetworkSettings; /** * A simple {@link Fragment} subclass. @@ -33,7 +54,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"); @@ -44,150 +65,291 @@ public class WifiSettings extends CampusAppFragment { }; } - private enum WifiNetworkAuthenticationTypes { - WIFI_AUTHTYPE_NONE, - WIFI_AUTHTYPE_WEP, - WIFI_AUTHTYPE_WPA, - WIFI_AUTHTYPE_WPA_ENTERPRISE, + private View view; + private TabLayout tablayout; + private WifiNetworkSettings[] wifiPresets; + private WifiManager wifiManager; + private WifiConfigurationManager wifiConfigManager; + private ConnectivityManager connectivityManager; + private int selectedNetworkIndex = 0; + private boolean networkScanned = false; + private BroadcastReceiver wifiStateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context arg0, Intent intent) { + String action = intent.getAction(); + if(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)){ + WifiInfo myWifiInfo = wifiManager.getConnectionInfo(); + + WifiNetworkSettings settings = null; + for(int i = 0; i < wifiPresets.length; i++) { + if(wifiPresets[i].getSSID().equalsIgnoreCase(myWifiInfo.getSSID())) { + settings = wifiPresets[i]; + break; + } + } + + SupplicantState supl_state=((SupplicantState)intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)); + switch(supl_state){ + case ASSOCIATING: + settings.isAssociating = true; + settings.isAssociated = false; + settings.isAuthenticated = false; + settings.isDisconnected = false; + break; + case ASSOCIATED: + settings.isAssociated = true; + break; + case COMPLETED: + settings.isAuthenticated = true; + break; + case DISCONNECTED: + settings.isAssociated = false; + settings.isAssociating = false; + settings.isDisconnected = true; + break; + default: + break; + } + updateWifiState(); + } + + NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); + if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { + updateWifiState(); + } + } }; - private class WifiNetworkSettingsSet { - String name; - String ssid; - WifiNetworkAuthenticationTypes authType; - int[] authAlgorithms; - int eapMethod; - int phase2Method; - - String caCertStr; - - String username; - String password; - - public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) { - this.name = name; - this.ssid = ssid; - this.authType = authType; + private BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context arg0, Intent arg1) { + updateWifiScanState(); } + }; - public WifiNetworkSettingsSet setWpaEnterprise(int[] authAlgorithms, int eapMethod, int phase2Method, String username) { - this.authAlgorithms = authAlgorithms; - this.eapMethod = eapMethod; - this.phase2Method = phase2Method; - this.username = username; - return this; - } - public WifiNetworkSettingsSet setPassword(String password) { - this.password = password; - return this; - } - public WifiNetworkSettingsSet setCACertificate(String certificate) { - this.caCertStr = certificate; - return this; - } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - public void setAuthData(String username, String password) { - this.username = username; - this.password = password; - } + wifiPresets = WifiNetworkSettings.LoadNetworkSettingPresets(AppContext); - public void setAuthData(String password) { - this.password = password; - } + wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE); + connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE); - 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)); - } + wifiConfigManager = new WifiConfigurationManager(wifiManager); } - private View view; - private WifiNetworkSettingsSet[] wifiPresets; - private WifiManager wifimanager; - - private void loadDhbwWifiDefinitions() { - int numOfNetworks = 2; - int i = 0; - wifiPresets = new WifiNetworkSettingsSet[numOfNetworks]; - - wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)). - setWpaEnterprise( - new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X}, - WifiEnterpriseConfig.Eap.PEAP, - WifiEnterpriseConfig.Phase2.MSCHAPV2, - null - ).setCACertificate("-----BEGIN CERTIFICATE-----\n" + - "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" + - "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" + - "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" + - "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" + - "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" + - "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" + - "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" + - "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" + - "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" + - "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" + - "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" + - "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" + - "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" + - "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" + - "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" + - "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" + - "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" + - "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" + - "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" + - "Cm26OWMohpLzGITY+9HPBVZkVw==\n" + - "-----END CERTIFICATE-----"); - - wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE)); - } + private void updateSelectedNetworkInformation() { + if(view == null) + return; + if(selectedNetworkIndex >= wifiPresets.length) + return; + + WifiNetworkSettings settings = wifiPresets[selectedNetworkIndex]; + TextView ssidInfoView = (TextView) view.findViewById(R.id.ssidInfo); + TextView securityInfoView = (TextView) view.findViewById(R.id.securityInfo); + TextView eapInfoView = (TextView) view.findViewById(R.id.eapInfo); + 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); - @TargetApi(18) - private void connectToWiFi(WifiNetworkSettingsSet settings) { - WifiConfiguration wifiConfig = new WifiConfiguration(); - wifiConfig.SSID = settings.ssid; - for(int i = 0; i < settings.authAlgorithms.length; i++) - wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]); + ssidInfoView.setText(settings.getSSID()); - switch(settings.authType) { + eapInfoRow.setVisibility(View.GONE); + phase2InfoRow.setVisibility(View.GONE); + cacertInfoRow.setVisibility(View.GONE); + pskInfoRow.setVisibility(View.GONE); + insecureNetWarning.setVisibility(View.GONE); + + switch(settings.getAuthType()) { case WIFI_AUTHTYPE_NONE: + securityInfoView.setText(R.string.wifiopts_security_open); + + insecureNetWarning.setVisibility(View.VISIBLE); break; case WIFI_AUTHTYPE_WEP: - // not supported by our app + 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: - WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); - enterpriseConfig.setIdentity(settings.username); - enterpriseConfig.setPassword(settings.password); - enterpriseConfig.setEapMethod(settings.eapMethod); - enterpriseConfig.setPhase2Method(settings.phase2Method); - try { - enterpriseConfig.setCaCertificate(settings.generateCertificate()); - } catch (CertificateException e) { - } catch (IOException e) { - } - wifiConfig.enterpriseConfig = enterpriseConfig; + securityInfoView.setText(R.string.wifiopts_security_wpa_enterprise); + + eapInfoRow.setVisibility(View.VISIBLE); + phase2InfoRow.setVisibility(View.VISIBLE); + cacertInfoRow.setVisibility(View.VISIBLE); break; } - int networkId = wifimanager.addNetwork(wifiConfig); - wifimanager.enableNetwork(networkId, true); + + if(settings.getAuthType() == WifiNetworkSettings.WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) { + int eapStringId = 0; + switch(settings.getEapMethod()) { + case WifiEnterpriseConfig.Eap.PEAP: + eapStringId = R.string.wifiopts_eap_peap; + break; + case WifiEnterpriseConfig.Eap.TLS: + eapStringId = R.string.wifiopts_eap_tls; + break; + case WifiEnterpriseConfig.Eap.TTLS: + eapStringId = R.string.wifiopts_eap_ttls; + break; + case WifiEnterpriseConfig.Eap.PWD: + eapStringId = R.string.wifiopts_eap_pwd; + break; + } + if(eapStringId > 0) + eapInfoView.setText(eapStringId); + else + eapInfoView.setText(""); + + int phase2StringId = 0; + switch(settings.getPhase2Method()) { + case WifiEnterpriseConfig.Phase2.MSCHAPV2: + phase2StringId = R.string.wifiopts_phase2_mschapv2; + break; + case WifiEnterpriseConfig.Phase2.GTC: + phase2StringId = R.string.wifiopts_phase2_gtc; + break; + } + if(phase2StringId > 0) + phase2InfoView.setText(phase2StringId); + else + phase2InfoView.setText(""); + + cacertInfoView.setText(settings.getCAName()); + } else { + + } + updateWifiConnectButton(); } + private void updateWifiState() { + NetworkInfo myNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + WifiInfo myWifiInfo = wifiManager.getConnectionInfo(); + String ssid = (myWifiInfo != null ? myWifiInfo.getSSID() : null); + if(ssid == null) + return; + + WifiNetworkSettings settings = null; + for(int i = 0; i < wifiPresets.length; i++) { + if(wifiPresets[i].getSSID().equalsIgnoreCase(ssid)) { + settings = wifiPresets[i]; + break; + } + } + if(settings == null) + return; + + if(settings.isTryConnecting) { + boolean success = false; + if(settings.isDisconnected) { + settings.failedAuthentication = true; + settings.isTryConnecting = false; + } else if(settings.isAssociated) { + settings.isTryConnecting = false; + success = true; + } + if(!settings.isTryConnecting) { + // success + // TODO: continue + } + } + Resources resources = AppContext.getMainActivity().getResources(); + String status; + if(myNetworkInfo.isConnectedOrConnecting()) { + int statusId = (myNetworkInfo.isConnected() ? R.string.wifisettings_status_connected : R.string.wifisettings_status_connecting); - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - loadDhbwWifiDefinitions(); - wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE); + + ssid = ssid.replace("\"", ""); + status = String.format(resources.getString(statusId), ssid); + + + + + //if(networkConnecting && wifiPresets[connectingNetworkIndex].getSSID().equalsIgnoreCase(ssid)) { + + /* + + wifiConfigManager.finalizeConnection(wifiPresets[connectingNetworkIndex], myNetworkInfo, myWifiInfo, new WifiConfigurationManager.WifiConfigurationComplete() { + @Override + public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response) { + networkConnecting = false; + connectingNetworkIndex = 0; + updateWifiConnectButton(); + } + }); + */ + //} + } 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].getSSID())) { + networkFound = true; + break; + } + } + wifiPresets[i].isInScanResult = networkFound; + } + updateWifiConnectButton(); } + private void updateWifiConnectButton() { + if(selectedNetworkIndex >= wifiPresets.length) + return; + WifiNetworkSettings 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.getSSID())) { + buttonTextId = R.string.wifisettings_connect_button_ready; + } else if(preset.isTryConnecting) { + buttonTextId = R.string.wifisettings_connect_button_connecting; + } 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 public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -195,12 +357,44 @@ public class WifiSettings extends CampusAppFragment { view = inflater.inflate(R.layout.fragment_wifi_settings, container, false); AppContext.setTitle("DHBW WLAN Settings"); + updateSelectedNetworkInformation(); + + tablayout = (TabLayout) view.findViewById(R.id.tabs); + tablayout.removeAllTabs(); + for(int i = 0; i < wifiPresets.length; i++) { + TabLayout.Tab tab = tablayout.newTab(); + tab.setText(wifiPresets[i].getName()); + tablayout.addTab(tab); + } + tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + selectedNetworkIndex = tab.getPosition(); + updateSelectedNetworkInformation(); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn); connectBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Button connectBtn = (Button) v; - connectBtn.setEnabled(false); + WifiNetworkSettings 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); @@ -208,20 +402,53 @@ public class WifiSettings extends CampusAppFragment { String username = usernameEdt.getText().toString(); String password = passwordEdt.getText().toString(); - if (Build.VERSION.SDK_INT < 18) { - // connectToDHWiFi not supported! - // do something else? - } else if (username.length() > 0 && password.length() > 0) { - WifiNetworkSettingsSet settings = wifiPresets[0]; - settings.setAuthData(username, password); - connectToWiFi(settings); - } + if (username.length() > 0 && password.length() > 0) { + if(settings != null) { + settings.isTryConnecting = true; + settings.setAuthData(username, password); + + wifiConfigManager.connect(settings); + } - connectBtn.setEnabled(true); + updateWifiConnectButton(); + } } }); + updateWifiState(); + updateWifiScanState(); + return view; } + @Override + public void onResume() { + super.onResume(); + + if(AppContext == null) + AppContext = CampusAppContext.getInstance(); + + IntentFilter filter = new IntentFilter(); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); + AppContext.getMainActivity().registerReceiver(this.wifiStateReceiver, new IntentFilter(filter)); + 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"); + } + }