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

Commit 6ce47cca authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Make transition ready if display becomes empty

When finishing the last activity on a display, there is no next
running activity so resume-top won't be called to execute transition
(i.e. setReady). Then make the transition ready explicitly for the
empty case to avoid transition timeout.

Bug: 341599629
Test: atest RootTaskTests#testFinishCurrentActivity
Test: Create a virtual display, launch an activity in it.
      After the activity calls finish, the transition should
      play immediately.
Change-Id: Ib6e981dccc253ad3d5dd92f4a5edf0c914bf7f81
parent a1dcd5ae
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -4033,6 +4033,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        if (next == null) {
            mRootWindowContainer.ensureVisibilityAndConfig(null /* starting */, mDisplayContent,
                    true /* deferResume */);
            if (mDisplayContent.topRunningActivity() == null) {
                // The transition is ready on a display with no running activities.
                mTransitionController.setReady(mDisplayContent);
            }
        }
        if (activityRemoved) {
            mRootWindowContainer.resumeFocusedTasksTopActivities();
+6 −0
Original line number Diff line number Diff line
@@ -1235,12 +1235,18 @@ public class RootTaskTests extends WindowTestsBase {
        assertEquals(STOPPING, activity2.getState());
        assertThat(mSupervisor.mStoppingActivities).contains(activity2);

        registerTestTransitionPlayer();
        final Transition transition = display.mTransitionController
                .requestCloseTransitionIfNeeded(rootTask1);
        transition.collectClose(rootTask1);
        // The display becomes empty. Since there is no next activity to be idle, the activity
        // should be destroyed immediately with updating configuration to restore original state.
        final ActivityRecord activity1 = finishTopActivity(rootTask1);
        assertEquals(DESTROYING, activity1.getState());
        verify(mRootWindowContainer).ensureVisibilityAndConfig(eq(null) /* starting */,
                eq(display), anyBoolean());
        assertTrue("Transition must be ready if there is no next running activity",
                transition.allReady());
    }

    private ActivityRecord finishTopActivity(Task task) {