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

Commit c0370799 authored by Kazuki Takise's avatar Kazuki Takise Committed by Android (Google) Code Review
Browse files

Merge changes I296371fd,I29ccb089,Icb244618 into main

* changes:
  Add unit tests to PresentationControllerTests
  Disallow a new presentation to show on presenting display
  Use leaf task as presentation host
parents d31a2e27 f36dfca8
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -125,8 +125,7 @@ class PresentationController implements DisplayManager.DisplayListener {
        }

        final int displayId = displayContent.mDisplayId;
        if (hasPresentationWindow(displayId)
                && win != null && win != mPresentations.get(displayId).mWin) {
        if (hasPresentationWindow(displayId) && win != mPresentations.get(displayId).mWin) {
            // A display can't have multiple presentations.
            return false;
        }
@@ -137,7 +136,7 @@ class PresentationController implements DisplayManager.DisplayListener {
            hostTask = presentation.mHostTask;
        } else if (win == null) {
            final Task globallyFocusedTask =
                    displayContent.mWmService.mRoot.getTopDisplayFocusedRootTask();
                    displayContent.mWmService.mRoot.getTopDisplayFocusedLeafTask();
            if (globallyFocusedTask != null && uid == globallyFocusedTask.effectiveUid) {
                hostTask = globallyFocusedTask;
            }
@@ -195,7 +194,7 @@ class PresentationController implements DisplayManager.DisplayListener {
        Task hostTask = null;
        if (ENABLE_PRESENTATION_FOR_CONNECTED_DISPLAYS.isTrue()) {
            final Task globallyFocusedTask =
                    win.mWmService.mRoot.getTopDisplayFocusedRootTask();
                    win.mWmService.mRoot.getTopDisplayFocusedLeafTask();
            if (globallyFocusedTask != null && uid == globallyFocusedTask.effectiveUid) {
                hostTask = globallyFocusedTask;
            }
+8 −0
Original line number Diff line number Diff line
@@ -1759,6 +1759,14 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        return null;
    }

    @Nullable
    Task getTopDisplayFocusedLeafTask() {
        final Task rootTask = getTopDisplayFocusedRootTask();
        return rootTask != null
                ? rootTask.getTopLeafTask(TaskFragment::isFocusableAndVisible)
                : null;
    }

    @Nullable
    ActivityRecord getTopResumedActivity() {
        final Task focusedRootTask = getTopDisplayFocusedRootTask();
+5 −1
Original line number Diff line number Diff line
@@ -2620,9 +2620,13 @@ class Task extends TaskFragment {

    /** Return the top-most leaf-task under this one, or this task if it is a leaf. */
    public Task getTopLeafTask() {
        return getTopLeafTask(alwaysTruePredicate());
    }

    Task getTopLeafTask(Predicate<Task> filter) {
        for (int i = mChildren.size() - 1; i >= 0; --i) {
            final Task child = mChildren.get(i).asTask();
            if (child == null) continue;
            if (child == null || !filter.test(child)) continue;
            return child.getTopLeafTask();
        }
        return this;
+33 −0
Original line number Diff line number Diff line
@@ -228,6 +228,31 @@ public class PresentationControllerTests extends WindowTestsBase {
        assertFalse(window.isVisible());
    }

    @EnableFlags(FLAG_ENABLE_PRESENTATION_FOR_CONNECTED_DISPLAYS)
    @Test
    public void testNewPresentationCannotShowOnPresentingDesk() {
        int uid = Binder.getCallingUid();
        final DisplayContent presentationDisplay = createPresentationDisplay();

        // Emulate the multi desk environment, where a desk task is created and have apps as child
        // tasks.
        final Task rootDeskTask = createTask(presentationDisplay);
        rootDeskTask.effectiveUid = uid + 1;
        final Task leafTask = createTaskInRootTask(rootDeskTask, uid);
        leafTask.effectiveUid = uid;
        final ActivityRecord activity = createActivityRecord(leafTask);
        assertTrue(activity.isVisible());

        // Adding a presentation window on the other display must succeed.
        final WindowState window = addPresentationWindow(uid, DEFAULT_DISPLAY);
        final Transition addTransition = window.mTransitionController.getCollectingTransition();
        completeTransition(addTransition, /*abortSync=*/ true);
        assertTrue(window.isVisible());

        // Adding another presentation window over the presentation must fail.
        assertAddPresentationWindowFails(uid, DEFAULT_DISPLAY);
    }

    private WindowState addPresentationWindow(int uid, int displayId) {
        final Session session = createTestSession(mAtm, 1234 /* pid */, uid);
        final int userId = UserHandle.getUserId(uid);
@@ -273,6 +298,14 @@ public class PresentationControllerTests extends WindowTestsBase {
        return dc;
    }

    static ActivityRecord createActivityRecord(Task task) {
        final ActivityRecord activity = createActivityRecord(task.getDisplayContent(), task);
        // PresentationController finds a host task based on the top resumed activity, so make sure
        // to set activity to be resumed in the parent task.
        task.setResumedActivity(activity, "createActivityRecord");
        return activity;
    }

    private void completeTransition(@NonNull Transition transition, boolean abortSync) {
        final ActionChain chain = ActionChain.testFinish(transition);
        if (abortSync) {