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
This commit is contained in:
Keun young Park
2020-05-27 18:47:18 -07:00
parent 7e24d133d0
commit 84798da0fe

View File

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