alpha 0.0.2
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / fragments / WifiSettings.java
index d57671a83f759cb3caceb454c4df1a612a35b84c..615d7badad4acf4424709fbe9d7cf748436f6ba4 100644 (file)
@@ -2,23 +2,51 @@ 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;
+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.
@@ -26,18 +54,304 @@ 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 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;
+                    }
+                }
+
+                if(settings != null) {
+                    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,
@@ -45,12 +359,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);
@@ -58,40 +404,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)
-                    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");
+    }
 
 }