Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cac8caf2 authored by Louis Chang's avatar Louis Chang Committed by Android (Google) Code Review
Browse files

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

parents 0aa1af24 73d27711
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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",
+27 −10
Original line number Diff line number Diff line
@@ -1881,22 +1881,39 @@ 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);
                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 && r.moveFocusableActivityToTop("setFocusedTask")) {
                    mRootWindowContainer.resumeFocusedTasksTopActivities();
                }
        if (r == null) {
            return;
        }
        } finally {
            Binder.restoreCallingIdentity(callingId);

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

+6 −0
Original line number Diff line number Diff line
@@ -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);
+3 −3
Original line number Diff line number Diff line
@@ -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);
    }

    /**
+6 −6
Original line number Diff line number Diff line
@@ -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