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

Commit f6fda177 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Update PiP movement bounds on TaskBar inset change

The DisplayLayout#stableInsets was set according to navigation bar
height and not get updated when TaskBar becomes visible.

Video: http://recall/-/aaaaaabFQoRHlzixHdtY/dPuTSbBuAgjfyKiliwzo2Q
Bug: 198644965
Test: Open another app with PiP present and move it around, see Video
Test: atest WMShellUnitTests:PipControllerTest
Change-Id: I4db1446de0cb257e26d34985d294908cfe692967
parent 8df0cf45
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -96,7 +96,8 @@ public class DisplayLayout {


    /**
    /**
     * Different from {@link #equals(Object)}, this method compares the basic geometry properties
     * Different from {@link #equals(Object)}, this method compares the basic geometry properties
     * of two {@link DisplayLayout} objects including width, height, rotation, density and cutout.
     * of two {@link DisplayLayout} objects including width, height, rotation, density, cutout and
     * insets.
     * @return {@code true} if the given {@link DisplayLayout} is identical geometry wise.
     * @return {@code true} if the given {@link DisplayLayout} is identical geometry wise.
     */
     */
    public boolean isSameGeometry(@NonNull DisplayLayout other) {
    public boolean isSameGeometry(@NonNull DisplayLayout other) {
@@ -104,7 +105,8 @@ public class DisplayLayout {
                && mHeight == other.mHeight
                && mHeight == other.mHeight
                && mRotation == other.mRotation
                && mRotation == other.mRotation
                && mDensityDpi == other.mDensityDpi
                && mDensityDpi == other.mDensityDpi
                && Objects.equals(mCutout, other.mCutout);
                && Objects.equals(mCutout, other.mCutout)
                && Objects.equals(mStableInsets, other.mStableInsets);
    }
    }


    @Override
    @Override
+2 −1
Original line number Original line Diff line number Diff line
@@ -333,6 +333,7 @@ public abstract class WMShellModule {
            WindowManagerShellWrapper windowManagerShellWrapper,
            WindowManagerShellWrapper windowManagerShellWrapper,
            TaskStackListenerImpl taskStackListener,
            TaskStackListenerImpl taskStackListener,
            PipParamsChangedForwarder pipParamsChangedForwarder,
            PipParamsChangedForwarder pipParamsChangedForwarder,
            DisplayInsetsController displayInsetsController,
            Optional<OneHandedController> oneHandedController,
            Optional<OneHandedController> oneHandedController,
            @ShellMainThread ShellExecutor mainExecutor) {
            @ShellMainThread ShellExecutor mainExecutor) {
        return Optional.ofNullable(PipController.create(
        return Optional.ofNullable(PipController.create(
@@ -341,7 +342,7 @@ public abstract class WMShellModule {
                pipBoundsState, pipMotionHelper, pipMediaController, phonePipMenuController,
                pipBoundsState, pipMotionHelper, pipMediaController, phonePipMenuController,
                pipTaskOrganizer, pipTransitionState, pipTouchHandler, pipTransitionController,
                pipTaskOrganizer, pipTransitionState, pipTouchHandler, pipTransitionController,
                windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder,
                windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder,
                oneHandedController, mainExecutor));
                displayInsetsController, oneHandedController, mainExecutor));
    }
    }


    @WMSingleton
    @WMSingleton
+17 −1
Original line number Original line Diff line number Diff line
@@ -49,6 +49,7 @@ import android.os.UserManager;
import android.util.Pair;
import android.util.Pair;
import android.util.Size;
import android.util.Size;
import android.view.DisplayInfo;
import android.view.DisplayInfo;
import android.view.InsetsState;
import android.view.SurfaceControl;
import android.view.SurfaceControl;
import android.view.WindowManagerGlobal;
import android.view.WindowManagerGlobal;
import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransaction;
@@ -64,6 +65,7 @@ import com.android.wm.shell.R;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.common.DisplayChangeController;
import com.android.wm.shell.common.DisplayChangeController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.RemoteCallable;
import com.android.wm.shell.common.RemoteCallable;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.ShellExecutor;
@@ -135,6 +137,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
    private PipTransitionController mPipTransitionController;
    private PipTransitionController mPipTransitionController;
    private TaskStackListenerImpl mTaskStackListener;
    private TaskStackListenerImpl mTaskStackListener;
    private PipParamsChangedForwarder mPipParamsChangedForwarder;
    private PipParamsChangedForwarder mPipParamsChangedForwarder;
    private DisplayInsetsController mDisplayInsetsController;
    private Optional<OneHandedController> mOneHandedController;
    private Optional<OneHandedController> mOneHandedController;
    private final ShellCommandHandler mShellCommandHandler;
    private final ShellCommandHandler mShellCommandHandler;
    private final ShellController mShellController;
    private final ShellController mShellController;
@@ -338,6 +341,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
            WindowManagerShellWrapper windowManagerShellWrapper,
            WindowManagerShellWrapper windowManagerShellWrapper,
            TaskStackListenerImpl taskStackListener,
            TaskStackListenerImpl taskStackListener,
            PipParamsChangedForwarder pipParamsChangedForwarder,
            PipParamsChangedForwarder pipParamsChangedForwarder,
            DisplayInsetsController displayInsetsController,
            Optional<OneHandedController> oneHandedController,
            Optional<OneHandedController> oneHandedController,
            ShellExecutor mainExecutor) {
            ShellExecutor mainExecutor) {
        if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
        if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
@@ -351,7 +355,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
                pipBoundsState, pipMotionHelper, pipMediaController, phonePipMenuController,
                pipBoundsState, pipMotionHelper, pipMediaController, phonePipMenuController,
                pipTaskOrganizer, pipTransitionState, pipTouchHandler, pipTransitionController,
                pipTaskOrganizer, pipTransitionState, pipTouchHandler, pipTransitionController,
                windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder,
                windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder,
                oneHandedController, mainExecutor)
                displayInsetsController, oneHandedController, mainExecutor)
                .mImpl;
                .mImpl;
    }
    }


@@ -374,6 +378,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
            WindowManagerShellWrapper windowManagerShellWrapper,
            WindowManagerShellWrapper windowManagerShellWrapper,
            TaskStackListenerImpl taskStackListener,
            TaskStackListenerImpl taskStackListener,
            PipParamsChangedForwarder pipParamsChangedForwarder,
            PipParamsChangedForwarder pipParamsChangedForwarder,
            DisplayInsetsController displayInsetsController,
            Optional<OneHandedController> oneHandedController,
            Optional<OneHandedController> oneHandedController,
            ShellExecutor mainExecutor
            ShellExecutor mainExecutor
    ) {
    ) {
@@ -407,6 +412,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
        mEnterAnimationDuration = mContext.getResources()
        mEnterAnimationDuration = mContext.getResources()
                .getInteger(R.integer.config_pipEnterAnimationDuration);
                .getInteger(R.integer.config_pipEnterAnimationDuration);
        mPipParamsChangedForwarder = pipParamsChangedForwarder;
        mPipParamsChangedForwarder = pipParamsChangedForwarder;
        mDisplayInsetsController = displayInsetsController;


        shellInit.addInitCallback(this::onInit, this);
        shellInit.addInitCallback(this::onInit, this);
    }
    }
@@ -549,6 +555,16 @@ public class PipController implements PipTransitionController.PipTransitionCallb
                    }
                    }
                });
                });


        mDisplayInsetsController.addInsetsChangedListener(mPipBoundsState.getDisplayId(),
                new DisplayInsetsController.OnInsetsChangedListener() {
                    @Override
                    public void insetsChanged(InsetsState insetsState) {
                        onDisplayChanged(
                                mDisplayController.getDisplayLayout(mPipBoundsState.getDisplayId()),
                                false /* saveRestoreSnapFraction */);
                    }
                });

        mOneHandedController.ifPresent(controller -> {
        mOneHandedController.ifPresent(controller -> {
            controller.registerTransitionCallback(
            controller.registerTransitionCallback(
                    new OneHandedTransitionCallback() {
                    new OneHandedTransitionCallback() {
+7 −5
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ import android.util.Size;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.TaskStackListenerImpl;
import com.android.wm.shell.common.TaskStackListenerImpl;
@@ -99,7 +100,8 @@ public class PipControllerTest extends ShellTestCase {
    @Mock private TaskStackListenerImpl mMockTaskStackListener;
    @Mock private TaskStackListenerImpl mMockTaskStackListener;
    @Mock private ShellExecutor mMockExecutor;
    @Mock private ShellExecutor mMockExecutor;
    @Mock private Optional<OneHandedController> mMockOneHandedController;
    @Mock private Optional<OneHandedController> mMockOneHandedController;
    @Mock private PipParamsChangedForwarder mPipParamsChangedForwarder;
    @Mock private PipParamsChangedForwarder mMockPipParamsChangedForwarder;
    @Mock private DisplayInsetsController mMockDisplayInsetsController;


    @Mock private DisplayLayout mMockDisplayLayout1;
    @Mock private DisplayLayout mMockDisplayLayout1;
    @Mock private DisplayLayout mMockDisplayLayout2;
    @Mock private DisplayLayout mMockDisplayLayout2;
@@ -120,8 +122,8 @@ public class PipControllerTest extends ShellTestCase {
                mMockPipBoundsState, mMockPipMotionHelper, mMockPipMediaController,
                mMockPipBoundsState, mMockPipMotionHelper, mMockPipMediaController,
                mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTransitionState,
                mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTransitionState,
                mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
                mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
                mMockTaskStackListener, mPipParamsChangedForwarder,
                mMockTaskStackListener, mMockPipParamsChangedForwarder,
                mMockOneHandedController, mMockExecutor);
                mMockDisplayInsetsController, mMockOneHandedController, mMockExecutor);
        mShellInit.init();
        mShellInit.init();
        when(mMockPipBoundsAlgorithm.getSnapAlgorithm()).thenReturn(mMockPipSnapAlgorithm);
        when(mMockPipBoundsAlgorithm.getSnapAlgorithm()).thenReturn(mMockPipSnapAlgorithm);
        when(mMockPipTouchHandler.getMotionHelper()).thenReturn(mMockPipMotionHelper);
        when(mMockPipTouchHandler.getMotionHelper()).thenReturn(mMockPipMotionHelper);
@@ -186,8 +188,8 @@ public class PipControllerTest extends ShellTestCase {
                mMockPipBoundsState, mMockPipMotionHelper, mMockPipMediaController,
                mMockPipBoundsState, mMockPipMotionHelper, mMockPipMediaController,
                mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTransitionState,
                mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTransitionState,
                mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
                mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
                mMockTaskStackListener, mPipParamsChangedForwarder,
                mMockTaskStackListener, mMockPipParamsChangedForwarder,
                mMockOneHandedController, mMockExecutor));
                mMockDisplayInsetsController, mMockOneHandedController, mMockExecutor));
    }
    }


    @Test
    @Test