From d0de1cd170b84c1c02f9c8e39bb88b764d4bd90f Mon Sep 17 00:00:00 2001 From: Siarhei Vishniakou Date: Tue, 5 Mar 2019 10:05:01 -0800 Subject: [PATCH] Add a null check for getWindow() Protect against crash surfaced by monkey, where it seems that the window of the dialog is no longer present. If not present, don't need to post dismiss runnable. Bug: 124327419 Test: adb shell monkey -p com.google.android.GoogleCamera -s 999 -v 20000 Change-Id: Ic03b8501bb73725e04544fcb2397532be531988e --- core/java/android/preference/DialogPreference.java | 25 +++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/core/java/android/preference/DialogPreference.java b/core/java/android/preference/DialogPreference.java index 4b5a7b40fe44..a615f2dfc9df 100644 --- a/core/java/android/preference/DialogPreference.java +++ b/core/java/android/preference/DialogPreference.java @@ -342,16 +342,31 @@ public abstract class DialogPreference extends Preference implements dialog.show(); } + /** + * Get the DecorView. + * @return the DecorView for the current dialog window, if it exists. + * If the window does not exist, null is returned. + */ + private View getDecorView() { + if (mDialog != null && mDialog.getWindow() != null) { + return mDialog.getWindow().getDecorView(); + } + return null; + } + void postDismiss() { removeDismissCallbacks(); - View decorView = mDialog.getWindow().getDecorView(); - decorView.post(mDismissRunnable); + View decorView = getDecorView(); + if (decorView != null) { + // If decorView is null, dialog was already dismissed + decorView.post(mDismissRunnable); + } } private void removeDismissCallbacks() { - if (mDialog != null && mDialog.getWindow() != null - && mDialog.getWindow().getDecorView() != null) { - mDialog.getWindow().getDecorView().removeCallbacks(mDismissRunnable); + View decorView = getDecorView(); + if (decorView != null) { + decorView.removeCallbacks(mDismissRunnable); } } -- 2.11.0