Merge "Allow changing focus between embedded activities in a Task" into sc-v2-dev

This commit is contained in:
Louis Chang
2021-07-09 05:08:42 +00:00
committed by Android (Google) Code Review
5 changed files with 48 additions and 25 deletions

View File

@@ -79,12 +79,6 @@
"group": "WM_DEBUG_WINDOW_TRANSITIONS", "group": "WM_DEBUG_WINDOW_TRANSITIONS",
"at": "com\/android\/server\/wm\/Transition.java" "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": { "-2024464438": {
"message": "app-onAnimationFinished(): mOuter=%s", "message": "app-onAnimationFinished(): mOuter=%s",
"level": "DEBUG", "level": "DEBUG",
@@ -1783,6 +1777,12 @@
"group": "WM_DEBUG_STATES", "group": "WM_DEBUG_STATES",
"at": "com\/android\/server\/wm\/TaskFragment.java" "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": { "-50336993": {
"message": "moveFocusableActivityToTop: activity=%s", "message": "moveFocusableActivityToTop: activity=%s",
"level": "DEBUG", "level": "DEBUG",

View File

@@ -1881,22 +1881,39 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override @Override
public void setFocusedTask(int taskId) { public void setFocusedTask(int taskId) {
enforceTaskPermission("setFocusedTask()"); enforceTaskPermission("setFocusedTask()");
ProtoLog.d(WM_DEBUG_FOCUS, "setFocusedTask: taskId=%d", taskId);
final long callingId = Binder.clearCallingIdentity(); final long callingId = Binder.clearCallingIdentity();
try { try {
synchronized (mGlobalLock) { synchronized (mGlobalLock) {
final Task task = mRootWindowContainer.anyTaskForId(taskId, setFocusedTask(taskId, null /* touchedActivity */);
MATCH_ATTACHED_TASK_ONLY); }
} 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) { if (task == null) {
return; return;
} }
final ActivityRecord r = task.topRunningActivityLocked(); final ActivityRecord r = task.topRunningActivityLocked();
if (r != null && r.moveFocusableActivityToTop("setFocusedTask")) { if (r == null) {
return;
}
if (r.moveFocusableActivityToTop("setFocusedTask")) {
mRootWindowContainer.resumeFocusedTasksTopActivities(); mRootWindowContainer.resumeFocusedTasksTopActivities();
} } else if (touchedActivity != null && touchedActivity != r
} && touchedActivity.getTask() == r.getTask()
} finally { && touchedActivity.getTaskFragment() != r.getTaskFragment()) {
Binder.restoreCallingIdentity(callingId); // 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 */);
} }
} }

View File

@@ -772,6 +772,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mTmpWindow = null; mTmpWindow = null;
return true; 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); ProtoLog.v(WM_DEBUG_FOCUS_LIGHT, "findFocusedWindow: Found new focus @ %s", w);

View File

@@ -8183,11 +8183,11 @@ public class WindowManagerService extends IWindowManager.Stub
displayContent.getParent().positionChildAt(WindowContainer.POSITION_TOP, displayContent, displayContent.getParent().positionChildAt(WindowContainer.POSITION_TOP, displayContent,
true /* includingParents */); true /* includingParents */);
} }
handleTaskFocusChange(touchedWindow.getTask()); handleTaskFocusChange(touchedWindow.getTask(), touchedWindow.mActivityRecord);
} }
@VisibleForTesting @VisibleForTesting
void handleTaskFocusChange(Task task) { void handleTaskFocusChange(Task task, ActivityRecord touchedActivity) {
if (task == null) { if (task == null) {
return; return;
} }
@@ -8206,7 +8206,7 @@ public class WindowManagerService extends IWindowManager.Stub
} }
} }
mAtmService.setFocusedTask(task.mTaskId); mAtmService.setFocusedTask(task.mTaskId, touchedActivity);
} }
/** /**

View File

@@ -107,9 +107,9 @@ public class WindowManagerServiceTests extends WindowTestsBase {
Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */); Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */);
spyOn(mWm.mAtmService); 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 @Test
@@ -128,9 +128,9 @@ public class WindowManagerServiceTests extends WindowTestsBase {
Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */); Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */);
spyOn(mWm.mAtmService); 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 @Test
@@ -151,9 +151,9 @@ public class WindowManagerServiceTests extends WindowTestsBase {
Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */); Task tappedTask = createTaskInRootTask(tappedRootTask, 0 /* userId */);
spyOn(mWm.mAtmService); 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 @Test