diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 145f91bdb0b33..789f7199948d9 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -798,7 +798,6 @@ class AppErrors { boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0; - final String packageName; final int userId; synchronized (mService) { final ProcessRecord proc = data.proc; @@ -807,7 +806,6 @@ class AppErrors { Slog.e(TAG, "handleShowAppErrorUi: proc is null"); return; } - packageName = proc.info.packageName; userId = proc.userId; if (proc.getDialogController().hasCrashDialogs()) { Slog.e(TAG, "App already has crash dialog: " + proc); diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 2b4d15eda9f03..777fadc6a5a09 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -1901,8 +1901,7 @@ class ProcessRecord implements WindowProcessListener { mWaitDialog = null; } - void forAllDialogs(List dialogs, - Consumer c) { + void forAllDialogs(List dialogs, Consumer c) { for (int i = dialogs.size() - 1; i >= 0; i--) { c.accept(dialogs.get(i)); } @@ -1911,42 +1910,72 @@ class ProcessRecord implements WindowProcessListener { void showCrashDialogs(AppErrorDialog.Data data) { List contexts = getDisplayContexts(false /* lastUsedOnly */); mCrashDialogs = new ArrayList<>(); - for (int i = contexts.size() - 1; i >= 0; i--) { final Context c = contexts.get(i); mCrashDialogs.add(new AppErrorDialog(c, mService, data)); } - mService.mUiHandler.post(() -> mCrashDialogs.forEach(Dialog::show)); + mService.mUiHandler.post(() -> { + List dialogs; + synchronized (mService) { + dialogs = mCrashDialogs; + } + if (dialogs != null) { + forAllDialogs(dialogs, Dialog::show); + } + }); } void showAnrDialogs(AppNotRespondingDialog.Data data) { List contexts = getDisplayContexts(isSilentAnr() /* lastUsedOnly */); mAnrDialogs = new ArrayList<>(); - for (int i = contexts.size() - 1; i >= 0; i--) { final Context c = contexts.get(i); mAnrDialogs.add(new AppNotRespondingDialog(mService, c, data)); } - mService.mUiHandler.post(() -> mAnrDialogs.forEach(Dialog::show)); + mService.mUiHandler.post(() -> { + List dialogs; + synchronized (mService) { + dialogs = mAnrDialogs; + } + if (dialogs != null) { + forAllDialogs(dialogs, Dialog::show); + } + }); } void showViolationDialogs(AppErrorResult res) { List contexts = getDisplayContexts(false /* lastUsedOnly */); mViolationDialogs = new ArrayList<>(); - for (int i = contexts.size() - 1; i >= 0; i--) { final Context c = contexts.get(i); mViolationDialogs.add( new StrictModeViolationDialog(c, mService, res, ProcessRecord.this)); } - mService.mUiHandler.post(() -> mViolationDialogs.forEach(Dialog::show)); + mService.mUiHandler.post(() -> { + List dialogs; + synchronized (mService) { + dialogs = mViolationDialogs; + } + if (dialogs != null) { + forAllDialogs(dialogs, Dialog::show); + } + }); } void showDebugWaitingDialogs() { List contexts = getDisplayContexts(true /* lastUsedOnly */); final Context c = contexts.get(0); mWaitDialog = new AppWaitingForDebuggerDialog(mService, c, ProcessRecord.this); - mService.mUiHandler.post(() -> mWaitDialog.show()); + + mService.mUiHandler.post(() -> { + Dialog dialog; + synchronized (mService) { + dialog = mWaitDialog; + } + if (dialog != null) { + dialog.show(); + } + }); } /**