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 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.
};
}
- 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();
}
}
}
};
- 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() {
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);
RelativeLayout insecureNetWarning = (RelativeLayout) view.findViewById(R.id.insecureNetWarning);
- ssidInfoView.setText(settings.ssid);
+ ssidInfoView.setText(settings.getSSID());
eapInfoRow.setVisibility(View.GONE);
phase2InfoRow.setVisibility(View.GONE);
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);
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;
eapInfoView.setText("");
int phase2StringId = 0;
- switch(settings.phase2Method) {
+ switch(settings.getPhase2Method()) {
case WifiEnterpriseConfig.Phase2.MSCHAPV2:
phase2StringId = R.string.wifiopts_phase2_mschapv2;
break;
else
phase2InfoView.setText("");
- cacertInfoView.setText(settings.caName);
+ cacertInfoView.setText(settings.getCAName());
} else {
}
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);
}
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;
}
private void updateWifiConnectButton() {
if(selectedNetworkIndex >= wifiPresets.length)
return;
- WifiNetworkSettingsSet preset = wifiPresets[selectedNetworkIndex];
+ WifiNetworkSettings preset = wifiPresets[selectedNetworkIndex];
boolean buttonEnabled = false;
int buttonTextId = 0;
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) {
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() {
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();
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();
+ }
}
});
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;