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

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

Skip immediate hiding from finishTransition

It was used to solve flickering issues when dismissing split screen
and toggling pip without transition (commit 6914f083). But since most
of visibility changes are associated with transition, and there is
new synchronization mechanism of transaction. The immediate hiding
also doesn't make visual difference in legacy transition.

Typically, if the visibility is changed, it will schedule to call
prepareSurface, which will update surface visibility according to
isVisible().

This may reduce the latency to Activity#dispatchEnterAnimationComplete.

Also
- Initialize ActivityRecord surface as invisible so it doesn't need
  to update by hide() in the first prepareSurface().
- Remove unused method onSurfaceShown.

Bug: 260059642
Test: FilesAppPerfTest#testFilesColdStartPerformance
Change-Id: Icc9efecf2f078857a448f1cbeb85c865c6c8d401
parent 2a23c2e3
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -671,7 +671,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    private boolean mCurrentLaunchCanTurnScreenOn = true;
    private boolean mCurrentLaunchCanTurnScreenOn = true;


    /** Whether our surface was set to be showing in the last call to {@link #prepareSurfaces} */
    /** Whether our surface was set to be showing in the last call to {@link #prepareSurfaces} */
    private boolean mLastSurfaceShowing = true;
    private boolean mLastSurfaceShowing;


    /**
    /**
     * The activity is opaque and fills the entire space of this task.
     * The activity is opaque and fills the entire space of this task.
@@ -5495,7 +5495,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        // no animation but there will still be a transition set.
        // no animation but there will still be a transition set.
        // We still need to delay hiding the surface such that it
        // We still need to delay hiding the surface such that it
        // can be synchronized with showing the next surface in the transition.
        // can be synchronized with showing the next surface in the transition.
        if (!isVisible() && !delayed && !displayContent.mAppTransition.isTransitionSet()) {
        if (!usingShellTransitions && !isVisible() && !delayed
                && !displayContent.mAppTransition.isTransitionSet()) {
            SurfaceControl.openTransaction();
            SurfaceControl.openTransaction();
            try {
            try {
                forAllWindows(win -> {
                forAllWindows(win -> {
@@ -7433,6 +7434,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        }
        }
    }
    }


    @Override
    boolean showSurfaceOnCreation() {
        return false;
    }

    @Override
    @Override
    void prepareSurfaces() {
    void prepareSurfaces() {
        final boolean show = isVisible() || isAnimating(PARENTS,
        final boolean show = isVisible() || isAnimating(PARENTS,
+0 −8
Original line number Original line Diff line number Diff line
@@ -635,7 +635,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
        if (showSurfaceOnCreation()) {
        if (showSurfaceOnCreation()) {
            getSyncTransaction().show(mSurfaceControl);
            getSyncTransaction().show(mSurfaceControl);
        }
        }
        onSurfaceShown(getSyncTransaction());
        updateSurfacePositionNonOrganized();
        updateSurfacePositionNonOrganized();
    }
    }


@@ -687,13 +686,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
        scheduleAnimation();
        scheduleAnimation();
    }
    }


    /**
     * Called when the surface is shown for the first time.
     */
    void onSurfaceShown(Transaction t) {
        // do nothing
    }

    // Temp. holders for a chain of containers we are currently processing.
    // Temp. holders for a chain of containers we are currently processing.
    private final LinkedList<WindowContainer> mTmpChain1 = new LinkedList<>();
    private final LinkedList<WindowContainer> mTmpChain1 = new LinkedList<>();
    private final LinkedList<WindowContainer> mTmpChain2 = new LinkedList<>();
    private final LinkedList<WindowContainer> mTmpChain2 = new LinkedList<>();