From c17ec1be19a45dec12d601f1e6a545f558bdf293 Mon Sep 17 00:00:00 2001 From: Andres Morales Date: Mon, 1 Jun 2015 16:23:41 -0700 Subject: [PATCH] [MasterClear] fix race in showing dialog Wiping the PDB effectively starves all other threads from accessing flash, and freezes the UI. We throw up a dialog but there's a race between drawing the dialog and starting the wipe. Show the dialog in onPreExecute to fix this. Bug: 20854355 Change-Id: I8462f5ed3ff53ed574ebc1be416a821c2086b4f5 --- .../android/settings/MasterClearConfirm.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java index bc3656abde6..31f1bcca521 100644 --- a/src/com/android/settings/MasterClearConfirm.java +++ b/src/com/android/settings/MasterClearConfirm.java @@ -65,14 +65,10 @@ public class MasterClearConfirm extends InstrumentedFragment { if (pdbManager != null && !pdbManager.getOemUnlockEnabled()) { // if OEM unlock is enabled, this will be wiped during FR process. - final ProgressDialog progressDialog = getProgressDialog(); - progressDialog.show(); - - // need to prevent orientation changes as we're about to go into - // a long IO request, so we won't be able to access inflate resources on flash - final int oldOrientation = getActivity().getRequestedOrientation(); - getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); new AsyncTask() { + int mOldOrientation; + ProgressDialog mProgressDialog; + @Override protected Void doInBackground(Void... params) { pdbManager.wipe(); @@ -81,10 +77,21 @@ public class MasterClearConfirm extends InstrumentedFragment { @Override protected void onPostExecute(Void aVoid) { - progressDialog.hide(); - getActivity().setRequestedOrientation(oldOrientation); + mProgressDialog.hide(); + getActivity().setRequestedOrientation(mOldOrientation); doMasterClear(); } + + @Override + protected void onPreExecute() { + mProgressDialog = getProgressDialog(); + mProgressDialog.show(); + + // need to prevent orientation changes as we're about to go into + // a long IO request, so we won't be able to access inflate resources on flash + mOldOrientation = getActivity().getRequestedOrientation(); + getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); + } }.execute(); } else { doMasterClear(); @@ -143,7 +150,8 @@ public class MasterClearConfirm extends InstrumentedFragment { super.onCreate(savedInstanceState); Bundle args = getArguments(); - mEraseSdCard = args != null && args.getBoolean(MasterClear.ERASE_EXTERNAL_EXTRA); + mEraseSdCard = args != null + && args.getBoolean(MasterClear.ERASE_EXTERNAL_EXTRA); } @Override