Merge "Allow changing focus between embedded activities in a Task" into sc-v2-dev
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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()");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user