Show factory reset option if encryption went bad.

Also update the wording for the error message

Bug: 3384231
Change-Id: I25a67cba7abede913bdd8cadaafc42bcbd5c5c5f
This commit is contained in:
Ben Komalo
2011-09-01 15:42:00 -07:00
parent 491af0805d
commit 0e66609c95
2 changed files with 65 additions and 10 deletions

View File

@@ -733,16 +733,21 @@
<!-- Informational text when encryption fails --> <!-- Informational text when encryption fails -->
<string name="crypt_keeper_failed_summary" product="tablet"> <string name="crypt_keeper_failed_summary" product="tablet">
Encryption was interrupted and can\'t complete. You must perform a factory data reset (erasing Encryption was interrupted and can\'t complete. As a result, the data on
all your data) before you can resume using your tablet. You can try encrypting your tablet your tablet is no longer accessible.
again after the reset is complete. \n\n
To resume using your tablet, you must perform a factory reset.
When you set up your tablet after the reset, you\'ll have an opportunity
to restore any data that was backed up to your Google Account.
</string> </string>
<!-- Informational text when encryption fails --> <!-- Informational text when encryption fails -->
<string name="crypt_keeper_failed_summary" product="default"> <string name="crypt_keeper_failed_summary" product="default">
Encryption was interrupted and can\'t complete. You must perform a factory data reset (erasing Encryption was interrupted and can\'t complete. As a result, the data on
all your data) before you can resume using your phone. You can try encrypting your phone your phone is no longer accessible.
again after the reset is complete. \n\nTo resume using your phone, you must perform a factory reset.
When you set up your phone after the reset, you\'ll have an opportunity
to restore any data that was backed up to your Google Account.
</string> </string>
<!-- Unlock Picker Settings --><skip /> <!-- Unlock Picker Settings --><skip />

View File

@@ -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_ENTRY = "entry";
private static final String FORCE_VIEW_ERROR = "error"; 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; private int mCooldown;
PowerManager.WakeLock mWakeLock; PowerManager.WakeLock mWakeLock;
private EditText mPasswordEntry; 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() { private final Handler mHandler = new Handler() {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
@@ -204,6 +237,9 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
mWakeLock = retained.wakelock; mWakeLock = retained.wakelock;
Log.d(TAG, "Restoring wakelock from NonConfigurationInstanceState"); 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(); super.onStart();
// Check to see why we were started. // 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"); String progress = SystemProperties.get("vold.encrypt_progress");
if (!"".equals(progress) if (!"".equals(progress) || isDebugView(FORCE_VIEW_PROGRESS)) {
|| isDebugView(FORCE_VIEW_PROGRESS)
|| isDebugView(FORCE_VIEW_ERROR)) {
setContentView(R.layout.crypt_keeper_progress); setContentView(R.layout.crypt_keeper_progress);
encryptionProgressInit(); encryptionProgressInit();
} else { } else {
@@ -308,7 +358,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
private void updateProgress() { private void updateProgress() {
String state = SystemProperties.get("vold.encrypt_progress"); String state = SystemProperties.get("vold.encrypt_progress");
if ("error_partially_encrypted".equals(state) || isDebugView(FORCE_VIEW_ERROR)) { if ("error_partially_encrypted".equals(state)) {
showFactoryReset(); showFactoryReset();
return; return;
} }