Merge "Support to get the exact task which IME is attached to" into tm-dev

This commit is contained in:
Jerry Chang
2022-03-09 01:23:38 +00:00
committed by Android (Google) Code Review
5 changed files with 29 additions and 8 deletions

View File

@@ -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);
/**

View File

@@ -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) {

View File

@@ -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();
}

View File

@@ -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.
*/

View File

@@ -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);