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;
+import java.io.StringReader;
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.
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");
}
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 BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context arg0, Intent arg1) {
+ updateWifiScanState();
+ }
+ };
+
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ 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(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);
+
+
+ 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.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);
+
+
+ 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<ScanResult> 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,
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);
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)
- connectToDHWiFi(username, password);
+ 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;
}
- @TargetApi(18)
- private void connectToDHWiFi(String username, String password) {
- WifiConfiguration wifiConfig = new WifiConfiguration();
- wifiConfig.SSID = "dhbw-secure";
- wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
- wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ if(AppContext == null)
+ AppContext = CampusAppContext.getInstance();
- WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
- enterpriseConfig.setIdentity(username);
- enterpriseConfig.setPassword(password);
- enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PEAP);
- enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2);
- wifiConfig.enterpriseConfig = enterpriseConfig;
+ 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));
- WifiManager wfm = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
+ networkScanned = false;
+ wifiManager.startScan();
+ updateWifiConnectButton();
- int networkId = wfm.addNetwork(wifiConfig);
- wfm.enableNetwork(networkId, true);
+ 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");
+ }
}