Merge change 26396 into eclair
* changes:
b/2126036 Improve remote device capability identification by switching to use UUIDs instead of class bits.
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 908c955..367aa9c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -303,7 +303,8 @@
<action android:name="android.intent.action.MAIN" />
<action android:name="android.settings.SECURITY_SETTINGS" />
<action android:name="android.settings.LOCATION_SOURCE_SETTINGS" />
- <action android:name="android.security.UNLOCK_CREDENTIAL_STORAGE" />
+ <action android:name="android.credentials.UNLOCK" />
+ <action android:name="android.credentials.SYSTEM_INSTALL" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
<category android:name="com.android.settings.SHORTCUT" />
diff --git a/res/layout/installed_app_details.xml b/res/layout/installed_app_details.xml
index 13d3b10..2810604 100644
--- a/res/layout/installed_app_details.xml
+++ b/res/layout/installed_app_details.xml
@@ -304,7 +304,7 @@
android:layout_centerHorizontal="true"
android:layout_width="150dip"
android:text="@string/clear_activities"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content" />
</RelativeLayout>
<!-- Other controls section -->
@@ -320,6 +320,7 @@
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
+ android:paddingTop="6dip"
android:layout_width="150dip"
android:text="@string/force_stop"
android:layout_height="wrap_content" />
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 5ffba79..5191d83 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -53,7 +53,6 @@
<item>No animations</item>
<item>Some animations</item>
<item>All animations</item>
- <item>Slower all animations</item>
</string-array>
<!-- Display settings. Summary for each type of animation. -->
@@ -61,7 +60,6 @@
<item>No window animations are shown</item>
<item>Some window animations are shown</item>
<item>All window animations are shown</item>
- <item>Slower window animations are shown</item>
</string-array>
<!-- Do not translate. -->
@@ -72,8 +70,6 @@
<item>01</item>
<!-- Do not translate. -->
<item>11</item>
- <!-- Do not translate. -->
- <item>22</item>
</string-array>
<!-- Display settings. The delay in inactivity before the screen is turned off. These are shown ain a list dialog. -->
@@ -265,7 +261,7 @@
<item>None</item>
<item>PAP</item>
<item>MSCHAP</item>
- <item>MSCHAP2</item>
+ <item>MSCHAPV2</item>
<item>GTC</item>
</string-array>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6cdbc33..88163bd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1371,7 +1371,7 @@
<string name="filter_apps_all">All</string>
<!-- Text for filter option in ManageApps screen to display third party
applications only -->
- <string name="filter_apps_third_party">Third-party</string>
+ <string name="filter_apps_third_party">Downloaded</string>
<!-- Text for filter option in ManageApps screen to display list of running
packages only. -->
<string name="filter_apps_running">Running</string>
@@ -1381,7 +1381,7 @@
<!-- Manage applications, individual application screen, confirmation dialog title. Displays when user selects to "Clear data". -->
<string name="clear_data_dlg_title">Delete</string>
<!-- Manage applications, individual application screen, confirmation dialog message. Displays when user selects to "Clear data". It warns the user of the consequences of clearing the data for an app. -->
- <string name="clear_data_dlg_text">All information you\'ve saved in this application will be deleted permanently.</string>
+ <string name="clear_data_dlg_text">All of this application\'s data will be deleted permanently. This includes all files, settings, accounts, databases and so on.</string>
<!-- Manage applications, individual application screen, confirmation dialog button. Displays when user selects to "Clear data". Goes through with the clearing of the data. -->
<string name="dlg_ok">OK</string>
<!-- Manage applications, individual application screen, confirmation dialog button. Displays when user selects to "Clear data". -->
@@ -1422,8 +1422,9 @@
<string name="confirm_stop_service">Stop service?</string>
<!-- Running services, message of dialog to stop a service -->
<string name="confirm_stop_service_msg">The service will no longer run until
- started again by its application. This may have undesireable
- consequences.</string>
+ started again. This may have undesireable
+ consequences on the applicaton
+ <xliff:g id="application">%1$s</xliff:g>.</string>
<!-- Running services, button to stop a service -->
<string name="confirm_stop_stop">Stop</string>
<!-- Running services, button to cancel stopping of a service -->
@@ -1433,9 +1434,11 @@
<!-- Running services, description for a service in the started state -->
<string name="service_client_name"><xliff:g id="client_name">%1$s</xliff:g>: select to manage</string>
<!-- Running services, summary of background processes -->
- <string name="service_background_processes">Bg: <xliff:g id="memory">%2$s</xliff:g> (<xliff:g id="count">%1$d</xliff:g> procs)</string>
+ <string name="service_background_processes">Avail: <xliff:g id="memory">%2$s</xliff:g> (<xliff:g id="count">%1$d</xliff:g> procs)</string>
<!-- Running services, summary of foreground processes -->
- <string name="service_foreground_processes">Fg: <xliff:g id="memory">%2$s</xliff:g> (<xliff:g id="count">%1$d</xliff:g> procs)</string>
+ <string name="service_foreground_processes">Other: <xliff:g id="memory">%2$s</xliff:g> (<xliff:g id="count">%1$d</xliff:g> procs)</string>
+ <!-- Text to label a process entry with the process name. -->
+ <string name="service_process_name">Process: <xliff:g id="process">%1$s</xliff:g></string>
<!-- Language Settings --> <skip />
<!-- Title of setting on main settings screen. This item will take the user to the screen to tweak settings realted to locale and text -->
diff --git a/res/xml/appwidget_info.xml b/res/xml/appwidget_info.xml
index 22fb98a..2186dab 100644
--- a/res/xml/appwidget_info.xml
+++ b/res/xml/appwidget_info.xml
@@ -15,7 +15,7 @@
-->
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="311dip"
+ android:minWidth="294dip"
android:minHeight="72dip"
android:initialLayout="@layout/widget"
>
diff --git a/src/com/android/settings/ManageApplications.java b/src/com/android/settings/ManageApplications.java
index 34a1e43..3d03666 100644
--- a/src/com/android/settings/ManageApplications.java
+++ b/src/com/android/settings/ManageApplications.java
@@ -142,11 +142,11 @@
public static final int FILTER_APPS_RUNNING = MENU_OPTIONS_BASE + 4;
public static final int FILTER_OPTIONS = MENU_OPTIONS_BASE + 5;
// Alert Dialog presented to user to find out the filter option
- AlertDialog mAlertDlg;
+ private AlertDialog mAlertDlg;
// sort order
private int mSortOrder = SORT_ORDER_ALPHA;
// Filter value
- int mFilterApps = FILTER_APPS_ALL;
+ private int mFilterApps = FILTER_APPS_THIRD_PARTY;
// Custom Adapter used for managing items in the list
private AppInfoAdapter mAppInfoAdapter;
@@ -1577,6 +1577,7 @@
String action = intent.getAction();
if (action.equals(Intent.ACTION_MANAGE_PACKAGE_STORAGE)) {
mSortOrder = SORT_ORDER_SIZE;
+ mFilterApps = FILTER_APPS_ALL;
mSizesFirst = true;
}
mPm = getPackageManager();
diff --git a/src/com/android/settings/RunningServices.java b/src/com/android/settings/RunningServices.java
index a82292a..b7e2a50 100644
--- a/src/com/android/settings/RunningServices.java
+++ b/src/com/android/settings/RunningServices.java
@@ -169,9 +169,10 @@
int mRunningSeq;
ActivityManager.RunningAppProcessInfo mRunningProcessInfo;
- public ProcessItem(int uid, String processName) {
+ public ProcessItem(Context context, int uid, String processName) {
super(true);
- mDescription = processName;
+ mDescription = context.getResources().getString(
+ R.string.service_process_name, processName);
mUid = uid;
mProcessName = processName;
}
@@ -274,7 +275,7 @@
}
si.mDisplayLabel = si.mLabel;
}
- si.mPackageInfo = si.mServiceInfo;
+ si.mPackageInfo = si.mServiceInfo.applicationInfo;
mServices.put(service.service, si);
}
si.mCurSeq = mCurSeq;
@@ -312,7 +313,7 @@
boolean updateSize(Context context, Debug.MemoryInfo mem, int curSeq) {
mSize = ((long)mem.getTotalPss()) * 1024;
if (mCurSeq == curSeq) {
- String sizeStr = Formatter.formatFileSize(
+ String sizeStr = Formatter.formatShortFileSize(
context, mSize);
if (!sizeStr.equals(mSizeStr)){
mSizeStr = sizeStr;
@@ -415,7 +416,7 @@
ProcessItem proc = procs.get(si.process);
if (proc == null) {
changed = true;
- proc = new ProcessItem(si.uid, si.process);
+ proc = new ProcessItem(context, si.uid, si.process);
procs.put(si.process, proc);
}
@@ -453,7 +454,7 @@
// running list.
proc = mRunningProcesses.get(pi.pid);
if (proc == null) {
- proc = new ProcessItem(pi.uid, pi.processName);
+ proc = new ProcessItem(context, pi.uid, pi.processName);
proc.mPid = pi.pid;
mRunningProcesses.put(pi.pid, proc);
}
@@ -698,12 +699,14 @@
vh.description.setText(item.mDescription);
if (item.mIsProcess) {
view.setBackgroundColor(mProcessBgColor);
- vh.icon.setImageDrawable(item.mPackageInfo.loadIcon(getPackageManager()));
+ vh.icon.setImageDrawable(null);
+ vh.icon.setVisibility(View.GONE);
vh.description.setText(item.mDescription);
item.mCurSizeStr = null;
} else {
view.setBackgroundDrawable(null);
- vh.icon.setImageDrawable(null);
+ vh.icon.setImageDrawable(item.mPackageInfo.loadIcon(getPackageManager()));
+ vh.icon.setVisibility(View.VISIBLE);
vh.description.setText(item.mDescription);
ai.mFirstRunTime = item.mActiveSince;
}
@@ -765,7 +768,7 @@
|| mLastBackgroundProcessMemory != mState.mBackgroundProcessMemory) {
mLastNumBackgroundProcesses = mState.mNumBackgroundProcesses;
mLastBackgroundProcessMemory = mState.mBackgroundProcessMemory;
- String sizeStr = Formatter.formatFileSize(this, mLastBackgroundProcessMemory);
+ String sizeStr = Formatter.formatShortFileSize(this, mLastBackgroundProcessMemory);
mBackgroundProcessText.setText(getResources().getString(
R.string.service_background_processes, mLastNumBackgroundProcesses, sizeStr));
}
@@ -773,7 +776,7 @@
|| mLastForegroundProcessMemory != mState.mForegroundProcessMemory) {
mLastNumForegroundProcesses = mState.mNumForegroundProcesses;
mLastForegroundProcessMemory = mState.mForegroundProcessMemory;
- String sizeStr = Formatter.formatFileSize(this, mLastForegroundProcessMemory);
+ String sizeStr = Formatter.formatShortFileSize(this, mLastForegroundProcessMemory);
mForegroundProcessText.setText(getResources().getString(
R.string.service_foreground_processes, mLastNumForegroundProcesses, sizeStr));
}
@@ -806,7 +809,10 @@
mCurSelected = bi;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.confirm_stop_service);
- builder.setMessage(R.string.confirm_stop_service_msg);
+ String msg = getResources().getString(
+ R.string.confirm_stop_service_msg,
+ si.mPackageInfo.loadLabel(getPackageManager()));
+ builder.setMessage(msg);
builder.setPositiveButton(R.string.confirm_stop_stop, this);
builder.setNegativeButton(R.string.confirm_stop_cancel, null);
builder.setCancelable(true);
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 24b89b1..3d7a765 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -38,8 +38,8 @@
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.provider.Settings;
-import android.security.CertTool;
-import android.security.Keystore;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.text.Html;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
@@ -87,17 +87,12 @@
private static final String ASSISTED_GPS = "assisted_gps";
// Credential storage
- private static final String KEY_CSTOR_TYPE_NAME = "typeName";
- private static final String KEY_CSTOR_ITEM = "item";
- private static final String KEY_CSTOR_NAMESPACE = "namespace";
- private static final String KEY_CSTOR_DESCRIPTION = "description";
private static final int CSTOR_MIN_PASSWORD_LENGTH = 8;
private static final int CSTOR_INIT_DIALOG = 1;
private static final int CSTOR_CHANGE_PASSWORD_DIALOG = 2;
private static final int CSTOR_UNLOCK_DIALOG = 3;
private static final int CSTOR_RESET_DIALOG = 4;
- private static final int CSTOR_NAME_CREDENTIAL_DIALOG = 5;
private CstorHelper mCstorHelper = new CstorHelper();
@@ -162,7 +157,7 @@
showUseLocationDialog(true);
}
- mCstorHelper.handleCstorIntents(getIntent());
+ mCstorHelper.handleIntent(getIntent());
}
private PreferenceScreen createPreferenceHierarchy() {
@@ -236,10 +231,7 @@
PreferenceCategory credStoreCat = new PreferenceCategory(this);
credStoreCat.setTitle(R.string.cstor_settings_category);
root.addPreference(credStoreCat);
- credStoreCat.addPreference(mCstorHelper.createAccessCheckBox());
- credStoreCat.addPreference(mCstorHelper.createCertInstallPreference());
- credStoreCat.addPreference(mCstorHelper.createSetPasswordPreference());
- credStoreCat.addPreference(mCstorHelper.createResetPreference());
+ mCstorHelper.createPreferences(credStoreCat);
return root;
}
@@ -262,11 +254,8 @@
R.string.lockpattern_settings_choose_lock_pattern;
mChoosePattern.setTitle(chooseStringRes);
- mShowPassword
- .setChecked(Settings.System.getInt(getContentResolver(),
+ mShowPassword.setChecked(Settings.System.getInt(getContentResolver(),
Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
-
- mCstorHelper.resumeStates();
}
@Override
@@ -380,7 +369,6 @@
Settings.Secure.USE_LOCATION_FOR_SERVICES, use ? 1 : 0);
}
-
/**
* For the user to disable keyguard, we first make them verify their
* existing pattern.
@@ -447,7 +435,7 @@
}
@Override
- protected Dialog onCreateDialog (int id) {
+ protected Dialog onCreateDialog(int id) {
switch (id) {
case CSTOR_INIT_DIALOG:
case CSTOR_CHANGE_PASSWORD_DIALOG:
@@ -459,9 +447,6 @@
case CSTOR_RESET_DIALOG:
return mCstorHelper.createResetDialog();
- case CSTOR_NAME_CREDENTIAL_DIALOG:
- return mCstorHelper.createNameCredentialDialog();
-
default:
return null;
}
@@ -485,270 +470,151 @@
}
private class CstorHelper implements DialogInterface.OnClickListener,
- DialogInterface.OnDismissListener,
- DialogInterface.OnCancelListener {
- private Keystore mKeystore = Keystore.getInstance();
+ DialogInterface.OnDismissListener {
+ private KeyStore mKeyStore = KeyStore.getInstance();
+ private int mState;
+
private View mView;
private int mDialogId;
- private boolean mConfirm = true;
-
+ private boolean mRetry = false;
private CheckBoxPreference mAccessCheckBox;
private Preference mResetButton;
- private Intent mSpecialIntent;
- private CstorAddCredentialHelper mCstorAddCredentialHelper;
+ private Intent mExternalIntent;
- void handleCstorIntents(Intent intent) {
+ CstorHelper() {
+ mState = mKeyStore.test();
+ }
+
+ void handleIntent(Intent intent) {
if (intent == null) return;
String action = intent.getAction();
- if (CertTool.ACTION_ADD_CREDENTIAL.equals(action)) {
- mCstorAddCredentialHelper =
- new CstorAddCredentialHelper(intent);
- showCstorDialog(CSTOR_NAME_CREDENTIAL_DIALOG);
- } else if (Keystore.ACTION_UNLOCK_CREDENTIAL_STORAGE.equals(
- action)) {
- mSpecialIntent = intent;
- showCstorDialog(mCstorHelper.isCstorInitialized()
- ? CSTOR_UNLOCK_DIALOG
- : CSTOR_INIT_DIALOG);
+ if (Credentials.UNLOCK_ACTION.equals(action)) {
+ mExternalIntent = intent;
+ showCstorDialog(mState == KeyStore.UNINITIALIZED
+ ? CSTOR_INIT_DIALOG : CSTOR_UNLOCK_DIALOG);
+ } else if (Credentials.SYSTEM_INSTALL_ACTION.equals(action)) {
+ mExternalIntent = intent;
+ // TODO: unlock and install.
}
}
- void resumeStates() {
- int state = mCstorHelper.getCstorState();
- mAccessCheckBox.setEnabled(state != Keystore.UNINITIALIZED);
- mAccessCheckBox.setChecked(state == Keystore.UNLOCKED);
- mResetButton.setEnabled(state != Keystore.UNINITIALIZED);
+ private void updatePreferences(int state) {
+ mAccessCheckBox.setEnabled(state != KeyStore.UNINITIALIZED);
+ mAccessCheckBox.setChecked(state == KeyStore.NO_ERROR);
+ mResetButton.setEnabled(state != KeyStore.UNINITIALIZED);
+
+ // Show a toast message if the state is changed.
+ if (mState == state) return;
+ if (state == KeyStore.NO_ERROR) {
+ Toast.makeText(SecuritySettings.this, R.string.cstor_is_enabled,
+ Toast.LENGTH_SHORT).show();
+ } else if (state == KeyStore.UNINITIALIZED) {
+ Toast.makeText(SecuritySettings.this, R.string.cstor_is_reset,
+ Toast.LENGTH_LONG).show();
+ }
+ // TODO: disabled?
+ mState = state;
+ }
+
+ private void lockCstor() {
+ mKeyStore.lock();
+ updatePreferences(KeyStore.LOCKED);
+ }
+
+ private int unlockCstor(String passwd) {
+ mKeyStore.unlock(passwd);
+ return mKeyStore.getLastError();
+ }
+
+ private int changeCstorPassword(String oldPasswd, String newPasswd) {
+ mKeyStore.password(oldPasswd, newPasswd);
+ return mKeyStore.getLastError();
+ }
+
+ private void initCstor(String passwd) {
+ mKeyStore.password(passwd);
+ updatePreferences(KeyStore.NO_ERROR);
+ }
+
+ private void resetCstor() {
+ mKeyStore.reset();
+ updatePreferences(KeyStore.UNINITIALIZED);
}
private void showCstorDialog(int dialogId) {
mDialogId = dialogId;
showDialog(dialogId);
-
- if (dialogId == CSTOR_NAME_CREDENTIAL_DIALOG) {
- // set mView back as mView may be replaced by CSTOR_INIT_DIALOG
- // or CSTOR_UNLOCK_DIALOG
- mView = mCstorAddCredentialHelper.mView;
- }
- }
-
- private int getCstorState() {
- return mKeystore.getState();
- }
-
- private boolean isCstorUnlocked() {
- return (mKeystore.getState() == Keystore.UNLOCKED);
- }
-
- private boolean isCstorInitialized() {
- return (mKeystore.getState() != Keystore.UNINITIALIZED);
- }
-
- private void lockCstor() {
- mKeystore.lock();
- mAccessCheckBox.setChecked(false);
- }
-
- private int unlockCstor(String passwd) {
- int ret = mKeystore.unlock(passwd);
- if (ret == -1) resetCstor();
- if (ret == 0) {
- Toast.makeText(SecuritySettings.this, R.string.cstor_is_enabled,
- Toast.LENGTH_SHORT).show();
- }
- return ret;
- }
-
- private int changeCstorPassword(String oldPasswd, String newPasswd) {
- int ret = mKeystore.changePassword(oldPasswd, newPasswd);
- if (ret == -1) resetCstor();
- return ret;
- }
-
- private void initCstor(String passwd) {
- mKeystore.setPassword(passwd);
- enablePreferences(true);
- mAccessCheckBox.setChecked(true);
- Toast.makeText(SecuritySettings.this, R.string.cstor_is_enabled,
- Toast.LENGTH_SHORT).show();
- }
-
- private void resetCstor() {
- mKeystore.reset();
- enablePreferences(false);
- mAccessCheckBox.setChecked(false);
- Toast.makeText(SecuritySettings.this, R.string.cstor_is_reset,
- Toast.LENGTH_LONG).show();
- }
-
- private boolean addCredential() {
- if (mCstorAddCredentialHelper.saveToStorage() != 0) {
- // set mView back as mView may be replaced by CSTOR_INIT_DIALOG
- // or CSTOR_UNLOCK_DIALOG
- mView = mCstorAddCredentialHelper.mView;
- if (mCstorAddCredentialHelper.isPkcs12Keystore()) {
- showError(R.string.cstor_password_error);
- } else {
- showError(R.string.cstor_storage_error);
- }
- Log.d("CSTOR", "failed to add credential");
- return false;
- }
- Log.d("CSTOR", "credential is added: "
- + mCstorAddCredentialHelper.getName());
- String formatString =
- getString(R.string.cstor_is_added);
- String message = String.format(formatString,
- mCstorAddCredentialHelper.getName());
- Toast.makeText(SecuritySettings.this, message,
- Toast.LENGTH_LONG).show();
- return true;
- }
-
- public void onCancel(DialogInterface dialog) {
- if (mCstorAddCredentialHelper == null) return;
-
- switch (mDialogId) {
- case CSTOR_INIT_DIALOG:
- case CSTOR_UNLOCK_DIALOG:
- Toast.makeText(SecuritySettings.this,
- R.string.cstor_unable_to_save_cert,
- Toast.LENGTH_LONG).show();
- break;
-
- case CSTOR_NAME_CREDENTIAL_DIALOG:
- Toast.makeText(SecuritySettings.this,
- R.string.cstor_cert_not_saved,
- Toast.LENGTH_LONG).show();
- break;
- }
- mCstorAddCredentialHelper = null;
- finish();
}
public void onClick(DialogInterface dialog, int which) {
- if (which == DialogInterface.BUTTON_NEGATIVE) {
- onCancel(dialog);
- return;
- }
+ if (which == DialogInterface.BUTTON_NEGATIVE) return;
switch (mDialogId) {
case CSTOR_INIT_DIALOG:
case CSTOR_CHANGE_PASSWORD_DIALOG:
- mConfirm = checkPasswords((Dialog) dialog);
+ mRetry = !checkPasswords((Dialog) dialog);
break;
case CSTOR_UNLOCK_DIALOG:
- mConfirm = checkUnlockPassword((Dialog) dialog);
+ mRetry = !checkPassword((Dialog) dialog);
break;
case CSTOR_RESET_DIALOG:
resetCstor();
break;
-
- case CSTOR_NAME_CREDENTIAL_DIALOG:
- mConfirm = checkAddCredential();
- break;
}
}
public void onDismiss(DialogInterface dialog) {
- if (!mConfirm) {
- mConfirm = true;
+ if (mRetry) {
showCstorDialog(mDialogId);
} else {
- if (mDialogId == CSTOR_UNLOCK_DIALOG) {
- mAccessCheckBox.setChecked(isCstorUnlocked());
- }
-
- if (mCstorAddCredentialHelper != null) {
- if (!isCstorInitialized()) {
- showCstorDialog(CSTOR_INIT_DIALOG);
- } else if (!isCstorUnlocked()) {
- showCstorDialog(CSTOR_UNLOCK_DIALOG);
- } else {
- if (addCredential()) {
- // succeeded
- finish();
- } else {
- // failed
- if (mDialogId != CSTOR_NAME_CREDENTIAL_DIALOG) {
- removeDialog(mDialogId);
- }
- showCstorDialog(CSTOR_NAME_CREDENTIAL_DIALOG);
- }
- }
- return;
- } else if (mSpecialIntent != null) {
- finish();
- }
removeDialog(mDialogId);
- }
- }
- private void showResetWarning(int count) {
- TextView v = showError(count <= 3
- ? R.string.cstor_password_error_reset_warning
- : R.string.cstor_password_error);
- if (count <= 3) {
- if (count == 1) {
- v.setText(R.string.cstor_password_error_reset_warning);
- } else {
- String format = getString(
- R.string.cstor_password_error_reset_warning_plural);
- v.setText(String.format(format, count));
+ if (mExternalIntent != null) {
+ if (Credentials.SYSTEM_INSTALL_ACTION.equals(
+ mExternalIntent.getAction())) {
+ // TODO: install if unlocked.
+ } else {
+ finish();
+ }
}
}
}
- private boolean checkAddCredential() {
- hideError();
-
- String name = getText(R.id.cstor_credential_name);
- if (TextUtils.isEmpty(name)) {
- showError(R.string.cstor_name_empty_error);
+ // returns false if there is no error.
+ private boolean checkError(int error) {
+ if (error == KeyStore.NO_ERROR) {
+ updatePreferences(KeyStore.NO_ERROR);
return false;
}
-
- for (int i = 0, len = name.length(); i < len; i++) {
- if (!Character.isLetterOrDigit(name.charAt(i))) {
- showError(R.string.cstor_name_char_error);
- return false;
- }
+ if (error == KeyStore.UNINITIALIZED) {
+ updatePreferences(KeyStore.UNINITIALIZED);
+ return false;
}
-
- mCstorAddCredentialHelper.setName(name);
-
- if (mCstorAddCredentialHelper.isPkcs12Keystore()) {
- String password = getText(R.id.cstor_credential_password);
- if (TextUtils.isEmpty(password)) {
- showError(R.string.cstor_password_empty_error);
- return false;
- }
-
- mCstorAddCredentialHelper.setPassword(password);
+ if (error < KeyStore.WRONG_PASSWORD) {
+ return false;
}
-
+ int count = error - KeyStore.WRONG_PASSWORD + 1;
+ if (count > 3) {
+ showError(R.string.cstor_password_error);
+ return true;
+ }
+ TextView v = showError(R.string.cstor_password_error_reset_warning);
+ if (count == 1) {
+ v.setText(R.string.cstor_password_error_reset_warning);
+ } else {
+ String format = getString(
+ R.string.cstor_password_error_reset_warning_plural);
+ v.setText(String.format(format, count));
+ }
return true;
}
- // returns true if the password is long enough and does not contain
- // characters that we don't like
- private boolean verifyPassword(String passwd) {
- if (passwd == null) {
- showError(R.string.cstor_passwords_empty_error);
- return false;
- } else if (passwd.length() < CSTOR_MIN_PASSWORD_LENGTH) {
- showError(R.string.cstor_password_verification_error);
- return false;
- } else {
- return true;
- }
- }
-
- // returns true if the password is ok
- private boolean checkUnlockPassword(Dialog d) {
+ // returns true if the password is correct
+ private boolean checkPassword(Dialog d) {
hideError();
String passwd = getText(R.id.cstor_password);
@@ -757,17 +623,10 @@
return false;
}
- int count = unlockCstor(passwd);
- if (count > 0) {
- showResetWarning(count);
- return false;
- } else {
- // done or reset
- return true;
- }
+ return !checkError(unlockCstor(passwd));
}
- // returns true if the passwords are ok
+ // returns true if the passwords are correct
private boolean checkPasswords(Dialog d) {
hideError();
@@ -778,39 +637,22 @@
if ((mDialogId == CSTOR_CHANGE_PASSWORD_DIALOG)
&& TextUtils.isEmpty(oldPasswd)) {
showError(R.string.cstor_password_empty_error);
- return false;
- }
-
- if (TextUtils.isEmpty(newPasswd)
- && TextUtils.isEmpty(confirmPasswd)) {
+ } else if (TextUtils.isEmpty(newPasswd)
+ || TextUtils.isEmpty(confirmPasswd)) {
showError(R.string.cstor_passwords_empty_error);
- return false;
- }
-
- if (!verifyPassword(newPasswd)) {
- return false;
+ } else if (newPasswd.length() < CSTOR_MIN_PASSWORD_LENGTH) {
+ showError(R.string.cstor_password_verification_error);
} else if (!newPasswd.equals(confirmPasswd)) {
showError(R.string.cstor_passwords_error);
- return false;
- }
-
- if (mDialogId == CSTOR_CHANGE_PASSWORD_DIALOG) {
- int count = changeCstorPassword(oldPasswd, newPasswd);
- if (count > 0) {
- showResetWarning(count);
- return false;
+ } else {
+ if (mDialogId == CSTOR_CHANGE_PASSWORD_DIALOG) {
+ return !checkError(changeCstorPassword(oldPasswd, newPasswd));
} else {
- // done or reset
+ initCstor(newPasswd);
return true;
}
- } else {
- initCstor(newPasswd);
- return true;
}
- }
-
- private void installCertFromSdCard() {
- startActivity(new Intent(CertTool.ACTION_INSTALL_CERT_FROM_SDCARD));
+ return false;
}
private TextView showError(int messageId) {
@@ -820,40 +662,24 @@
return v;
}
+ private void hideError() {
+ hide(R.id.cstor_error);
+ }
+
private void hide(int viewId) {
View v = mView.findViewById(viewId);
if (v != null) v.setVisibility(View.GONE);
}
- private void hideError() {
- hide(R.id.cstor_error);
- }
-
private String getText(int viewId) {
return ((TextView) mView.findViewById(viewId)).getText().toString();
}
- private void setText(int viewId, String text) {
- TextView v = (TextView) mView.findViewById(viewId);
- if (v != null) v.setText(text);
- }
-
- private void setText(int viewId, int textId) {
- TextView v = (TextView) mView.findViewById(viewId);
- if (v != null) v.setText(textId);
- }
-
- private void enablePreferences(boolean enabled) {
- mAccessCheckBox.setEnabled(enabled);
- mResetButton.setEnabled(enabled);
- }
-
- private Preference createAccessCheckBox() {
- CheckBoxPreference pref = new CheckBoxPreference(
- SecuritySettings.this);
- pref.setTitle(R.string.cstor_access_title);
- pref.setSummary(R.string.cstor_access_summary);
- pref.setOnPreferenceChangeListener(
+ private void createPreferences(PreferenceCategory category) {
+ mAccessCheckBox = new CheckBoxPreference(SecuritySettings.this);
+ mAccessCheckBox.setTitle(R.string.cstor_access_title);
+ mAccessCheckBox.setSummary(R.string.cstor_access_summary);
+ mAccessCheckBox.setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(
Preference pref, Object value) {
@@ -865,53 +691,48 @@
return true;
}
});
- mAccessCheckBox = pref;
- return pref;
- }
+ category.addPreference(mAccessCheckBox);
- private Preference createCertInstallPreference() {
- Preference pref = new Preference(SecuritySettings.this);
- pref.setTitle(R.string.cstor_cert_install_title);
- pref.setSummary(R.string.cstor_cert_install_summary);
- pref.setOnPreferenceClickListener(
+ Preference install = new Preference(SecuritySettings.this);
+ install.setTitle(R.string.cstor_cert_install_title);
+ install.setSummary(R.string.cstor_cert_install_summary);
+ install.setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference pref) {
- installCertFromSdCard();
+ Credentials.getInstance().installFromSdCard(
+ SecuritySettings.this);
return true;
}
});
- return pref;
- }
+ category.addPreference(install);
- private Preference createSetPasswordPreference() {
- Preference pref = new Preference(SecuritySettings.this);
- pref.setTitle(R.string.cstor_set_passwd_title);
- pref.setSummary(R.string.cstor_set_passwd_summary);
- pref.setOnPreferenceClickListener(
+ Preference password = new Preference(SecuritySettings.this);
+ password.setTitle(R.string.cstor_set_passwd_title);
+ password.setSummary(R.string.cstor_set_passwd_summary);
+ password.setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference pref) {
- showCstorDialog(isCstorInitialized()
- ? CSTOR_CHANGE_PASSWORD_DIALOG
- : CSTOR_INIT_DIALOG);
+ showCstorDialog(mState == KeyStore.UNINITIALIZED
+ ? CSTOR_INIT_DIALOG
+ : CSTOR_CHANGE_PASSWORD_DIALOG);
return true;
}
});
- return pref;
- }
+ category.addPreference(password);
- private Preference createResetPreference() {
- Preference pref = new Preference(SecuritySettings.this);
- pref.setTitle(R.string.cstor_reset_title);
- pref.setSummary(R.string.cstor_reset_summary);
- pref.setOnPreferenceClickListener(
+ mResetButton = new Preference(SecuritySettings.this);
+ mResetButton.setTitle(R.string.cstor_reset_title);
+ mResetButton.setSummary(R.string.cstor_reset_summary);
+ mResetButton.setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference pref) {
showCstorDialog(CSTOR_RESET_DIALOG);
return true;
}
});
- mResetButton = pref;
- return pref;
+ category.addPreference(mResetButton);
+
+ updatePreferences(mState);
}
private Dialog createUnlockDialog() {
@@ -920,8 +741,7 @@
hideError();
// show extra hint only when the action comes from outside
- if ((mSpecialIntent == null)
- && (mCstorAddCredentialHelper == null)) {
+ if (mExternalIntent == null) {
hide(R.id.cstor_access_dialog_hint_from_action);
}
@@ -930,7 +750,6 @@
.setTitle(R.string.cstor_access_dialog_title)
.setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, this)
- .setOnCancelListener(this)
.create();
d.setOnDismissListener(this);
return d;
@@ -941,13 +760,6 @@
R.layout.cstor_set_password_dialog_view, null);
hideError();
- // show extra hint only when the action comes from outside
- if ((mSpecialIntent != null)
- || (mCstorAddCredentialHelper != null)) {
- setText(R.id.cstor_first_time_hint,
- R.string.cstor_first_time_hint_from_action);
- }
-
switch (id) {
case CSTOR_INIT_DIALOG:
mView.findViewById(R.id.cstor_old_password_block)
@@ -969,7 +781,6 @@
.setTitle(R.string.cstor_set_passwd_dialog_title)
.setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, this)
- .setOnCancelListener(this)
.create();
d.setOnDismissListener(this);
return d;
@@ -984,115 +795,5 @@
.setNegativeButton(getString(android.R.string.cancel), this)
.create();
}
-
- private Dialog createNameCredentialDialog() {
- mView = View.inflate(SecuritySettings.this,
- R.layout.cstor_name_credential_dialog_view, null);
- if (mCstorAddCredentialHelper != null) {
- mCstorAddCredentialHelper.mView = mView;
- }
-
- hideError();
- if (!mCstorAddCredentialHelper.isPkcs12Keystore()) {
- hide(R.id.cstor_credential_password_container);
- }
-
- setText(R.id.cstor_credential_name_title,
- R.string.cstor_credential_name);
- setText(R.id.cstor_credential_info_title,
- R.string.cstor_credential_info);
- setText(R.id.cstor_credential_info,
- mCstorAddCredentialHelper.getDescription().toString());
-
- Dialog d = new AlertDialog.Builder(SecuritySettings.this)
- .setView(mView)
- .setTitle(R.string.cstor_name_credential_dialog_title)
- .setPositiveButton(android.R.string.ok, this)
- .setNegativeButton(android.R.string.cancel, this)
- .setOnCancelListener(this)
- .create();
- d.setOnDismissListener(this);
- return d;
- }
- }
-
- private class CstorAddCredentialHelper {
- private String mTypeName;
- private List<byte[]> mItemList;
- private List<String> mNamespaceList;
- private String mDescription;
- private String mName;
- private String mPassword;
- private View mView;
-
- CstorAddCredentialHelper(Intent intent) {
- parse(intent);
- }
-
- String getTypeName() {
- return mTypeName;
- }
-
- boolean isPkcs12Keystore() {
- return CertTool.TITLE_PKCS12_KEYSTORE.equals(mTypeName);
- }
-
- CharSequence getDescription() {
- return Html.fromHtml(mDescription);
- }
-
- void setName(String name) {
- mName = name;
- }
-
- String getName() {
- return mName;
- }
-
- void setPassword(String password) {
- mPassword = password;
- }
-
- String getPassword() {
- return mPassword;
- }
-
- int saveToStorage() {
- if (isPkcs12Keystore()) {
- return CertTool.getInstance().addPkcs12Keystore(
- mItemList.get(0), mPassword, mName);
- } else {
- Keystore ks = Keystore.getInstance();
- for (int i = 0, count = mItemList.size(); i < count; i++) {
- byte[] blob = mItemList.get(i);
- int ret = ks.put(mNamespaceList.get(i), mName,
- new String(blob));
- if (ret != 0) return ret;
- }
- }
- return 0;
- }
-
- private void parse(Intent intent) {
- mTypeName = intent.getStringExtra(KEY_CSTOR_TYPE_NAME);
- mItemList = new ArrayList<byte[]>();
- mNamespaceList = new ArrayList<String>();
- for (int i = 0; ; i++) {
- byte[] blob = intent.getByteArrayExtra(KEY_CSTOR_ITEM + i);
- if (blob == null) break;
- mItemList.add(blob);
- mNamespaceList.add(intent.getStringExtra(
- KEY_CSTOR_NAMESPACE + i));
- }
-
- // build description string
- StringBuilder sb = new StringBuilder();
- for (int i = 0; ; i++) {
- String s = intent.getStringExtra(KEY_CSTOR_DESCRIPTION + i);
- if (s == null) break;
- sb.append(s).append("<br>");
- }
- mDescription = sb.toString();
- }
}
}
diff --git a/src/com/android/settings/vpn/L2tpIpsecEditor.java b/src/com/android/settings/vpn/L2tpIpsecEditor.java
index b14feb3..276ee2f 100644
--- a/src/com/android/settings/vpn/L2tpIpsecEditor.java
+++ b/src/com/android/settings/vpn/L2tpIpsecEditor.java
@@ -24,7 +24,8 @@
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceGroup;
-import android.security.CertTool;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.text.TextUtils;
/**
@@ -33,6 +34,8 @@
class L2tpIpsecEditor extends L2tpEditor {
private static final String TAG = L2tpIpsecEditor.class.getSimpleName();
+ private KeyStore mKeyStore = KeyStore.getInstance();
+
private ListPreference mUserCertificate;
private ListPreference mCaCertificate;
@@ -67,7 +70,7 @@
mUserCertificate = createListPreference(c,
R.string.vpn_user_certificate_title,
mProfile.getUserCertificate(),
- CertTool.getInstance().getAllUserCertificateKeys(),
+ mKeyStore.saw(Credentials.USER_CERTIFICATE),
new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(
Preference pref, Object newValue) {
@@ -86,7 +89,7 @@
mCaCertificate = createListPreference(c,
R.string.vpn_ca_certificate_title,
mProfile.getCaCertificate(),
- CertTool.getInstance().getAllCaCertificateKeys(),
+ mKeyStore.saw(Credentials.CA_CERTIFICATE),
new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(
Preference pref, Object newValue) {
diff --git a/src/com/android/settings/vpn/VpnSettings.java b/src/com/android/settings/vpn/VpnSettings.java
index eea0aca..d0c6a89 100644
--- a/src/com/android/settings/vpn/VpnSettings.java
+++ b/src/com/android/settings/vpn/VpnSettings.java
@@ -47,8 +47,8 @@
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceClickListener;
-import android.security.CertTool;
-import android.security.Keystore;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
@@ -109,9 +109,8 @@
private static final int NO_ERROR = VpnManager.VPN_ERROR_NO_ERROR;
- private static final String NAMESPACE_VPN = "vpn";
- private static final String KEY_PREFIX_IPSEC_PSK = "ipsk000";
- private static final String KEY_PREFIX_L2TP_SECRET = "lscrt000";
+ private static final String KEY_PREFIX_IPSEC_PSK = Credentials.VPN + 'i';
+ private static final String KEY_PREFIX_L2TP_SECRET = Credentials.VPN + 'l';
private PreferenceScreen mAddVpn;
private PreferenceCategory mVpnListContainer;
@@ -129,6 +128,8 @@
// states saved for unlocking keystore
private Runnable mUnlockAction;
+ private KeyStore mKeyStore = KeyStore.getInstance();
+
private VpnManager mVpnManager = new VpnManager(this);
private ConnectivityReceiver mConnectivityReceiver =
@@ -172,7 +173,7 @@
public void onResume() {
super.onResume();
- if ((mUnlockAction != null) && isKeystoreUnlocked()) {
+ if ((mUnlockAction != null) && isKeyStoreUnlocked()) {
Runnable action = mUnlockAction;
mUnlockAction = null;
runOnUiThread(action);
@@ -402,13 +403,13 @@
return;
}
- if (needKeystoreToSave(p)) {
+ if (needKeyStoreToSave(p)) {
Runnable action = new Runnable() {
public void run() {
onActivityResult(requestCode, resultCode, data);
}
};
- if (!unlockKeystore(p, action)) return;
+ if (!unlockKeyStore(p, action)) return;
}
try {
@@ -610,22 +611,26 @@
startActivityForResult(intent, REQUEST_SELECT_VPN_TYPE);
}
- private boolean isKeystoreUnlocked() {
- return (Keystore.getInstance().getState() == Keystore.UNLOCKED);
- }
-
-
- // Returns true if the profile needs to access keystore
- private boolean needKeystoreToSave(VpnProfile p) {
- return needKeystoreToConnect(p);
+ private boolean isKeyStoreUnlocked() {
+ return mKeyStore.test() == KeyStore.NO_ERROR;
}
// Returns true if the profile needs to access keystore
- private boolean needKeystoreToEdit(VpnProfile p) {
+ private boolean needKeyStoreToSave(VpnProfile p) {
switch (p.getType()) {
- case L2TP_IPSEC:
case L2TP_IPSEC_PSK:
- return true;
+ L2tpIpsecPskProfile pskProfile = (L2tpIpsecPskProfile) p;
+ String presharedKey = pskProfile.getPresharedKey();
+ if (!TextUtils.isEmpty(presharedKey)) return true;
+ // pass through
+
+ case L2TP:
+ L2tpProfile l2tpProfile = (L2tpProfile) p;
+ if (l2tpProfile.isSecretEnabled() &&
+ !TextUtils.isEmpty(l2tpProfile.getSecretString())) {
+ return true;
+ }
+ // pass through
default:
return false;
@@ -633,7 +638,7 @@
}
// Returns true if the profile needs to access keystore
- private boolean needKeystoreToConnect(VpnProfile p) {
+ private boolean needKeyStoreToConnect(VpnProfile p) {
switch (p.getType()) {
case L2TP_IPSEC:
case L2TP_IPSEC_PSK:
@@ -648,37 +653,27 @@
}
// Returns true if keystore is unlocked or keystore is not a concern
- private boolean unlockKeystore(VpnProfile p, Runnable action) {
- if (isKeystoreUnlocked()) return true;
+ private boolean unlockKeyStore(VpnProfile p, Runnable action) {
+ if (isKeyStoreUnlocked()) return true;
mUnlockAction = action;
- startActivity(
- new Intent(Keystore.ACTION_UNLOCK_CREDENTIAL_STORAGE));
+ Credentials.getInstance().unlock(this);
return false;
}
private void startVpnEditor(final VpnProfile profile) {
- if (needKeystoreToEdit(profile)) {
- Runnable action = new Runnable() {
- public void run() {
- startVpnEditor(profile);
- }
- };
- if (!unlockKeystore(profile, action)) return;
- }
-
Intent intent = new Intent(this, VpnEditor.class);
intent.putExtra(KEY_VPN_PROFILE, (Parcelable) profile);
startActivityForResult(intent, REQUEST_ADD_OR_EDIT_PROFILE);
}
private synchronized void connect(final VpnProfile p) {
- if (needKeystoreToConnect(p)) {
+ if (needKeyStoreToConnect(p)) {
Runnable action = new Runnable() {
public void run() {
connect(p);
}
};
- if (!unlockKeystore(p, action)) return;
+ if (!unlockKeyStore(p, action)) return;
}
if (!checkSecrets(p)) return;
@@ -888,43 +883,32 @@
return mVpnManager.createVpnProfile(Enum.valueOf(VpnType.class, type));
}
- private String keyNameForDaemon(String keyName) {
- return NAMESPACE_VPN + "_" + keyName;
- }
-
private boolean checkSecrets(VpnProfile p) {
- Keystore ks = Keystore.getInstance();
- HashSet<String> secretSet = new HashSet<String>();
boolean secretMissing = false;
if (p instanceof L2tpIpsecProfile) {
L2tpIpsecProfile certProfile = (L2tpIpsecProfile) p;
- CertTool certTool = CertTool.getInstance();
- Collections.addAll(secretSet, certTool.getAllCaCertificateKeys());
+
String cert = certProfile.getCaCertificate();
- if (TextUtils.isEmpty(cert) || !secretSet.contains(cert)) {
+ if (TextUtils.isEmpty(cert) ||
+ !mKeyStore.contains(Credentials.CA_CERTIFICATE + cert)) {
certProfile.setCaCertificate(null);
secretMissing = true;
}
- secretSet.clear();
- Collections.addAll(secretSet, certTool.getAllUserCertificateKeys());
cert = certProfile.getUserCertificate();
- if (TextUtils.isEmpty(cert) || !secretSet.contains(cert)) {
+ if (TextUtils.isEmpty(cert) ||
+ !mKeyStore.contains(Credentials.USER_CERTIFICATE + cert)) {
certProfile.setUserCertificate(null);
secretMissing = true;
}
}
- secretSet.clear();
- Collections.addAll(secretSet, ks.listKeys(NAMESPACE_VPN));
-
if (p instanceof L2tpIpsecPskProfile) {
L2tpIpsecPskProfile pskProfile = (L2tpIpsecPskProfile) p;
String presharedKey = pskProfile.getPresharedKey();
- String keyName = KEY_PREFIX_IPSEC_PSK + p.getId();
- if (TextUtils.isEmpty(presharedKey)
- || !secretSet.contains(keyName)) {
+ String key = KEY_PREFIX_IPSEC_PSK + p.getId();
+ if (TextUtils.isEmpty(presharedKey) || !mKeyStore.contains(key)) {
pskProfile.setPresharedKey(null);
secretMissing = true;
}
@@ -934,9 +918,8 @@
L2tpProfile l2tpProfile = (L2tpProfile) p;
if (l2tpProfile.isSecretEnabled()) {
String secret = l2tpProfile.getSecretString();
- String keyName = KEY_PREFIX_L2TP_SECRET + p.getId();
- if (TextUtils.isEmpty(secret)
- || !secretSet.contains(keyName)) {
+ String key = KEY_PREFIX_L2TP_SECRET + p.getId();
+ if (TextUtils.isEmpty(secret) || !mKeyStore.contains(key)) {
l2tpProfile.setSecretString(null);
secretMissing = true;
}
@@ -953,35 +936,30 @@
}
private void processSecrets(VpnProfile p) {
- Keystore ks = Keystore.getInstance();
switch (p.getType()) {
case L2TP_IPSEC_PSK:
L2tpIpsecPskProfile pskProfile = (L2tpIpsecPskProfile) p;
String presharedKey = pskProfile.getPresharedKey();
- String keyName = KEY_PREFIX_IPSEC_PSK + p.getId();
- if (!TextUtils.isEmpty(presharedKey)) {
- int ret = ks.put(NAMESPACE_VPN, keyName, presharedKey);
- if (ret != 0) {
- Log.e(TAG, "keystore write failed: key=" + keyName);
- }
+ String key = KEY_PREFIX_IPSEC_PSK + p.getId();
+ if (!TextUtils.isEmpty(presharedKey) &&
+ !mKeyStore.put(key, presharedKey)) {
+ Log.e(TAG, "keystore write failed: key=" + key);
}
- pskProfile.setPresharedKey(keyNameForDaemon(keyName));
+ pskProfile.setPresharedKey(key);
// pass through
case L2TP:
L2tpProfile l2tpProfile = (L2tpProfile) p;
- keyName = KEY_PREFIX_L2TP_SECRET + p.getId();
+ key = KEY_PREFIX_L2TP_SECRET + p.getId();
if (l2tpProfile.isSecretEnabled()) {
String secret = l2tpProfile.getSecretString();
- if (!TextUtils.isEmpty(secret)) {
- int ret = ks.put(NAMESPACE_VPN, keyName, secret);
- if (ret != 0) {
- Log.e(TAG, "keystore write failed: key=" + keyName);
- }
+ if (!TextUtils.isEmpty(secret) &&
+ !mKeyStore.put(key, secret)) {
+ Log.e(TAG, "keystore write failed: key=" + key);
}
- l2tpProfile.setSecretString(keyNameForDaemon(keyName));
+ l2tpProfile.setSecretString(key);
} else {
- ks.remove(NAMESPACE_VPN, keyName);
+ mKeyStore.delete(key);
}
break;
}
diff --git a/src/com/android/settings/wifi/AccessPointDialog.java b/src/com/android/settings/wifi/AccessPointDialog.java
index f244366..bb5ee6f 100644
--- a/src/com/android/settings/wifi/AccessPointDialog.java
+++ b/src/com/android/settings/wifi/AccessPointDialog.java
@@ -23,8 +23,8 @@
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
-import android.security.CertTool;
-import android.security.Keystore;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
@@ -128,13 +128,13 @@
private TextView mSecurityText;
private Spinner mSecuritySpinner;
private Spinner mWepTypeSpinner;
- private CertTool mCertTool;
+ private KeyStore mKeyStore;
public AccessPointDialog(Context context, WifiLayer wifiLayer) {
super(context);
mWifiLayer = wifiLayer;
- mCertTool = CertTool.getInstance();
+ mKeyStore = KeyStore.getInstance();
}
@Override
@@ -342,18 +342,22 @@
}
private String[] getAllCaCertificateKeys() {
- return appendEmptyInSelection(mCertTool.getAllCaCertificateKeys());
+ return appendEmptyInSelection(mKeyStore.saw(Credentials.CA_CERTIFICATE));
}
private String[] getAllUserCertificateKeys() {
- return appendEmptyInSelection(mCertTool.getAllUserCertificateKeys());
+ return appendEmptyInSelection(mKeyStore.saw(Credentials.USER_CERTIFICATE));
}
private String[] appendEmptyInSelection(String[] keys) {
- String[] selections = new String[keys.length + 1];
- System.arraycopy(keys, 0, selections, 0, keys.length);
- selections[keys.length] = NOT_APPLICABLE;
- return selections;
+ if (keys == null) {
+ return new String[] {NOT_APPLICABLE};
+ } else {
+ String[] selections = new String[keys.length + 1];
+ System.arraycopy(keys, 0, selections, 0, keys.length);
+ selections[keys.length] = NOT_APPLICABLE;
+ return selections;
+ }
}
private void setEnterpriseFields(View view) {
@@ -635,31 +639,22 @@
Spinner spinner = mClientCertSpinner;
int index = spinner.getSelectedItemPosition();
if (index != (spinner.getCount() - 1)) {
- String key = (String)spinner.getSelectedItem();
- value = mCertTool.getUserCertificate(key);
- if (!TextUtils.isEmpty(value)) {
- mState.setEnterpriseField(AccessPointState.CLIENT_CERT,
- BLOB_HEADER + value);
- }
- value = mCertTool.getUserPrivateKey(key);
- if (!TextUtils.isEmpty(value)) {
- mState.setEnterpriseField(AccessPointState.PRIVATE_KEY,
- BLOB_HEADER + value);
- }
+ String key = (String) spinner.getSelectedItem();
+ mState.setEnterpriseField(AccessPointState.CLIENT_CERT,
+ BLOB_HEADER + Credentials.USER_CERTIFICATE + key);
+ mState.setEnterpriseField(AccessPointState.PRIVATE_KEY,
+ BLOB_HEADER + Credentials.USER_PRIVATE_KEY + key);
}
spinner = mCaCertSpinner;
index = spinner.getSelectedItemPosition();
if (index != (spinner.getCount() - 1)) {
- String key = (String)spinner.getSelectedItem();
- value = mCertTool.getCaCertificate(key);
- if (!TextUtils.isEmpty(value)) {
- mState.setEnterpriseField(AccessPointState.CA_CERT,
- BLOB_HEADER + value);
- }
+ String key = (String) spinner.getSelectedItem();
+ mState.setEnterpriseField(AccessPointState.CA_CERT,
+ BLOB_HEADER + Credentials.CA_CERTIFICATE + key);
}
mState.setSecurity(AccessPointState.EAP);
mState.setEap(mEapSpinner.getSelectedItemPosition());
- mState.setPhase2((String)mPhase2Spinner.getSelectedItem());
+ mState.setPhase2((String) mPhase2Spinner.getSelectedItem());
}
/**
@@ -765,9 +760,8 @@
}
case SECURITY_EAP: {
// Unlock the keystore if it is not unlocked yet.
- if (Keystore.getInstance().getState() != Keystore.UNLOCKED) {
- getContext().startActivity(new Intent(
- Keystore.ACTION_UNLOCK_CREDENTIAL_STORAGE));
+ if (mKeyStore.test() != KeyStore.NO_ERROR) {
+ Credentials.getInstance().unlock(getContext());
return;
}
enableEnterpriseFields();
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 4aa5dc3..361f159 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -29,7 +29,8 @@
import android.preference.PreferenceScreen;
import android.preference.CheckBoxPreference;
import android.provider.Settings;
-import android.security.Keystore;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
@@ -86,6 +87,7 @@
private WeakHashMap<AccessPointState, AccessPointPreference> mAps;
+ private KeyStore mKeyStore = KeyStore.getInstance();
private AccessPointState mResumeState = null;
private int mResumeMode;
@@ -156,14 +158,14 @@
mWifiEnabler.resume();
// do what we should have after keystore is unlocked.
if (mResumeState != null) {
- if (Keystore.getInstance().getState() == Keystore.UNLOCKED) {
+ if (mKeyStore.test() == KeyStore.NO_ERROR) {
showAccessPointDialog(mResumeState, mResumeMode);
}
mResumeMode = -1;
mResumeState = null;
} else {
if (mResumeMode == AccessPointDialog.MODE_CONFIGURE) {
- if (Keystore.getInstance().getState() == Keystore.UNLOCKED) {
+ if (mKeyStore.test() == KeyStore.NO_ERROR) {
((AccessPointDialog) mDialog).enableEnterpriseFields();
}
}
@@ -372,10 +374,8 @@
}
public void showAccessPointDialog(AccessPointState state, int mode) {
- if (state.isEnterprise() &&
- Keystore.getInstance().getState() != Keystore.UNLOCKED) {
- startActivity(new Intent(
- Keystore.ACTION_UNLOCK_CREDENTIAL_STORAGE));
+ if (state.isEnterprise() && mKeyStore.test() != KeyStore.NO_ERROR) {
+ Credentials.getInstance().unlock(this);
mResumeState = state;
mResumeMode = mode;
return;