diff options
5 files changed, 29 insertions, 8 deletions
diff --git a/core/java/android/window/ITaskOrganizerController.aidl b/core/java/android/window/ITaskOrganizerController.aidl index 022d05da8825..172456e4d0fa 100644 --- a/core/java/android/window/ITaskOrganizerController.aidl +++ b/core/java/android/window/ITaskOrganizerController.aidl @@ -52,7 +52,7 @@ interface ITaskOrganizerController { /** Gets all root tasks on a display (ordered from top-to-bottom) */ List<ActivityManager.RunningTaskInfo> getRootTasks(int displayId, in int[] activityTypes); - /** Get the root task which contains the current ime target */ + /** Get the {@link WindowContainerToken} of the task which contains the current ime target */ WindowContainerToken getImeTarget(int display); /** diff --git a/core/java/android/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java index 3ec18dbe0ebc..8d88f80ff483 100644 --- a/core/java/android/window/TaskOrganizer.java +++ b/core/java/android/window/TaskOrganizer.java @@ -199,7 +199,7 @@ public class TaskOrganizer extends WindowOrganizer { } } - /** Get the root task which contains the current ime target */ + /** Get the {@link WindowContainerToken} of the task which contains the current ime target */ @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) @Nullable public WindowContainerToken getImeTarget(int display) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 1a5e3f26ab37..9e5359332055 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -1117,9 +1117,9 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, return SPLIT_POSITION_UNDEFINED; } - if (token.equals(mMainStage.mRootTaskInfo.getToken())) { + if (mMainStage.containsToken(token)) { return getMainStagePosition(); - } else if (token.equals(mSideStage.mRootTaskInfo.getToken())) { + } else if (mSideStage.containsToken(token)) { return getSideStagePosition(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index 109f96e166d7..5f0cd01f5416 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -124,6 +124,20 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { return mChildrenTaskInfo.contains(taskId); } + boolean containsToken(WindowContainerToken token) { + if (token.equals(mRootTaskInfo.token)) { + return true; + } + + for (int i = mChildrenTaskInfo.size() - 1; i >= 0; --i) { + if (token.equals(mChildrenTaskInfo.valueAt(i).token)) { + return true; + } + } + + return false; + } + /** * Returns the top visible child task's id. */ diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 331f1242da1d..ff5bfbee61f4 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -800,17 +800,24 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { - DisplayContent dc = mService.mWindowManager.mRoot + final DisplayContent dc = mService.mWindowManager.mRoot .getDisplayContent(displayId); - if (dc == null || dc.getImeTarget(IME_TARGET_LAYERING) == null) { + if (dc == null) { + return null; + } + + final InsetsControlTarget imeLayeringTarget = dc.getImeTarget(IME_TARGET_LAYERING); + if (imeLayeringTarget == null || imeLayeringTarget.getWindow() == null) { return null; } + // Avoid WindowState#getRootTask() so we don't attribute system windows to a task. - final Task task = dc.getImeTarget(IME_TARGET_LAYERING).getWindow().getTask(); + final Task task = imeLayeringTarget.getWindow().asTask(); if (task == null) { return null; } - return task.getRootTask().mRemoteToken.toWindowContainerToken(); + + return task.mRemoteToken.toWindowContainerToken(); } } finally { Binder.restoreCallingIdentity(origId); |