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

Commit f45a0441 authored by Ikram Gabiyev's avatar Ikram Gabiyev
Browse files

[PiP2] Update DisplayLayout on remote rotation too

We need to make sure display layout is properly rotated
when we receive a remote display rotation, not just
display change as a part of requestStartTransition().

We also need to make sure we do not consider this case as
fixed-rotation, by checking both start and endRotation.
If the PiP change has a well defined endRotation it means
the orientation flipped during collection and we won't be
doing async rotation, so handle this case as normal (same-orientation)
enter PiP animation case.

Bug: 378506208
Flag: com.android.wm.shell.enable_pip2
Test: enter PiP2 in fixed rotation with multi-activity app in ges-nav
Change-Id: I116396d27d4d5e6520fbc1d9e17f7a115b32d7a6
parent 6e1e3a56
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.wm.shell.pip2.phone;

import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;

@@ -290,6 +291,11 @@ public class PipController implements ConfigurationChangeListener,

        // Update the display layout caches even if we are not in PiP.
        setDisplayLayout(mDisplayController.getDisplayLayout(displayId));
        if (toRotation != ROTATION_UNDEFINED) {
            // Make sure we rotate to final rotation ourselves in case display change is coming
            // from the remote rotation as a part of an already collecting transition.
            mPipDisplayLayoutState.rotateTo(toRotation);
        }

        if (!mPipTransitionState.isInPip()) {
            // Skip the PiP-relevant updates if we aren't in a valid PiP state.
+8 −1
Original line number Diff line number Diff line
@@ -241,7 +241,7 @@ public class PipTransition extends PipTransitionController implements
            extra.putParcelable(PIP_TASK_LEASH, pipChange.getLeash());
            mPipTransitionState.setState(PipTransitionState.ENTERING_PIP, extra);

            if (mPipTransitionState.isInSwipePipToHomeTransition()) {
            if (isInSwipePipToHomeTransition()) {
                // If this is the second transition as a part of swipe PiP to home cuj,
                // handle this transition as a special case with no-op animation.
                return handleSwipePipToHomeTransition(info, startTransaction, finishTransaction,
@@ -701,6 +701,13 @@ public class PipTransition extends PipTransitionController implements
            @NonNull TransitionInfo.Change pipChange) {
        TransitionInfo.Change fixedRotationChange = findFixedRotationChange(info);
        int startRotation = pipChange.getStartRotation();
        if (pipChange.getEndRotation() != ROTATION_UNDEFINED
                && startRotation != pipChange.getEndRotation()) {
            // If PiP change was collected along with the display change and the orientation change
            // happened in sync with the PiP change, then do not treat this as fixed-rotation case.
            return ROTATION_0;
        }

        int endRotation = fixedRotationChange != null
                ? fixedRotationChange.getEndFixedRotation() : mPipDisplayLayoutState.getRotation();
        int delta = endRotation == ROTATION_UNDEFINED ? ROTATION_0