summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBen Komalo <benkomalo@google.com>2011-09-01 15:42:00 -0700
committerBen Komalo <benkomalo@google.com>2011-09-06 17:45:15 -0700
commit0e66609c95047ba7e5c0408bdc88af4315fd35b1 (patch)
tree277e0bf22b73b3047071b9f88f81b082b1782dc8 /src
parent491af0805dcf92185f1ee2767d11a933e8bb9053 (diff)
downloadpackages_apps_Settings-0e66609c95047ba7e5c0408bdc88af4315fd35b1.zip
packages_apps_Settings-0e66609c95047ba7e5c0408bdc88af4315fd35b1.tar.gz
packages_apps_Settings-0e66609c95047ba7e5c0408bdc88af4315fd35b1.tar.bz2
Show factory reset option if encryption went bad.
Also update the wording for the error message Bug: 3384231 Change-Id: I25a67cba7abede913bdd8cadaafc42bcbd5c5c5f
Diffstat (limited to 'src')
-rw-r--r--src/com/android/settings/CryptKeeper.java58
1 files changed, 54 insertions, 4 deletions
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 0c8ce28..b1de932e7 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -86,6 +86,11 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
private static final String FORCE_VIEW_ENTRY = "entry";
private static final String FORCE_VIEW_ERROR = "error";
+ /** When encryption is detected, this flag indivates whether or not we've checked for erros. */
+ private boolean mValidationComplete;
+ /** A flag to indicate that the volume is in a bad state (e.g. partially encrypted). */
+ private boolean mEncryptionGoneBad;
+
private int mCooldown;
PowerManager.WakeLock mWakeLock;
private EditText mPasswordEntry;
@@ -149,6 +154,34 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
}
}
+ private class ValidationTask extends AsyncTask<Void, Void, Boolean> {
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ IMountService service = getMountService();
+ try {
+ int state = service.getEncryptionState();
+ if (state == IMountService.ENCRYPTION_STATE_NONE) {
+ Log.w(TAG, "Unexpectedly in CryptKeeper even though there is no encryption.");
+ return true; // Unexpected, but fine, I guess...
+ }
+ return state == IMountService.ENCRYPTION_STATE_OK;
+ } catch (RemoteException e) {
+ Log.w(TAG, "Unable to get encryption state properly");
+ return true;
+ }
+ }
+
+ @Override
+ protected void onPostExecute(Boolean result) {
+ mValidationComplete = true;
+ if (Boolean.FALSE.equals(result)) {
+ Log.w(TAG, "Incomplete, or corrupted encryption detected. Prompting user to wipe.");
+ mEncryptionGoneBad = true;
+ }
+ setupUi();
+ }
+ }
+
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -204,6 +237,9 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
mWakeLock = retained.wakelock;
Log.d(TAG, "Restoring wakelock from NonConfigurationInstanceState");
}
+
+ // Check the encryption status to ensure something hasn't gone bad.
+ new ValidationTask().execute((Void[]) null);
}
/**
@@ -216,10 +252,24 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
super.onStart();
// Check to see why we were started.
+ if (mValidationComplete) {
+ setupUi();
+ }
+ }
+
+ /**
+ * Initializes the UI based on the current state of encryption.
+ * This is idempotent - calling repeatedly will simply re-initialize the UI.
+ */
+ private void setupUi() {
+ if (mEncryptionGoneBad || isDebugView(FORCE_VIEW_ERROR)) {
+ setContentView(R.layout.crypt_keeper_progress);
+ showFactoryReset();
+ return;
+ }
+
String progress = SystemProperties.get("vold.encrypt_progress");
- if (!"".equals(progress)
- || isDebugView(FORCE_VIEW_PROGRESS)
- || isDebugView(FORCE_VIEW_ERROR)) {
+ if (!"".equals(progress) || isDebugView(FORCE_VIEW_PROGRESS)) {
setContentView(R.layout.crypt_keeper_progress);
encryptionProgressInit();
} else {
@@ -308,7 +358,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
private void updateProgress() {
String state = SystemProperties.get("vold.encrypt_progress");
- if ("error_partially_encrypted".equals(state) || isDebugView(FORCE_VIEW_ERROR)) {
+ if ("error_partially_encrypted".equals(state)) {
showFactoryReset();
return;
}