diff options
author | Ben Komalo <benkomalo@google.com> | 2011-09-01 15:42:00 -0700 |
---|---|---|
committer | Ben Komalo <benkomalo@google.com> | 2011-09-06 17:45:15 -0700 |
commit | 0e66609c95047ba7e5c0408bdc88af4315fd35b1 (patch) | |
tree | 277e0bf22b73b3047071b9f88f81b082b1782dc8 /src | |
parent | 491af0805dcf92185f1ee2767d11a933e8bb9053 (diff) | |
download | packages_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.java | 58 |
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; } |