diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 677656c5f165d..50e6b90679b29 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -79,12 +79,6 @@ "group": "WM_DEBUG_WINDOW_TRANSITIONS", "at": "com\/android\/server\/wm\/Transition.java" }, - "-2029985709": { - "message": "setFocusedTask: taskId=%d", - "level": "DEBUG", - "group": "WM_DEBUG_FOCUS", - "at": "com\/android\/server\/wm\/ActivityTaskManagerService.java" - }, "-2024464438": { "message": "app-onAnimationFinished(): mOuter=%s", "level": "DEBUG", @@ -1783,6 +1777,12 @@ "group": "WM_DEBUG_STATES", "at": "com\/android\/server\/wm\/TaskFragment.java" }, + "-55185509": { + "message": "setFocusedTask: taskId=%d touchedActivity=%s", + "level": "DEBUG", + "group": "WM_DEBUG_FOCUS", + "at": "com\/android\/server\/wm\/ActivityTaskManagerService.java" + }, "-50336993": { "message": "moveFocusableActivityToTop: activity=%s", "level": "DEBUG", diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 737800123415b..b0d0f163446a8 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1881,25 +1881,42 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public void setFocusedTask(int taskId) { enforceTaskPermission("setFocusedTask()"); - ProtoLog.d(WM_DEBUG_FOCUS, "setFocusedTask: taskId=%d", taskId); final long callingId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { - final Task task = mRootWindowContainer.anyTaskForId(taskId, - MATCH_ATTACHED_TASK_ONLY); - if (task == null) { - return; - } - final ActivityRecord r = task.topRunningActivityLocked(); - if (r != null && r.moveFocusableActivityToTop("setFocusedTask")) { - mRootWindowContainer.resumeFocusedTasksTopActivities(); - } + setFocusedTask(taskId, null /* touchedActivity */); } } finally { Binder.restoreCallingIdentity(callingId); } } + void setFocusedTask(int taskId, ActivityRecord touchedActivity) { + ProtoLog.d(WM_DEBUG_FOCUS, "setFocusedTask: taskId=%d touchedActivity=%s", taskId, + touchedActivity); + final Task task = mRootWindowContainer.anyTaskForId(taskId, MATCH_ATTACHED_TASK_ONLY); + if (task == null) { + return; + } + final ActivityRecord r = task.topRunningActivityLocked(); + if (r == null) { + return; + } + + if (r.moveFocusableActivityToTop("setFocusedTask")) { + mRootWindowContainer.resumeFocusedTasksTopActivities(); + } else if (touchedActivity != null && touchedActivity != r + && touchedActivity.getTask() == r.getTask() + && touchedActivity.getTaskFragment() != r.getTaskFragment()) { + // Set the focused app directly since the focused window is not on the + // top-most TaskFragment of the top-most Task + final DisplayContent displayContent = touchedActivity.getDisplayContent(); + displayContent.setFocusedApp(touchedActivity); + mWindowManager.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, + true /* updateInputWindows */); + } + } + @Override public boolean removeTask(int taskId) { mAmInternal.enforceCallingPermission(REMOVE_TASKS, "removeTask()"); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index f5c2db08c4c6b..632662d5e7cc1 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -772,6 +772,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mTmpWindow = null; return true; } + + if (focusedApp.getTask() == activity.getTask() + && focusedApp.getTaskFragment() != activity.getTaskFragment()) { + // Do not use the activity window of another TaskFragment in the same leaf Task + return false; + } } ProtoLog.v(WM_DEBUG_FOCUS_LIGHT, "findFocusedWindow: Found new focus @ %s", w); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 43a016d22fa55..ff99f4aeb611c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8183,11 +8183,11 @@ public class WindowManagerService extends IWindowManager.Stub displayContent.getParent().positionChildAt(WindowContainer.POSITION_TOP, displayContent, true /* includingParents */); } - handleTaskFocusChange(touchedWindow.getTask()); + handleTaskFocusChange(touchedWindow.getTask(), touchedWindow.mActivityRecord); } @VisibleForTesting - void handleTaskFocusChange(Task task) { + void handleTaskFocusChange(Task task, ActivityRecord touchedActivity) { if (task == null) { return; } @@ -8206,7 +8206,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - mAtmService.setFocusedTask(task.mTaskId); + mAtmService.setFocusedTask(task.mTaskId, touchedActivity); } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index d9aa871447be5..83cdc3ba3ebd8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -107,9 +107,9 @@ public class WindowManagerServiceTests extends WindowTestsBase { Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */); spyOn(mWm.mAtmService); - mWm.handleTaskFocusChange(tappedTask); + mWm.handleTaskFocusChange(tappedTask, null /* window */); - verify(mWm.mAtmService).setFocusedTask(tappedTask.mTaskId); + verify(mWm.mAtmService).setFocusedTask(tappedTask.mTaskId, null); } @Test @@ -128,9 +128,9 @@ public class WindowManagerServiceTests extends WindowTestsBase { Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */); spyOn(mWm.mAtmService); - mWm.handleTaskFocusChange(tappedTask); + mWm.handleTaskFocusChange(tappedTask, null /* window */); - verify(mWm.mAtmService, never()).setFocusedTask(tappedTask.mTaskId); + verify(mWm.mAtmService, never()).setFocusedTask(tappedTask.mTaskId, null); } @Test @@ -151,9 +151,9 @@ public class WindowManagerServiceTests extends WindowTestsBase { Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */); spyOn(mWm.mAtmService); - mWm.handleTaskFocusChange(tappedTask); + mWm.handleTaskFocusChange(tappedTask, null /* window */); - verify(mWm.mAtmService).setFocusedTask(tappedTask.mTaskId); + verify(mWm.mAtmService).setFocusedTask(tappedTask.mTaskId, null); } @Test