diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index cdb332123fe2d..dfb61a8cf9891 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4291,13 +4291,14 @@ class Task extends TaskFragment { } /** - * @return true if the task is currently focused. + * @return {@code true} if the task is currently focused or one of its children is focused. */ boolean isFocused() { if (mDisplayContent == null || mDisplayContent.mFocusedApp == null) { return false; } - return mDisplayContent.mFocusedApp.getTask() == this; + final Task focusedTask = mDisplayContent.mFocusedApp.getTask(); + return focusedTask == this || (focusedTask != null && focusedTask.getParent() == this); } /** @@ -4317,6 +4318,8 @@ class Task extends TaskFragment { */ void onAppFocusChanged(boolean hasFocus) { dispatchTaskInfoChangedIfNeeded(false /* force */); + final Task parentTask = getParent().asTask(); + if (parentTask != null) parentTask.dispatchTaskInfoChangedIfNeeded(false /* force */); } void onPictureInPictureParamsChanged() { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index 66bf78b6a13b7..0b6cea28e86b7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -432,6 +432,24 @@ public class TaskTests extends WindowTestsBase { Assert.assertThat(info.baseIntent, not(sameInstance(task.getBaseIntent()))); } + @Test + public void testPropagateFocusedStateToRootTask() { + final Task rootTask = createTask(mDefaultDisplay); + final Task leafTask = createTaskInRootTask(rootTask, 0 /* userId */); + + final ActivityRecord activity = createActivityRecord(leafTask); + + leafTask.getDisplayContent().setFocusedApp(activity); + + assertTrue(leafTask.getTaskInfo().isFocused); + assertTrue(rootTask.getTaskInfo().isFocused); + + leafTask.getDisplayContent().setFocusedApp(null); + + assertFalse(leafTask.getTaskInfo().isFocused); + assertFalse(rootTask.getTaskInfo().isFocused); + } + @Test public void testReturnsToHomeRootTask() throws Exception { final Task task = createTask(1);