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",
|
"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",
|
||||||
|
|||||||
@@ -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 */);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user