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

Commit 20a817a1 authored by Evan Rosky's avatar Evan Rosky
Browse files

Fix rotation shell transition

The old freeze/legacy display rotation logic was running with
shell transitions enabled. Additionally, WindowState.removeImmediately
was removing its child surface in the wrong order causing it to not
be removed on the sync transaction and yielding several frames of
blackness.

Bug: 190002115
Test: enable shell transitions, launch a rotatable app (like messages),
      rotate device. Observe a jumpcut without black flicker.
Change-Id: Ia2ce00b1cf4317c6678e6b5f91407296b23cc87e
parent 0c8ec087
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -8151,7 +8151,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        if (shouldRelaunchLocked(changes, mTmpConfig) || forceNewConfig) {
            // Aha, the activity isn't handling the change, so DIE DIE DIE.
            configChangeFlags |= changes;
            if (!mAtmService.getTransitionController().isShellTransitionsEnabled()) {
                startFreezingScreenLocked(globalChanges);
            }
            forceNewConfig = false;
            preserveWindow &= isResizeOnlyChange(changes);
            final boolean hasResizeChange = hasResizeChange(changes & ~info.getRealConfigChanged());
+6 −2
Original line number Diff line number Diff line
@@ -2390,6 +2390,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP

    @Override
    void removeImmediately() {
        if (!mRemoved) {
            // Destroy surface before super call. The general pattern is that the children need
            // to be removed before the parent (so that the sync-engine tracking works). Since
            // WindowStateAnimator is a "virtual" child, we have to do it manually here.
            mWinAnimator.destroySurfaceLocked(getSyncTransaction());
        }
        super.removeImmediately();

        if (mRemoved) {
@@ -2431,8 +2437,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP

        disposeInputChannel();

        mWinAnimator.destroySurfaceLocked(mTmpTransaction);
        mTmpTransaction.apply();
        mSession.windowRemovedLocked();
        try {
            mClient.asBinder().unlinkToDeath(mDeathRecipient, 0);