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

Commit dc8af9bd authored by Mateusz Cicheński's avatar Mateusz Cicheński
Browse files

Fix entry bounds for 3 button nav

The fix uses the similar approach to shelf height to ensure that the
keep clear area is being updated as soon as possible for quickstep.

Without this, the entry animation finishes before the actual keep
clear area from the view is registered, which causes the PiP to enter
lower right corner and then move up, which was the regression.

Bug: 260779127
Test: manually
Test: http://recall/-/g8x7ZkgdfbqscttAA9wzl9/72aNHwWH5wihwN4gf3mfj

Change-Id: I548a4821915c6b9066836374910a94f6bcae6630
parent 767ab1e8
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -70,4 +70,9 @@ interface IPip {
     * Sets the next pip animation type to be the alpha animation.
     */
    oneway void setPipAnimationTypeToAlpha() = 5;

    /**
     * Sets the height and visibility of the Launcher keep clear area.
     */
    oneway void setLauncherKeepClearAreaHeight(boolean visible, int height) = 6;
}
+14 −0
Original line number Diff line number Diff line
@@ -1178,6 +1178,20 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        destinationBoundsOut.set(newDestinationBounds);
    }

    /**
     * Directly update the animator bounds.
     */
    public void updateAnimatorBounds(Rect bounds) {
        final PipAnimationController.PipTransitionAnimator animator =
                mPipAnimationController.getCurrentAnimator();
        if (animator != null && animator.isRunning()) {
            if (animator.getAnimationType() == ANIM_TYPE_BOUNDS) {
                animator.updateEndValue(bounds);
            }
            animator.setDestinationBounds(bounds);
        }
    }

    /**
     * Handles all changes to the PictureInPictureParams.
     */
+10 −0
Original line number Diff line number Diff line
@@ -93,6 +93,11 @@ public class PipTransitionState {
        return hasEnteredPip(mState);
    }

    /** Returns true if activity is currently entering PiP mode. */
    public boolean isEnteringPip() {
        return isEnteringPip(mState);
    }

    public void setInSwipePipToHomeTransition(boolean inSwipePipToHomeTransition) {
        mInSwipePipToHomeTransition = inSwipePipToHomeTransition;
    }
@@ -130,6 +135,11 @@ public class PipTransitionState {
        return state == ENTERED_PIP;
    }

    /** Returns true if activity is currently entering PiP mode. */
    public static boolean isEnteringPip(@TransitionState int state) {
        return state == ENTERING_PIP;
    }

    public interface OnPipTransitionStateChangedListener {
        void onPipTransitionStateChanged(@TransitionState int oldState,
                @TransitionState int newState);
+34 −4
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ import com.android.wm.shell.sysui.UserChangeListener;
import com.android.wm.shell.transition.Transitions;

import java.io.PrintWriter;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -181,14 +182,20 @@ public class PipController implements PipTransitionController.PipTransitionCallb
            // early bail out if the keep clear areas feature is disabled
            return;
        }
        // only move if already in pip, other transitions account for keep clear areas
        if (mPipTransitionState.hasEnteredPip()) {
        // only move if we're in PiP or transitioning into PiP
        if (!mPipTransitionState.shouldBlockResizeRequest()) {
            Rect destBounds = mPipKeepClearAlgorithm.adjust(mPipBoundsState,
                    mPipBoundsAlgorithm);
            // only move if the bounds are actually different
            if (destBounds != mPipBoundsState.getBounds()) {
                if (mPipTransitionState.hasEnteredPip()) {
                    // if already in PiP, schedule separate animation
                    mPipTaskOrganizer.scheduleAnimateResizePip(destBounds,
                            mEnterAnimationDuration, null);
                } else if (mPipTransitionState.isEnteringPip()) {
                    // while entering PiP we just need to update animator bounds
                    mPipTaskOrganizer.updateAnimatorBounds(destBounds);
                }
            }
        }
    }
@@ -874,6 +881,21 @@ public class PipController implements PipTransitionController.PipTransitionCallb
        }
    }

    private void setLauncherKeepClearAreaHeight(boolean visible, int height) {
        if (visible) {
            Rect rect = new Rect(
                    0, mPipBoundsState.getDisplayBounds().bottom - height,
                    mPipBoundsState.getDisplayBounds().right,
                    mPipBoundsState.getDisplayBounds().bottom);
            Set<Rect> restrictedKeepClearAreas = new HashSet<>(
                    mPipBoundsState.getRestrictedKeepClearAreas());
            restrictedKeepClearAreas.add(rect);
            mPipBoundsState.setKeepClearAreas(restrictedKeepClearAreas,
                    mPipBoundsState.getUnrestrictedKeepClearAreas());
            updatePipPositionForKeepClearAreas();
        }
    }

    private void setOnIsInPipStateChangedListener(Consumer<Boolean> callback) {
        mOnIsInPipStateChangedListener = callback;
        if (mOnIsInPipStateChangedListener != null) {
@@ -1236,6 +1258,14 @@ public class PipController implements PipTransitionController.PipTransitionCallb
                    });
        }

        @Override
        public void setLauncherKeepClearAreaHeight(boolean visible, int height) {
            executeRemoteCallWithTaskPermission(mController, "setLauncherKeepClearAreaHeight",
                    (controller) -> {
                        controller.setLauncherKeepClearAreaHeight(visible, height);
                    });
        }

        @Override
        public void setPipAnimationListener(IPipAnimationListener listener) {
            executeRemoteCallWithTaskPermission(mController, "setPipAnimationListener",