X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fde%2Fdhbwloe%2Fcampusapp%2Ffragments%2FWifiSettings.java;h=1c7b337a88b6e6e04104682a3dcf4fe559af205e;hb=48e758721a39298a85c69ecc7267f3daf6993e78;hp=fceca54869de7be2dcd55218aa419dd62426ead7;hpb=25827b82d9683160f70d0ecc70ccc687c385e1af;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 fceca54..1c7b337 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java @@ -1,21 +1,48 @@ +/* WifiSettings.java + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ 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; @@ -25,10 +52,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. @@ -36,204 +67,68 @@ 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"); - setTitle("Wifi Settings"); - setDescription("WLAN Konfiguration für dieses Gerät"); - addKeyWord("wlan, secure, dhbw-secure, wifi, w-lan, wireless, internet, netzwerk"); + setTitle(R.string.search_wifi_title); + setDescription(R.string.search_wifi_description); + addKeyWord(R.string.search_wifi_keywords); }}, }; } - 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; - - 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; - } + 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 wifiInfo = wifiManager.getConnectionInfo(); + SupplicantState wifiState = ((SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)); + + wifiConfigManager.updateWifiState(wifiInfo, wifiState); + } - public WifiNetworkSettingsSet setPassword(String password) { - this.password = password; - return this; + updateWifiState(); } - - public WifiNetworkSettingsSet setCACertificate(String caname, String certificate) { - this.caName = caname; - this.caCertStr = certificate; - return this; + }; + private BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context arg0, Intent arg1) { + updateWifiScanState(); } + }; - 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; - } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - 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)); - } - } + wifiPresets = WifiNetworkSettings.LoadNetworkSettingPresets(AppContext); - private View view; - private TabLayout tablayout; - private WifiNetworkSettingsSet[] wifiPresets; - private WifiManager wifimanager; - private int selectedNetworkIndex = 0; + wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE); + connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE); - 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"); + wifiConfigManager = new WifiConfigurationManager(wifiManager, this); } - - @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; + public String trimWifiSSID(String ssid) { + if(ssid == null) + return null; + if(ssid.matches("^\"(.*)\"$")) { + ssid = ssid.substring(1, ssid.length()-1); } - int networkId = wifimanager.addNetwork(wifiConfig); - wifimanager.enableNetwork(networkId, true); - } - - - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - loadDhbwWifiDefinitions(); - wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE); + return ssid; } private void updateSelectedNetworkInformation() { @@ -242,33 +137,57 @@ 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); TextView phase2InfoView = (TextView) view.findViewById(R.id.phase2Info); TextView cacertInfoView = (TextView) view.findViewById(R.id.cacertInfo); - ssidInfoView.setText(settings.ssid); - switch(settings.authType) { + 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.getSSID()); + + 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: 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; } - 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; @@ -288,7 +207,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; @@ -301,13 +220,115 @@ public class WifiSettings extends CampusAppFragment { else phase2InfoView.setText(""); - cacertInfoView.setText(settings.caName); + cacertInfoView.setText(settings.getCAName()); } else { - eapInfoView.setText("-"); - phase2InfoView.setText("-"); - cacertInfoView.setText("-"); + + } + updateWifiConnectButton(); + } + + public void updateWifiState() { + NetworkInfo myNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + WifiInfo myWifiInfo = wifiManager.getConnectionInfo(); + String ssid = trimWifiSSID(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; + + Resources resources = AppContext.getMainActivity().getResources(); + String status; + if(myNetworkInfo.isConnectedOrConnecting()) { + int statusId = (myNetworkInfo.isConnected() ? R.string.wifisettings_status_connected : R.string.wifisettings_status_connecting); + 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].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(); + WifiConfigurationManager.WifiConnectionStatus status = wifiConfigManager.getWifiState(preset); + String ssid = trimWifiSSID(wifiInfo != null ? wifiInfo.getSSID() : null); + + Log.i("Wifi", ssid + "|" + preset.getSSID()); + + if(!wifiManager.isWifiEnabled()) { + buttonTextId = R.string.wifisettings_connect_button_disabled; + } else if(networkInfo.isConnectedOrConnecting() && ssid != null && ssid.equalsIgnoreCase(preset.getSSID()) && status == WifiConfigurationManager.WifiConnectionStatus.WIFISTATE_NULL) { + 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 { + buttonTextId = 0; + if(status != WifiConfigurationManager.WifiConnectionStatus.WIFISTATE_NULL) { + switch (status) { + case WIFISTATE_CONNECTING: + buttonTextId = R.string.wifisettings_connect_button_connecting; + break; + case WIFISTATE_AUTHENTICATING: + buttonTextId = R.string.wifisettings_connect_button_authenticating; + break; + case WIFISTATE_CONNECTED: + buttonTextId = R.string.wifisettings_connect_button_ready; + break; + case WIFISTATE_FAILED: + buttonTextId = R.string.wifisettings_connect_button_failed; + buttonEnabled = true; + break; + } + } + if(wifiConfigManager.isLocked(preset) && buttonTextId == 0) { + buttonTextId = R.string.wifisettings_connect_button_connecting; + } + + if(buttonTextId == 0) { + buttonEnabled = true; + buttonTextId = R.string.wifisettings_connect_button; + } } + Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn); + connectBtn.setEnabled(buttonEnabled); + connectBtn.setText(buttonTextId); } @Override @@ -322,7 +343,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() { @@ -345,8 +366,15 @@ public class WifiSettings extends CampusAppFragment { 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); @@ -354,22 +382,52 @@ 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[selectedNetworkIndex]; + if (username.length() > 0 && password.length() > 0) { if(settings != null) { settings.setAuthData(username, password); - connectToWiFi(settings); + + 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"); + } + }