diff options
| author | 2023-05-03 18:15:06 +0000 | |
|---|---|---|
| committer | 2023-05-04 22:42:27 +0000 | |
| commit | a6b481a7d24f83923544eb24d4f68f51b8fa9054 (patch) | |
| tree | e1a175befeaa3407ee1f7a5e2bd80442656c834f | |
| parent | 0ba977d4ad7e42d2563d97592e87da169120fbb2 (diff) | |
Return the default touch mode for dead displays
Certain race conditions may lead to client code trying to manipulate
(like adding an window) an already gone virtual display. This CL changes
WMS#isInTouchMode to return the default touch mode in case the display
passed as argument is already gone.
Fix: 280671905
Test: atest FrameworksCoreTests
Test: atest WmTests:WindowManagerServiceTests
Test: atest CtsInputTestCases:android.input.cts.TouchModeTest
Change-Id: Iea61f82ec1945ba0b65ce8af4896b5fb9923af6e
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 8baf048980ed..f253fb0c7271 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3922,15 +3922,17 @@ public class WindowManagerService extends IWindowManager.Stub /** * Returns the touch mode state for the display id passed as argument. + * + * This method will return the default touch mode state (represented by + * {@code com.android.internal.R.bool.config_defaultInTouchMode}) if the display passed as + * argument is no longer registered in {@RootWindowContainer}). */ @Override // Binder call public boolean isInTouchMode(int displayId) { synchronized (mGlobalLock) { final DisplayContent displayContent = mRoot.getDisplayContent(displayId); if (displayContent == null) { - throw new IllegalStateException("Failed to retrieve the touch mode state for" - + "display {" + displayId + "}: display is not registered in " - + "WindowRootContainer"); + return mContext.getResources().getBoolean(R.bool.config_defaultInTouchMode); } return displayContent.isInTouchMode(); } |