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=1ce70019a32a47e44d283259d6e0685076a9cee4;hp=a9bd972e6f71527e980944b9203d86b6379cdc27;hb=9a28e7b4c1520f629721693a04b4978fec9692e7;hpb=89252e3c22caf6dcccd0c50ad3a9282a53b5a890 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 a9bd972..1ce7001 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java @@ -12,6 +12,7 @@ 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; @@ -44,6 +45,8 @@ 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. @@ -62,88 +65,56 @@ public class WifiSettings extends CampusAppFragment { }; } - private enum WifiNetworkAuthenticationTypes { - WIFI_AUTHTYPE_NONE, - WIFI_AUTHTYPE_WEP, - WIFI_AUTHTYPE_WPA, - WIFI_AUTHTYPE_WPA_ENTERPRISE, - }; - - private class WifiNetworkSettingsSet { - String name; - String ssid; - WifiNetworkAuthenticationTypes authType; - int[] authAlgorithms; - int eapMethod; - int phase2Method; - - String caCertStr; - String caName; - - String usernameSuffix; - String username; - String password; - - TabLayout.Tab tab; - boolean isInScanResult = false; - - public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) { - this.name = name; - this.ssid = ssid; - this.authType = authType; - } - - 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 caname, String certificate) { - this.caName = caname; - this.caCertStr = certificate; - return this; - } - - public WifiNetworkSettingsSet setUserSuffix(String suffix) { - this.usernameSuffix = suffix; - return this; - } - - public void setAuthData(String username, String password) { - this.username = username; - this.password = password; - } - - public void setAuthData(String password) { - this.password = password; - } - - 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)); - } - } - private View view; private TabLayout tablayout; - private WifiNetworkSettingsSet[] wifiPresets; + 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 arg1) { - NetworkInfo networkInfo = (NetworkInfo) arg1.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); - if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { + 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(); } } @@ -155,120 +126,18 @@ public class WifiSettings extends CampusAppFragment { } }; - private void loadDhbwWifiDefinitions() { - int numOfNetworks = 3; - 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("Deutsche Telekom Root CA 2", "-----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)); - - wifiPresets[i++] = (new WifiNetworkSettingsSet("eduroam", "eduroam", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)). - setWpaEnterprise( - new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X}, - WifiEnterpriseConfig.Eap.PEAP, - WifiEnterpriseConfig.Phase2.MSCHAPV2, - null - ).setCACertificate("Deutsche Telekom Root CA 2", "-----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-----"). - setUserSuffix("@dhbw-loerrach.de"); - } - - - @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]); - - switch(settings.authType) { - case WIFI_AUTHTYPE_NONE: - break; - case WIFI_AUTHTYPE_WEP: - // not supported by our app - break; - case WIFI_AUTHTYPE_WPA: - - break; - case WIFI_AUTHTYPE_WPA_ENTERPRISE: - WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); - String username = settings.username; - if(settings.usernameSuffix != null) - username += settings.usernameSuffix; - enterpriseConfig.setIdentity(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; - break; - } - int networkId = wifiManager.addNetwork(wifiConfig); - wifiManager.enableNetwork(networkId, true); - } - - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - loadDhbwWifiDefinitions(); + + wifiPresets = WifiNetworkSettings.LoadNetworkSettingPresets(AppContext); + wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE); connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE); + + wifiConfigManager = new WifiConfigurationManager(wifiManager); } private void updateSelectedNetworkInformation() { @@ -277,7 +146,7 @@ public class WifiSettings extends CampusAppFragment { if(selectedNetworkIndex >= wifiPresets.length) return; - WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex]; + 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); @@ -292,7 +161,7 @@ public class WifiSettings extends CampusAppFragment { RelativeLayout insecureNetWarning = (RelativeLayout) view.findViewById(R.id.insecureNetWarning); - ssidInfoView.setText(settings.ssid); + ssidInfoView.setText(settings.getSSID()); eapInfoRow.setVisibility(View.GONE); phase2InfoRow.setVisibility(View.GONE); @@ -300,7 +169,7 @@ public class WifiSettings extends CampusAppFragment { pskInfoRow.setVisibility(View.GONE); insecureNetWarning.setVisibility(View.GONE); - switch(settings.authType) { + switch(settings.getAuthType()) { case WIFI_AUTHTYPE_NONE: securityInfoView.setText(R.string.wifiopts_security_open); @@ -325,9 +194,9 @@ public class WifiSettings extends CampusAppFragment { break; } - if(settings.authType == WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) { + if(settings.getAuthType() == WifiNetworkSettings.WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) { int eapStringId = 0; - switch(settings.eapMethod) { + switch(settings.getEapMethod()) { case WifiEnterpriseConfig.Eap.PEAP: eapStringId = R.string.wifiopts_eap_peap; break; @@ -347,7 +216,7 @@ public class WifiSettings extends CampusAppFragment { eapInfoView.setText(""); int phase2StringId = 0; - switch(settings.phase2Method) { + switch(settings.getPhase2Method()) { case WifiEnterpriseConfig.Phase2.MSCHAPV2: phase2StringId = R.string.wifiopts_phase2_mschapv2; break; @@ -360,7 +229,7 @@ public class WifiSettings extends CampusAppFragment { else phase2InfoView.setText(""); - cacertInfoView.setText(settings.caName); + cacertInfoView.setText(settings.getCAName()); } else { } @@ -370,15 +239,62 @@ public class WifiSettings extends CampusAppFragment { 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); - String ssid = myWifiInfo.getSSID(); + 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); } @@ -394,7 +310,7 @@ public class WifiSettings extends CampusAppFragment { 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)) { + if(result.SSID != null && result.SSID.equalsIgnoreCase(wifiPresets[i].getSSID())) { networkFound = true; break; } @@ -407,7 +323,7 @@ public class WifiSettings extends CampusAppFragment { private void updateWifiConnectButton() { if(selectedNetworkIndex >= wifiPresets.length) return; - WifiNetworkSettingsSet preset = wifiPresets[selectedNetworkIndex]; + WifiNetworkSettings preset = wifiPresets[selectedNetworkIndex]; boolean buttonEnabled = false; int buttonTextId = 0; @@ -416,8 +332,10 @@ public class WifiSettings extends CampusAppFragment { if(!wifiManager.isWifiEnabled()) { buttonTextId = R.string.wifisettings_connect_button_disabled; - } else if(networkInfo.isConnectedOrConnecting() && wifiInfo.getSSID() != null && wifiInfo.getSSID().equalsIgnoreCase(preset.ssid)) { + } 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) { @@ -445,7 +363,7 @@ public class WifiSettings extends CampusAppFragment { tablayout.removeAllTabs(); for(int i = 0; i < wifiPresets.length; i++) { TabLayout.Tab tab = tablayout.newTab(); - tab.setText(wifiPresets[i].name); + tab.setText(wifiPresets[i].getName()); tablayout.addTab(tab); } tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @@ -468,9 +386,7 @@ public class WifiSettings extends CampusAppFragment { connectBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Button connectBtn = (Button) v; - connectBtn.setEnabled(false); - WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex]; + WifiNetworkSettings settings = wifiPresets[selectedNetworkIndex]; if(!settings.isInScanResult) { networkScanned = false; wifiManager.startScan(); @@ -478,24 +394,24 @@ public class WifiSettings extends CampusAppFragment { return; } + + EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername); EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword); 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) { - + if (username.length() > 0 && password.length() > 0) { if(settings != null) { + settings.isTryConnecting = true; settings.setAuthData(username, password); - connectToWiFi(settings); + + wifiConfigManager.connect(settings); } - } - connectBtn.setEnabled(true); + updateWifiConnectButton(); + } } }); @@ -512,7 +428,10 @@ public class WifiSettings extends CampusAppFragment { if(AppContext == null) AppContext = CampusAppContext.getInstance(); - AppContext.getMainActivity().registerReceiver(this.wifiStateReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + 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;