diff --git a/res/layout/wifi_ap_configure.xml b/res/layout/wifi_ap_configure.xml
index e3ddf35bc6b..f8eb39a62bd 100644
--- a/res/layout/wifi_ap_configure.xml
+++ b/res/layout/wifi_ap_configure.xml
@@ -66,7 +66,7 @@
-
-
-
-
+
+
+
+
diff --git a/src/com/android/settings/wifi/AccessPointDialog.java b/src/com/android/settings/wifi/AccessPointDialog.java
index 43081a53c28..bf2007a9a5a 100644
--- a/src/com/android/settings/wifi/AccessPointDialog.java
+++ b/src/com/android/settings/wifi/AccessPointDialog.java
@@ -17,11 +17,14 @@
package com.android.settings.wifi;
import com.android.settings.R;
+import com.android.settings.SecuritySettings;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.content.res.Resources;
+import android.security.CertTool;
import android.security.Keystore;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
@@ -129,13 +132,13 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
private TextView mSecurityText;
private Spinner mSecuritySpinner;
private Spinner mWepTypeSpinner;
- private Keystore mKeystore;
+ private CertTool mCertTool;
public AccessPointDialog(Context context, WifiLayer wifiLayer) {
super(context);
mWifiLayer = wifiLayer;
- mKeystore = Keystore.getInstance();
+ mCertTool = CertTool.getInstance();
}
@Override
@@ -240,7 +243,7 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
setEnterpriseFieldsVisible(false);
} else if (mMode == MODE_INFO) {
- if (isEnterprise() && !mState.configured) {
+ if (mState.isEnterprise() && !mState.configured) {
setLayout(R.layout.wifi_ap_configure);
defaultPasswordVisibility = false;
setEnterpriseFieldsVisible(true);
@@ -287,16 +290,6 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
setButtons(positiveButtonResId, negativeButtonResId, neutralButtonResId);
}
- private boolean isEnterprise() {
-
- if(AccessPointState.WPA_EAP.equals(mState.security) ||
- AccessPointState.IEEE8021X.equals(mState.security)) {
- return true;
- } else {
- return false;
- }
- }
-
/** Called when we need to set our member variables to point to the views. */
private void onReferenceViews(View view) {
mPasswordText = (TextView) view.findViewById(R.id.password_text);
@@ -322,7 +315,8 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
mTable = (ViewGroup) view.findViewById(R.id.table);
}
/* for enterprise one */
- if (mMode == MODE_CONFIGURE || (isEnterprise() && !mState.configured)) {
+ if (mMode == MODE_CONFIGURE ||
+ (mState.isEnterprise() && !mState.configured)) {
setEnterpriseFields(view);
mEapSpinner.setSelection(getSelectionIndex(
R.array.wifi_eap_entries, mState.getEap()));
@@ -336,15 +330,14 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
}
private String[] getAllCaCertificateKeys() {
- return appendEmptyInSelection(mKeystore.getAllCaCertificateKeys());
+ return appendEmptyInSelection(mCertTool.getAllCaCertificateKeys());
}
private String[] getAllUserCertificateKeys() {
- return appendEmptyInSelection(mKeystore.getAllUserCertificateKeys());
+ return appendEmptyInSelection(mCertTool.getAllUserCertificateKeys());
}
private String[] appendEmptyInSelection(String[] keys) {
- if (keys.length == 0) return keys;
String[] selections = new String[keys.length + 1];
System.arraycopy(keys, 0, selections, 0, keys.length);
selections[keys.length] = NOT_APPLICABLE;
@@ -436,8 +429,9 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
if (!TextUtils.isEmpty(ssid)) {
mSsidEdit.setText(ssid);
}
-
- mPasswordEdit.setHint(R.string.wifi_password_unchanged);
+ if (mState.configured) {
+ mPasswordEdit.setHint(R.string.wifi_password_unchanged);
+ }
}
updatePasswordCaption(mState.security);
@@ -505,15 +499,15 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
Log.w(TAG, "Assuming connecting to a new network.");
}
- if (isEnterprise()) {
+ if (mState.isEnterprise()) {
if(!mState.configured) {
updateEnterpriseFields(
AccessPointState.WPA_EAP.equals(mState.security) ?
SECURITY_WPA_EAP : SECURITY_IEEE8021X);
}
- } else {
- updatePasswordField();
}
+ updatePasswordField();
+
mWifiLayer.connectToNetwork(mState);
}
@@ -558,58 +552,53 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
mState.setSsid(ssid);
int securityType = getSecurityTypeFromSpinner();
-
- if (!TextUtils.isEmpty(password)) {
- switch (securityType) {
-
- case SECURITY_WPA_PERSONAL: {
- mState.setSecurity(AccessPointState.WPA);
- mState.setPassword(password);
- break;
- }
-
- case SECURITY_WPA2_PERSONAL: {
- mState.setSecurity(AccessPointState.WPA2);
- mState.setPassword(password);
- break;
- }
-
- case SECURITY_AUTO: {
- mState.setPassword(password);
- break;
- }
-
- case SECURITY_WEP: {
- mState.setSecurity(AccessPointState.WEP);
- mState.setPassword(password,
- WEP_TYPE_VALUES[mWepTypeSpinner.getSelectedItemPosition()]);
- break;
- }
-
- }
- } else {
- switch (securityType) {
- case SECURITY_WPA_EAP:
- mState.setSecurity(AccessPointState.WPA_EAP);
- break;
- case SECURITY_IEEE8021X:
- mState.setSecurity(AccessPointState.IEEE8021X);
- break;
- default:
- mState.setSecurity(AccessPointState.OPEN);
- break;
- }
- if (isEnterprise() && !mState.configured) {
- updateEnterpriseFields(
- AccessPointState.WPA_EAP.equals(mState.security) ?
- SECURITY_WPA_EAP : SECURITY_IEEE8021X);
- }
+
+ if (!TextUtils.isEmpty(password) && (securityType != SECURITY_WEP)) {
+ mState.setPassword(password);
}
-
- if (securityType == SECURITY_NONE) {
- mState.setSecurity(AccessPointState.OPEN);
+
+ switch (securityType) {
+ case SECURITY_WPA_PERSONAL: {
+ mState.setSecurity(AccessPointState.WPA);
+ break;
+ }
+
+ case SECURITY_WPA2_PERSONAL: {
+ mState.setSecurity(AccessPointState.WPA2);
+ break;
+ }
+
+ case SECURITY_AUTO: {
+ break;
+ }
+
+ case SECURITY_WEP: {
+ mState.setSecurity(AccessPointState.WEP);
+ mState.setPassword(password, WEP_TYPE_VALUES[
+ mWepTypeSpinner.getSelectedItemPosition()]);
+ break;
+ }
+
+ case SECURITY_WPA_EAP:
+ mState.setSecurity(AccessPointState.WPA_EAP);
+ break;
+
+ case SECURITY_IEEE8021X:
+ mState.setSecurity(AccessPointState.IEEE8021X);
+ break;
+
+ case SECURITY_NONE:
+ default:
+ mState.setSecurity(AccessPointState.OPEN);
+ break;
}
-
+
+ if (mState.isEnterprise() && !mState.configured) {
+ updateEnterpriseFields(
+ AccessPointState.WPA_EAP.equals(mState.security) ?
+ SECURITY_WPA_EAP : SECURITY_IEEE8021X);
+ }
+
if (!mWifiLayer.saveNetwork(mState)) {
return;
}
@@ -649,13 +638,13 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
Spinner spinner = mClientCertSpinner;
int index = spinner.getSelectedItemPosition();
if (index != (spinner.getCount() - 1)) {
- String key = getAllUserCertificateKeys()[index];
- value = mKeystore.getUserCertificate(key);
+ String key = (String)spinner.getSelectedItem();
+ value = mCertTool.getUserCertificate(key);
if (!TextUtils.isEmpty(value)) {
mState.setEnterpriseField(AccessPointState.CLIENT_CERT,
value);
}
- value = mKeystore.getUserPrivateKey(key);
+ value = mCertTool.getUserPrivateKey(key);
if (!TextUtils.isEmpty(value)) {
mState.setEnterpriseField(AccessPointState.PRIVATE_KEY,
value);
@@ -664,8 +653,8 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
spinner = mCaCertSpinner;
index = spinner.getSelectedItemPosition();
if (index != (spinner.getCount() - 1)) {
- String key = getAllCaCertificateKeys()[index];
- value = mKeystore.getCaCertificate(key);
+ String key = (String)spinner.getSelectedItem();
+ value = mCertTool.getCaCertificate(key);
if (!TextUtils.isEmpty(value)) {
mState.setEnterpriseField(AccessPointState.CA_CERT,
value);
@@ -738,7 +727,6 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
mEnterpriseView.setVisibility(visibility);
if (visible) {
setWepVisible(false);
- setGenericPasswordVisible(false);
}
if (mMode != MODE_CONFIGURE) {
mSsidText.setVisibility(View.GONE);
@@ -792,7 +780,17 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
}
case SECURITY_WPA_EAP:
case SECURITY_IEEE8021X: {
+ // Unlock the keystore if it is not unlocked yet.
+ if (Keystore.getInstance().getState() != Keystore.UNLOCKED) {
+ getContext().startActivity(new Intent(
+ SecuritySettings.ACTION_UNLOCK_CREDENTIAL_STORAGE));
+ mSecuritySpinner.setSelection(0);
+ return;
+ }
setEnterpriseFieldsVisible(true);
+ setGenericPasswordVisible(true);
+ // Both WPA and WPA2 show the same caption, so either is ok
+ updatePasswordCaption(AccessPointState.WPA);
break;
}
}
diff --git a/src/com/android/settings/wifi/AccessPointState.java b/src/com/android/settings/wifi/AccessPointState.java
index 7ea2dc91bdf..8fb651bc012 100644
--- a/src/com/android/settings/wifi/AccessPointState.java
+++ b/src/com/android/settings/wifi/AccessPointState.java
@@ -276,7 +276,12 @@ public final class AccessPointState implements Comparable, Par
requestRefresh();
}
}
-
+
+ public boolean isEnterprise() {
+ return (WPA_EAP.equals(security) ||
+ AccessPointState.IEEE8021X.equals(security));
+ }
+
public void setSecurity(String security) {
if (TextUtils.isEmpty(this.security) || !this.security.equals(security)) {
this.security = security;
@@ -592,14 +597,17 @@ public final class AccessPointState implements Comparable, Par
} else if (security.equals(OPEN)) {
config.allowedKeyManagement.set(KeyMgmt.NONE);
- } else if (security.equals(WPA_EAP)) {
+ } else if (security.equals(WPA_EAP) || security.equals(IEEE8021X)) {
config.allowedGroupCiphers.set(GroupCipher.TKIP);
config.allowedGroupCiphers.set(GroupCipher.CCMP);
- config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
- } else if (security.equals(IEEE8021X)) {
- config.allowedGroupCiphers.set(GroupCipher.TKIP);
- config.allowedGroupCiphers.set(GroupCipher.CCMP);
- config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
+ if (security.equals(WPA_EAP)) {
+ config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
+ } else {
+ config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
+ }
+ if (!TextUtils.isEmpty(mPassword)) {
+ config.password = convertToQuotedString(mPassword);
+ }
}
}
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index d2683c0f44f..a0155343a20 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -18,6 +18,7 @@ package com.android.settings.wifi;
import com.android.settings.ProgressCategory;
import com.android.settings.R;
+import com.android.settings.SecuritySettings;
import android.app.Dialog;
import android.content.DialogInterface;
@@ -29,6 +30,7 @@ import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.preference.CheckBoxPreference;
import android.provider.Settings;
+import android.security.Keystore;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
@@ -259,7 +261,7 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
@Override
public boolean onContextItemSelected(MenuItem item) {
-
+
AccessPointState state = getStateFromMenuInfo(item.getMenuInfo());
if (state == null) {
return false;
@@ -352,6 +354,12 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
}
public void showAccessPointDialog(AccessPointState state, int mode) {
+ if (state.isEnterprise() &&
+ Keystore.getInstance().getState() != Keystore.UNLOCKED) {
+ startActivity(new Intent(
+ SecuritySettings.ACTION_UNLOCK_CREDENTIAL_STORAGE));
+ return;
+ }
AccessPointDialog dialog = new AccessPointDialog(this, mWifiLayer);
dialog.setMode(mode);
dialog.setState(state);