From 1e4597408ef059f468de8223029573b45d51e187 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 5 Nov 2020 19:02:04 +0800 Subject: Do not use surface crop as touchable region in standard task This fixes a refactoring error introduced by commit 3213c96. This change restores the original logic that if a window is in a task which should crop touchable region by root task, then just set the root task surface but not replace the region directly. Otherwise the touchable region of a sub window may occupy the entire screen. Bug: 172522375 Test: WindowStateTests#testUpdateInputWindowHandle LoginActivityTest#testAutofillTapOutside Change-Id: I771b44515c6f70ae3713d3b69658497782dde92c --- services/core/java/com/android/server/wm/InputMonitor.java | 7 ++++--- .../core/java/com/android/server/wm/InputWindowHandleWrapper.java | 5 ----- .../tests/wmtests/src/com/android/server/wm/WindowStateTests.java | 2 ++ 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 43c47417d95f..086513bb141f 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -326,11 +326,12 @@ final class InputMonitor { // the surface hierarchy. // TODO(b/168252846): we have some issues with modal-windows, so we need to cross // that bridge now that we organize full-screen Tasks. - inputWindowHandle.replaceTouchableRegionWithCrop(null /* Use this surfaces crop */); + inputWindowHandle.setTouchableRegionCrop(null /* Use this surfaces crop */); + inputWindowHandle.setReplaceTouchableRegionWithCrop(true); useSurfaceCrop = true; } else if (task.cropWindowsToStackBounds() && !w.inFreeformWindowingMode()) { - inputWindowHandle.replaceTouchableRegionWithCrop( - task.getRootTask().getSurfaceControl()); + inputWindowHandle.setTouchableRegionCrop(task.getRootTask().getSurfaceControl()); + inputWindowHandle.setReplaceTouchableRegionWithCrop(false); useSurfaceCrop = true; } } diff --git a/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java b/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java index 1fbeb1fd456b..9339f3475684 100644 --- a/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java +++ b/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java @@ -255,11 +255,6 @@ class InputWindowHandleWrapper { mChanged = true; } - void replaceTouchableRegionWithCrop(@Nullable SurfaceControl bounds) { - setTouchableRegionCrop(bounds); - setReplaceTouchableRegionWithCrop(true); - } - void setTouchableRegionCrop(@Nullable SurfaceControl bounds) { if (mHandle.touchableRegionSurfaceControl.get() == bounds) { return; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 5c4563e0ce1b..88a3f972f83e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -694,6 +694,8 @@ public class WindowStateTests extends WindowTestsBase { mDisplayContent.getInputMonitor().populateInputWindowHandle(handleWrapper, win); assertTrue(handleWrapper.isChanged()); + // The window of standard resizable task should not use surface crop as touchable region. + assertFalse(handle.replaceTouchableRegionWithCrop); assertEquals(inputChannelToken, handle.token); assertEquals(win.mActivityRecord.getInputApplicationHandle(false /* update */), handle.inputApplicationHandle); -- cgit v1.2.3-59-g8ed1b