Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9e036d8 authored by Jing Ji's avatar Jing Ji
Browse files

Handle the AM error dialogs in system UI thread

And don't hold the proclock while iteracting with the dialogs.

Bug: 186808162
Test: atest CtsWindowManagerDeviceTestCases
Test: atest CtsOsTestCases:StrictModeTest
Test: Manual - trigger ANR & kill app from adb shell
Change-Id: Ia7c16904fd734d122ee3459eeb579e9a78637204
parent c562b93a
Loading
Loading
Loading
Loading
+15 −21
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ final class ErrorDialogController {
            return;
        }
        if (needDismiss) {
            forAllDialogs(mCrashDialogs, Dialog::dismiss);
            scheduleForAllDialogs(mCrashDialogs, Dialog::dismiss);
        }
        mCrashDialogs = null;
    }
@@ -125,7 +125,7 @@ final class ErrorDialogController {
        if (mAnrDialogs == null) {
            return;
        }
        forAllDialogs(mAnrDialogs, Dialog::dismiss);
        scheduleForAllDialogs(mAnrDialogs, Dialog::dismiss);
        mAnrDialogs = null;
        mAnrController = null;
    }
@@ -135,7 +135,7 @@ final class ErrorDialogController {
        if (mViolationDialogs == null) {
            return;
        }
        forAllDialogs(mViolationDialogs, Dialog::dismiss);
        scheduleForAllDialogs(mViolationDialogs, Dialog::dismiss);
        mViolationDialogs = null;
    }

@@ -148,6 +148,16 @@ final class ErrorDialogController {
        mWaitDialog = null;
    }

    @GuardedBy("mProcLock")
    void scheduleForAllDialogs(List<? extends BaseErrorDialog> dialogs,
            Consumer<BaseErrorDialog> c) {
        mService.mUiHandler.post(() -> {
            if (dialogs != null) {
                forAllDialogs(dialogs, c);
            }
        });
    }

    void forAllDialogs(List<? extends BaseErrorDialog> dialogs, Consumer<BaseErrorDialog> c) {
        for (int i = dialogs.size() - 1; i >= 0; i--) {
            c.accept(dialogs.get(i));
@@ -182,15 +192,7 @@ final class ErrorDialogController {
            final Context c = contexts.get(i);
            mAnrDialogs.add(new AppNotRespondingDialog(mService, c, data));
        }
        mService.mUiHandler.post(() -> {
            List<AppNotRespondingDialog> dialogs;
            synchronized (mProcLock) {
                dialogs = mAnrDialogs;
            }
            if (dialogs != null) {
                forAllDialogs(dialogs, Dialog::show);
            }
        });
        scheduleForAllDialogs(mAnrDialogs, Dialog::show);
    }

    @GuardedBy("mProcLock")
@@ -202,15 +204,7 @@ final class ErrorDialogController {
            mViolationDialogs.add(
                    new StrictModeViolationDialog(c, mService, res, mApp));
        }
        mService.mUiHandler.post(() -> {
            List<StrictModeViolationDialog> dialogs;
            synchronized (mProcLock) {
                dialogs = mViolationDialogs;
            }
            if (dialogs != null) {
                forAllDialogs(dialogs, Dialog::show);
            }
        });
        scheduleForAllDialogs(mViolationDialogs, Dialog::show);
    }

    @GuardedBy("mProcLock")