diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index eff4ea6536bd2..b50b3c06bd6e7 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -5675,16 +5675,18 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } return false; /* continue */ } - if (taskId != INVALID_TASK_ID) { + if (taskId == INVALID_TASK_ID) { + if (!nextWindow.canReceiveKeys()) { + return false; /* continue */ + } + } else { Task task = nextWindow.getTask(); if (task == null || !task.isTaskId(taskId)) { return false; /* continue */ } } - if (!nextWindow.canReceiveKeys()) { - return false; /* continue */ - } - return true; /* stop */ + + return true; /* stop, match found */ } }); } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 137cf6523caf2..8626d76758a33 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -117,6 +117,7 @@ import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; +import android.view.View; import android.view.WindowManager; import androidx.test.filters.SmallTest; @@ -1678,6 +1679,20 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(activityWindow, result); } + @Test + public void testFindScrollCaptureTargetWindow_cantReceiveKeys() { + DisplayContent display = createNewDisplay(); + Task stack = createTaskStackOnDisplay(display); + Task task = createTaskInStack(stack, 0 /* userId */); + WindowState activityWindow = createAppWindow(task, TYPE_APPLICATION, "App Window"); + WindowState invisible = createWindow(null, TYPE_APPLICATION, "invisible"); + invisible.mViewVisibility = View.INVISIBLE; // make canReceiveKeys return false + + WindowState result = display.findScrollCaptureTargetWindow(null, + ActivityTaskManager.INVALID_TASK_ID); + assertEquals(activityWindow, result); + } + @Test public void testFindScrollCaptureTargetWindow_taskId() { DisplayContent display = createNewDisplay(); @@ -1690,6 +1705,19 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(window, result); } + @Test + public void testFindScrollCaptureTargetWindow_taskIdCantReceiveKeys() { + DisplayContent display = createNewDisplay(); + Task stack = createTaskStackOnDisplay(display); + Task task = createTaskInStack(stack, 0 /* userId */); + WindowState window = createAppWindow(task, TYPE_APPLICATION, "App Window"); + window.mViewVisibility = View.INVISIBLE; // make canReceiveKeys return false + WindowState behindWindow = createWindow(null, TYPE_SCREENSHOT, display, "Screenshot"); + + WindowState result = display.findScrollCaptureTargetWindow(null, task.mTaskId); + assertEquals(window, result); + } + @Test public void testEnsureActivitiesVisibleNotRecursive() { final TaskDisplayArea mockTda = mock(TaskDisplayArea.class);