Merge "Fix race when show error dialogs"

This commit is contained in:
TreeHugger Robot
2020-02-11 00:39:27 +00:00
committed by Android (Google) Code Review
2 changed files with 38 additions and 11 deletions

View File

@@ -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);

View File

@@ -1910,8 +1910,7 @@ class ProcessRecord implements WindowProcessListener {
mWaitDialog = null;
}
void forAllDialogs(List<? extends BaseErrorDialog> dialogs,
Consumer<BaseErrorDialog> c) {
void forAllDialogs(List<? extends BaseErrorDialog> dialogs, Consumer<BaseErrorDialog> c) {
for (int i = dialogs.size() - 1; i >= 0; i--) {
c.accept(dialogs.get(i));
}
@@ -1920,42 +1919,72 @@ class ProcessRecord implements WindowProcessListener {
void showCrashDialogs(AppErrorDialog.Data data) {
List<Context> 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<AppErrorDialog> dialogs;
synchronized (mService) {
dialogs = mCrashDialogs;
}
if (dialogs != null) {
forAllDialogs(dialogs, Dialog::show);
}
});
}
void showAnrDialogs(AppNotRespondingDialog.Data data) {
List<Context> 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<AppNotRespondingDialog> dialogs;
synchronized (mService) {
dialogs = mAnrDialogs;
}
if (dialogs != null) {
forAllDialogs(dialogs, Dialog::show);
}
});
}
void showViolationDialogs(AppErrorResult res) {
List<Context> 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<StrictModeViolationDialog> dialogs;
synchronized (mService) {
dialogs = mViolationDialogs;
}
if (dialogs != null) {
forAllDialogs(dialogs, Dialog::show);
}
});
}
void showDebugWaitingDialogs() {
List<Context> 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();
}
});
}
/**