From 20f55b10b2e57c1972073db42676ccfd8027f0aa Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 26 Jul 2021 17:48:00 +0800 Subject: [PATCH] Supporting independent back nav while task embedded Also directly setting the focused app if there is a task embedded in the split. Bug: 189385926 Test: navigate independently Change-Id: I0fb36a4bcc6245af26f114f96862e1cb498d146d --- .../server/wm/ActivityTaskManagerService.java | 18 +++++++++--------- .../com/android/server/wm/DisplayContent.java | 17 +++++++++++++---- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 83c83e7b5f391..081c618b62aa7 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1909,15 +1909,15 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { 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 */); + } else if (touchedActivity != null && touchedActivity.isFocusable()) { + final TaskFragment parent = touchedActivity.getTaskFragment(); + if (parent != null && parent.isEmbedded()) { + // Set the focused app directly if the focused window is currently embedded + final DisplayContent displayContent = touchedActivity.getDisplayContent(); + displayContent.setFocusedApp(touchedActivity); + mWindowManager.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, + true /* updateInputWindows */); + } } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 708b7ff73ea6e..dbd9eeb7ac48a 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -777,10 +777,19 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp 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; + // If the candidate activity is currently being embedded in the focused task, the + // activity cannot be focused unless it is on the same TaskFragment as the focusedApp's. + TaskFragment parent = activity.getTaskFragment(); + if (parent != null && parent.isEmbedded()) { + Task hostTask = focusedApp.getTask(); + if (hostTask.isEmbedded()) { + // Use the hosting task if the current task is embedded. + hostTask = hostTask.getParent().asTaskFragment().getTask(); + } + if (activity.isDescendantOf(hostTask) + && activity.getTaskFragment() != focusedApp.getTaskFragment()) { + return false; + } } }