<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-feature
android:name="android.hardware.nfc"
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.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.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;
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");
WIFI_AUTHTYPE_WPA,
WIFI_AUTHTYPE_WPA_ENTERPRISE,
};
+
private class WifiNetworkSettingsSet {
String name;
String ssid;
WifiNetworkAuthenticationTypes authType;
int[] authAlgorithms;
- int eapMethod;
- int phase2Method;
+ int eapMethod;
+ int phase2Method;
String caCertStr;
String caName;
String password;
TabLayout.Tab tab;
+ boolean isInScanResult = false;
public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) {
this.name = name;
}
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));
+ 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 WifiManager wifimanager;
+ private WifiManager wifiManager;
+ 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) {
+ updateWifiState();
+ }
+ }
+ };
+ private BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context arg0, Intent arg1) {
+ updateWifiScanState();
+ }
+ };
private void loadDhbwWifiDefinitions() {
int numOfNetworks = 3;
wifiConfig.enterpriseConfig = enterpriseConfig;
break;
}
- int networkId = wifimanager.addNetwork(wifiConfig);
- wifimanager.enableNetwork(networkId, true);
+ int networkId = wifiManager.addNetwork(wifiConfig);
+ wifiManager.enableNetwork(networkId, true);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadDhbwWifiDefinitions();
- wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
+ wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
+ connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE);
}
private void updateSelectedNetworkInformation() {
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.ssid);
+
+ eapInfoRow.setVisibility(View.GONE);
+ phase2InfoRow.setVisibility(View.GONE);
+ cacertInfoRow.setVisibility(View.GONE);
+ pskInfoRow.setVisibility(View.GONE);
+ insecureNetWarning.setVisibility(View.GONE);
+
switch(settings.authType) {
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;
}
cacertInfoView.setText(settings.caName);
} else {
- eapInfoView.setText("-");
- phase2InfoView.setText("-");
- cacertInfoView.setText("-");
+
+ }
+ updateWifiConnectButton();
+ }
+
+ private void updateWifiState() {
+ NetworkInfo myNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
+ WifiInfo myWifiInfo = wifiManager.getConnectionInfo();
+
+ 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();
+
+ 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<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].ssid)) {
+ networkFound = true;
+ break;
+ }
+ }
+ wifiPresets[i].isInScanResult = networkFound;
+ }
+ updateWifiConnectButton();
+ }
+
+ private void updateWifiConnectButton() {
+ if(selectedNetworkIndex >= wifiPresets.length)
+ return;
+ WifiNetworkSettingsSet 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.ssid)) {
+ 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 {
+ buttonEnabled = true;
+ buttonTextId = R.string.wifisettings_connect_button;
}
+ Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
+ connectBtn.setEnabled(buttonEnabled);
+ connectBtn.setText(buttonTextId);
}
@Override
public void onClick(View v) {
Button connectBtn = (Button) v;
connectBtn.setEnabled(false);
+ WifiNetworkSettingsSet 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);
// connectToDHWiFi not supported!
// do something else?
} else if (username.length() > 0 && password.length() > 0) {
- WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
+
if(settings != null) {
settings.setAuthData(username, password);
connectToWiFi(settings);
}
});
+ updateWifiState();
+ updateWifiScanState();
+
return view;
}
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ if(AppContext == null)
+ AppContext = CampusAppContext.getInstance();
+
+ AppContext.getMainActivity().registerReceiver(this.wifiStateReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
+ 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");
+ }
+
}
android:layout_height="wrap_content"
android:text="@string/wifisettings_about_wifi" />
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/wifisettings_current_status"
+ android:id="@+id/textView14" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="{status}"
+ android:id="@+id/wifiStatusText"
+ android:layout_alignParentTop="true"
+ android:layout_toRightOf="@+id/textView14"
+ android:layout_toEndOf="@+id/textView14"
+ android:layout_marginLeft="8dp" />
+ </RelativeLayout>
+
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</android.support.design.widget.AppBarLayout>
- <RelativeLayout
+ <TableLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="8dp">
+ android:layout_height="wrap_content">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/wifisettings_ssid_caption"
- android:id="@+id/textView3" />
+ <TableRow
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/wifisettings_security_caption"
- android:id="@+id/textView4"
- android:layout_below="@+id/textView3"
- android:layout_alignLeft="@+id/textView3"
- android:layout_alignStart="@+id/textView3" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/wifisettings_ssid_caption"
+ android:id="@+id/textView3"
+ android:layout_weight="1" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/wifisettings_eap_caption"
- android:id="@+id/textView6"
- android:layout_below="@+id/textView4"
- android:layout_alignLeft="@+id/textView3"
- android:layout_alignStart="@+id/textView4" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="{ssid}"
+ android:id="@+id/ssidInfo"
+ android:paddingLeft="8dp"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:layout_weight="1" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/wifisettings_phase2_caption"
- android:id="@+id/textView7"
- android:layout_below="@+id/textView6"
- android:layout_alignLeft="@+id/textView3"
- android:layout_alignStart="@+id/textView6" />
+ </TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/wifisettings_cacert_caption"
- android:id="@+id/textView8"
- android:layout_below="@+id/textView7"
- android:layout_alignLeft="@+id/textView3"
- android:layout_alignStart="@+id/textView7" />
+ <TableRow
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="{ssid}"
- android:id="@+id/ssidInfo"
- android:paddingLeft="8dp"
- android:layout_toRightOf="@+id/textView7"
- android:layout_toEndOf="@+id/textView7" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/wifisettings_security_caption"
+ android:id="@+id/textView4"
+ android:layout_weight="1" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="{security}"
- android:id="@+id/securityInfo"
- android:paddingLeft="8dp"
- android:layout_below="@+id/textView3"
- android:layout_toRightOf="@+id/textView7"
- android:layout_toEndOf="@+id/textView7" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="{security}"
+ android:id="@+id/securityInfo"
+ android:paddingLeft="8dp"
+ android:layout_weight="1" />
+ </TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="{eap}"
- android:id="@+id/eapInfo"
- android:paddingLeft="8dp"
- android:layout_below="@+id/textView4"
- android:layout_toRightOf="@+id/textView7"
- android:layout_toEndOf="@+id/textView7" />
+ <TableRow
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/eapInfoRow">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="{phase2}"
- android:id="@+id/phase2Info"
- android:paddingLeft="8dp"
- android:layout_below="@+id/textView6"
- android:layout_toRightOf="@+id/textView7"
- android:layout_toEndOf="@+id/textView7" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/wifisettings_eap_caption"
+ android:id="@+id/textView6"
+ android:layout_weight="1" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="{eap}"
+ android:id="@+id/eapInfo"
+ android:paddingLeft="8dp"
+ android:layout_weight="1" />
+ </TableRow>
+
+ <TableRow
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/phase2InfoRow">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/wifisettings_phase2_caption"
+ android:id="@+id/textView7"
+ android:layout_weight="1" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="{phase2}"
+ android:id="@+id/phase2Info"
+ android:paddingLeft="8dp"
+ android:layout_weight="1" />
+ </TableRow>
+
+ <TableRow
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/cacertInfoRow">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/wifisettings_cacert_caption"
+ android:id="@+id/textView8"
+ android:layout_weight="1" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="{cacert}"
+ android:id="@+id/cacertInfo"
+ android:paddingLeft="8dp"
+ android:layout_weight="1" />
+ </TableRow>
+
+ <TableRow
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/pskInfoRow">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/wifisettings_psk_caption"
+ android:id="@+id/textView11"
+ android:layout_weight="1" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="{psk}"
+ android:id="@+id/pskInfo"
+ android:paddingLeft="8dp"
+ android:layout_weight="1" />
+ </TableRow>
+
+ <TableRow
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:measureWithLargestChild="false">
+
+ </TableRow>
+
+ </TableLayout>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/insecureNetWarning">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="{cacert}"
- android:id="@+id/cacertInfo"
- android:paddingLeft="8dp"
- android:layout_below="@+id/textView7"
- android:layout_toRightOf="@+id/textView7"
- android:layout_toEndOf="@+id/textView7" />
+ android:text="@string/wifisettings_insecure_network"
+ android:id="@+id/textView12"
+ android:layout_weight="2"
+ android:textColor="#FF0000" />
</RelativeLayout>
+
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
<string name="wifiopts_phase2_gtc">GTC</string>
<string name="wifisettings_connect_button">Jetzt Verbinden</string>
+ <string name="wifisettings_connect_button_notfound">Netzwerk nicht in Reichweite</string>
+ <string name="wifisettings_connect_button_scan">Scanning...</string>
+ <string name="wifisettings_connect_button_disabled">WLAN Adapter deaktiviert</string>
+ <string name="wifisettings_connect_button_ready">Verbunden!</string>
<string name="title_activity_settings">Settings</string>
+
+ <string name="wifisettings_current_status">WLAN Status:</string>
+ <string name="wifisettings_status_connected">Verbunden mit %1$s</string>
+ <string name="wifisettings_status_connecting">Verbinde mit %1$s...</string>
+ <string name="wifisettings_status_disconnected">Nicht Verbunden</string>
+
+
<!-- Strings related to Settings -->
<!-- Example General settings -->
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="mensacard_guthaben">Dein Guthaben:</string>
+ <string name="wifisettings_psk_caption">PSK:</string>
+ <string name="wifisettings_insecure_network">Achtung: Dieses Netzwerk ist potentiell unsicher!</string>
</resources>