OSDN Git Service

[MasterClear] fix race in showing dialog
authorAndres Morales <anmorales@google.com>
Mon, 1 Jun 2015 23:23:41 +0000 (16:23 -0700)
committerAndres Morales <anmorales@google.com>
Mon, 1 Jun 2015 23:23:41 +0000 (16:23 -0700)
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

src/com/android/settings/MasterClearConfirm.java

index bc3656a..31f1bcc 100644 (file)
@@ -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<Void, Void, Void>() {
+                    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