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

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

Update bounds on display rotation

Make sure we properly update the PiP bounds
upon display rotation while already in PiP.

Bug: 357004254
Flag: com.android.wm.shell.enable_pip2_implementation
Test: atest WMShellFlickerTestsPip1:ShowPipAndRotateDisplay
Test: enter PiP and rotate display with home rotation enabled
Change-Id: Ic0444c36d7c6a64a9fb2cf196355a6954961a2a3
parent 1e561212
Loading
Loading
Loading
Loading
+38 −7
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import android.graphics.Rect;
import android.os.Bundle;
import android.view.InsetsState;
import android.view.SurfaceControl;
import android.window.DisplayAreaInfo;
import android.window.WindowContainerTransaction;

import androidx.annotation.BinderThread;
import androidx.annotation.Nullable;
@@ -40,6 +42,7 @@ import com.android.internal.protolog.ProtoLog;
import com.android.internal.util.Preconditions;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayChangeController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayLayout;
@@ -71,7 +74,8 @@ import java.util.function.Consumer;
 */
public class PipController implements ConfigurationChangeListener,
        PipTransitionState.PipTransitionStateChangedListener,
        DisplayController.OnDisplaysChangedListener, RemoteCallable<PipController> {
        DisplayController.OnDisplaysChangedListener,
        DisplayChangeController.OnDisplayChangingListener, RemoteCallable<PipController> {
    private static final String TAG = PipController.class.getSimpleName();
    private static final String SWIPE_TO_PIP_APP_BOUNDS = "pip_app_bounds";
    private static final String SWIPE_TO_PIP_OVERLAY = "swipe_to_pip_overlay";
@@ -197,11 +201,12 @@ public class PipController implements ConfigurationChangeListener,
        mPipDisplayLayoutState.setDisplayLayout(layout);

        mDisplayController.addDisplayWindowListener(this);
        mDisplayController.addDisplayChangingController(this);
        mDisplayInsetsController.addInsetsChangedListener(mPipDisplayLayoutState.getDisplayId(),
                new DisplayInsetsController.OnInsetsChangedListener() {
                    @Override
                    public void insetsChanged(InsetsState insetsState) {
                        onDisplayChanged(mDisplayController
                        setDisplayLayout(mDisplayController
                                        .getDisplayLayout(mPipDisplayLayoutState.getDisplayId()));
                    }
                });
@@ -264,11 +269,12 @@ public class PipController implements ConfigurationChangeListener,

    @Override
    public void onThemeChanged() {
        onDisplayChanged(new DisplayLayout(mContext, mContext.getDisplay()));
        setDisplayLayout(new DisplayLayout(mContext, mContext.getDisplay()));
    }

    //
    // DisplayController.OnDisplaysChangedListener implementations
    // DisplayController.OnDisplaysChangedListener and
    // DisplayChangeController.OnDisplayChangingListener implementations
    //

    @Override
@@ -276,7 +282,7 @@ public class PipController implements ConfigurationChangeListener,
        if (displayId != mPipDisplayLayoutState.getDisplayId()) {
            return;
        }
        onDisplayChanged(mDisplayController.getDisplayLayout(displayId));
        setDisplayLayout(mDisplayController.getDisplayLayout(displayId));
    }

    @Override
@@ -284,10 +290,35 @@ public class PipController implements ConfigurationChangeListener,
        if (displayId != mPipDisplayLayoutState.getDisplayId()) {
            return;
        }
        onDisplayChanged(mDisplayController.getDisplayLayout(displayId));
        setDisplayLayout(mDisplayController.getDisplayLayout(displayId));
    }

    private void onDisplayChanged(DisplayLayout layout) {
    /**
     * A callback for any observed transition that contains a display change in its
     * {@link android.window.TransitionRequestInfo} with a non-zero rotation delta.
     */
    @Override
    public void onDisplayChange(int displayId, int fromRotation, int toRotation,
            @Nullable DisplayAreaInfo newDisplayAreaInfo, WindowContainerTransaction t) {
        if (!mPipTransitionState.isInPip()) {
            return;
        }

        // Calculate the snap fraction pre-rotation.
        float snapFraction = mPipBoundsAlgorithm.getSnapFraction(mPipBoundsState.getBounds());

        // Update the caches to reflect the new display layout and movement bounds.
        mPipDisplayLayoutState.rotateTo(toRotation);
        mPipTouchHandler.updateMovementBounds();

        // The policy is to keep PiP width, height and snap fraction invariant.
        Rect toBounds = mPipBoundsState.getBounds();
        mPipBoundsAlgorithm.applySnapFraction(toBounds, snapFraction);
        mPipBoundsState.setBounds(toBounds);
        t.setBounds(mPipTransitionState.mPipTaskToken, toBounds);
    }

    private void setDisplayLayout(DisplayLayout layout) {
        mPipDisplayLayoutState.setDisplayLayout(layout);
    }

+1 −1
Original line number Diff line number Diff line
@@ -1039,7 +1039,7 @@ public class PipTouchHandler implements PipTransitionState.PipTransitionStateCha
     * Updates the current movement bounds based on whether the menu is currently visible and
     * resized.
     */
    private void updateMovementBounds() {
    void updateMovementBounds() {
        Rect insetBounds = new Rect();
        mPipBoundsAlgorithm.getInsetBounds(insetBounds);
        mPipBoundsAlgorithm.getMovementBounds(mPipBoundsState.getBounds(),