From 84798da0fee68dffae620299ffcba379d2d3e6b2 Mon Sep 17 00:00:00 2001 From: Keun young Park Date: Wed, 27 May 2020 18:47:18 -0700 Subject: [PATCH] Fix crash coming from accessing invalid display from GestureDetector - Quick removal of display during boot-up leads into system server crash - Check if display is still existing before creating GestureDetector Bug: 157256737 Test: N/A (need to check occasional failures in emulator tests) Change-Id: I2b04b0e8dea195ffdb1ac1390ef2ba0d4eebfd1b --- .../wm/SystemGesturesPointerEventListener.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java index fb781b06f05f3..f3859b41b6fd3 100644 --- a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java +++ b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java @@ -25,6 +25,7 @@ import android.os.SystemClock; import android.util.Slog; import android.view.Display; import android.view.DisplayCutout; +import android.view.DisplayInfo; import android.view.GestureDetector; import android.view.InputDevice; import android.view.MotionEvent; @@ -117,8 +118,17 @@ class SystemGesturesPointerEventListener implements PointerEventListener { // GestureDetector would get a ViewConfiguration instance by context, that may also // create a new WindowManagerImpl for the new display, and lock WindowManagerGlobal // temporarily in the constructor that would make a deadlock. - mHandler.post(() -> mGestureDetector = - new GestureDetector(mContext, new FlingGestureDetector(), mHandler) {}); + mHandler.post(() -> { + final int displayId = mContext.getDisplayId(); + final DisplayInfo info = DisplayManagerGlobal.getInstance().getDisplayInfo(displayId); + if (info == null) { + // Display already removed, stop here. + Slog.w(TAG, "Cannot create GestureDetector, display removed:" + displayId); + return; + } + mGestureDetector = new GestureDetector(mContext, new FlingGestureDetector(), mHandler) { + }; + }); } @Override