diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java new file mode 100644 index 0000000000000..10e5c3d33def8 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.pip; + +import android.annotation.NonNull; +import android.graphics.Rect; + +import java.io.PrintWriter; + +/** + * Singleton source of truth for the current state of PIP bounds. + */ +public final class PipBoundsState { + private static final String TAG = PipBoundsState.class.getSimpleName(); + + private final @NonNull Rect mBounds = new Rect(); + + void setBounds(@NonNull Rect bounds) { + mBounds.set(bounds); + } + + @NonNull + public Rect getBounds() { + return new Rect(mBounds); + } + + /** + * Dumps internal state. + */ + public void dump(PrintWriter pw, String prefix) { + final String innerPrefix = prefix + " "; + pw.println(prefix + TAG); + pw.println(innerPrefix + "mBounds=" + mBounds); + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index 846da0a77bca9..3485c7ae8ecb8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -134,11 +134,11 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, private final Handler mMainHandler; private final Handler mUpdateHandler; + private final PipBoundsState mPipBoundsState; private final PipBoundsHandler mPipBoundsHandler; private final PipAnimationController mPipAnimationController; private final PipUiEventLogger mPipUiEventLoggerLogger; private final List mPipTransitionCallbacks = new ArrayList<>(); - private final Rect mLastReportedBounds = new Rect(); private final int mEnterExitAnimationDuration; private final PipSurfaceTransactionHelper mSurfaceTransactionHelper; private final Map mInitialState = new HashMap<>(); @@ -262,7 +262,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, */ private boolean mShouldIgnoreEnteringPipTransition; - public PipTaskOrganizer(Context context, @NonNull PipBoundsHandler boundsHandler, + public PipTaskOrganizer(Context context, @NonNull PipBoundsState pipBoundsState, + @NonNull PipBoundsHandler boundsHandler, @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper, Optional splitScreenOptional, @NonNull DisplayController displayController, @@ -270,6 +271,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, @NonNull ShellTaskOrganizer shellTaskOrganizer) { mMainHandler = new Handler(Looper.getMainLooper()); mUpdateHandler = new Handler(PipUpdateThread.get().getLooper(), mUpdateCallbacks); + mPipBoundsState = pipBoundsState; mPipBoundsHandler = boundsHandler; mEnterExitAnimationDuration = context.getResources() .getInteger(R.integer.config_pipResizeAnimationDuration); @@ -292,17 +294,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, return mUpdateHandler; } - public Rect getLastReportedBounds() { - return new Rect(mLastReportedBounds); - } - public Rect getCurrentOrAnimatingBounds() { PipAnimationController.PipTransitionAnimator animator = mPipAnimationController.getCurrentAnimator(); if (animator != null && animator.isRunning()) { return new Rect(animator.getDestinationBounds()); } - return getLastReportedBounds(); + return mPipBoundsState.getBounds(); } public boolean isInPip() { @@ -347,7 +345,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, * Expect {@link #onTaskAppeared(ActivityManager.RunningTaskInfo, SurfaceControl)} afterwards. */ public void stopSwipePipToHome(ComponentName componentName, Rect destinationBounds) { - mLastReportedBounds.set(destinationBounds); + mPipBoundsState.setBounds(destinationBounds); } /** @@ -394,7 +392,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); mSurfaceTransactionHelper.scale(tx, mLeash, destinationBounds, - mLastReportedBounds); + mPipBoundsState.getBounds()); tx.setWindowCrop(mLeash, destinationBounds.width(), destinationBounds.height()); // We set to fullscreen here for now, but later it will be set to UNDEFINED for // the proper windowing mode to take place. See #applyWindowingModeChangeOnExit. @@ -408,9 +406,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, @Override public void onTransactionReady(int id, SurfaceControl.Transaction t) { t.apply(); - scheduleAnimateResizePip(mLastReportedBounds, destinationBounds, - getValidSourceHintRect(mTaskInfo, destinationBounds), direction, - animationDurationMs, null /* updateBoundsCallback */); + scheduleAnimateResizePip(mPipBoundsState.getBounds(), + destinationBounds, getValidSourceHintRect(mTaskInfo, destinationBounds), + direction, animationDurationMs, null /* updateBoundsCallback */); mState = State.EXITING_PIP; } }); @@ -441,7 +439,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, // removePipImmediately is expected when the following animation finishes. mUpdateHandler.post(() -> mPipAnimationController - .getAnimator(mLeash, mLastReportedBounds, 1f, 0f) + .getAnimator(mLeash, mPipBoundsState.getBounds(), 1f, 0f) .setTransitionDirection(TRANSITION_DIRECTION_REMOVE_STACK) .setPipAnimationCallback(mPipAnimationCallback) .setDuration(mEnterExitAnimationDuration) @@ -480,7 +478,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, if (mShouldIgnoreEnteringPipTransition) { // Animation has been finished together with Recents, directly apply the sync // transaction to PiP here. - applyEnterPipSyncTransaction(mLastReportedBounds, () -> { + applyEnterPipSyncTransaction(mPipBoundsState.getBounds(), () -> { mState = State.ENTERED_PIP; }); mShouldIgnoreEnteringPipTransition = false; @@ -572,7 +570,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, private void sendOnPipTransitionStarted( @PipAnimationController.TransitionDirection int direction) { - final Rect pipBounds = new Rect(mLastReportedBounds); + final Rect pipBounds = mPipBoundsState.getBounds(); runOnMainHandler(() -> { for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) { final PipTransitionCallback callback = mPipTransitionCallbacks.get(i); @@ -701,7 +699,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, } final Rect destinationBounds = mPipBoundsHandler.getDestinationBounds( info.topActivity, getAspectRatioOrDefault(newParams), - mLastReportedBounds, getMinimalSize(info.topActivityInfo), + mPipBoundsState.getBounds(), getMinimalSize(info.topActivityInfo), true /* userCurrentMinEdgeSize */); Objects.requireNonNull(destinationBounds, "Missing destination bounds"); scheduleAnimateResizePip(destinationBounds, mEnterExitAnimationDuration, @@ -759,7 +757,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, sendOnPipTransitionCancelled(direction); sendOnPipTransitionFinished(direction); } - mLastReportedBounds.set(destinationBoundsOut); + mPipBoundsState.setBounds(destinationBoundsOut); // Create a reset surface transaction for the new bounds and update the window // container transaction @@ -774,8 +772,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, destinationBoundsOut.set(animator.getDestinationBounds()); } } else { - if (!mLastReportedBounds.isEmpty()) { - destinationBoundsOut.set(mLastReportedBounds); + if (!mPipBoundsState.getBounds().isEmpty()) { + destinationBoundsOut.set(mPipBoundsState.getBounds()); } } } @@ -827,7 +825,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, Log.d(TAG, "skip scheduleAnimateResizePip, entering pip deferred"); return; } - scheduleAnimateResizePip(mLastReportedBounds, toBounds, null /* sourceHintRect */, + scheduleAnimateResizePip(mPipBoundsState.getBounds(), toBounds, null /* sourceHintRect */, TRANSITION_DIRECTION_NONE, duration, updateBoundsCallback); } @@ -963,7 +961,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, Log.w(TAG, "Abort animation, invalid leash"); return; } - mLastReportedBounds.set(destinationBounds); + mPipBoundsState.setBounds(destinationBounds); final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); mSurfaceTransactionHelper .crop(tx, mLeash, destinationBounds) @@ -999,7 +997,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, throw new RuntimeException("Callers should call scheduleResizePip() instead of this " + "directly"); } - mLastReportedBounds.set(destinationBounds); + mPipBoundsState.setBounds(destinationBounds); if (direction == TRANSITION_DIRECTION_REMOVE_STACK) { removePipImmediately(); return; @@ -1141,7 +1139,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, pw.println(innerPrefix + "mState=" + mState); pw.println(innerPrefix + "mOneShotAnimationType=" + mOneShotAnimationType); pw.println(innerPrefix + "mPictureInPictureParams=" + mPictureInPictureParams); - pw.println(innerPrefix + "mLastReportedBounds=" + mLastReportedBounds); pw.println(innerPrefix + "mInitialState:"); for (Map.Entry e : mInitialState.entrySet()) { pw.println(innerPrefix + " binder=" + e.getKey() diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipAccessibilityInteractionConnection.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipAccessibilityInteractionConnection.java index fddd5472e02c0..18b6922f30673 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipAccessibilityInteractionConnection.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipAccessibilityInteractionConnection.java @@ -15,6 +15,7 @@ */ package com.android.wm.shell.pip.phone; +import android.annotation.NonNull; import android.content.Context; import android.graphics.Rect; import android.graphics.Region; @@ -28,6 +29,7 @@ import android.view.accessibility.IAccessibilityInteractionConnection; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; import com.android.wm.shell.R; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipSnapAlgorithm; import com.android.wm.shell.pip.PipTaskOrganizer; @@ -50,6 +52,7 @@ public class PipAccessibilityInteractionConnection private Context mContext; private Handler mHandler; + private final @NonNull PipBoundsState mPipBoundsState; private PipMotionHelper mMotionHelper; private PipTaskOrganizer mTaskOrganizer; private PipSnapAlgorithm mSnapAlgorithm; @@ -62,12 +65,14 @@ public class PipAccessibilityInteractionConnection private final Rect mExpandedMovementBounds = new Rect(); private Rect mTmpBounds = new Rect(); - public PipAccessibilityInteractionConnection(Context context, PipMotionHelper motionHelper, + public PipAccessibilityInteractionConnection(Context context, + @NonNull PipBoundsState pipBoundsState, PipMotionHelper motionHelper, PipTaskOrganizer taskOrganizer, PipSnapAlgorithm snapAlgorithm, AccessibilityCallbacks callbacks, Runnable updateMovementBoundCallback, Handler handler) { mContext = context; mHandler = handler; + mPipBoundsState = pipBoundsState; mMotionHelper = motionHelper; mTaskOrganizer = taskOrganizer; mSnapAlgorithm = snapAlgorithm; @@ -148,7 +153,7 @@ public class PipAccessibilityInteractionConnection private void setToExpandedBounds() { float savedSnapFraction = mSnapAlgorithm.getSnapFraction( - new Rect(mTaskOrganizer.getLastReportedBounds()), mNormalMovementBounds); + mPipBoundsState.getBounds(), mNormalMovementBounds); mSnapAlgorithm.applySnapFraction(mExpandedBounds, mExpandedMovementBounds, savedSnapFraction); mTaskOrganizer.scheduleFinishResizePip(mExpandedBounds, (Rect bounds) -> { @@ -159,7 +164,7 @@ public class PipAccessibilityInteractionConnection private void setToNormalBounds() { float savedSnapFraction = mSnapAlgorithm.getSnapFraction( - new Rect(mTaskOrganizer.getLastReportedBounds()), mExpandedMovementBounds); + mPipBoundsState.getBounds(), mExpandedMovementBounds); mSnapAlgorithm.applySnapFraction(mNormalBounds, mNormalMovementBounds, savedSnapFraction); mTaskOrganizer.scheduleFinishResizePip(mNormalBounds, (Rect bounds) -> { mMotionHelper.synchronizePinnedStackBounds(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index ea9c9609f6f59..fd5bf422188f8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static com.android.wm.shell.pip.PipAnimationController.isOutPipDirection; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.PictureInPictureParams; @@ -44,6 +45,7 @@ import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.pip.PinnedStackListenerForwarder; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipBoundsHandler; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipTaskOrganizer; import java.io.PrintWriter; @@ -65,6 +67,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac private DisplayController mDisplayController; private PipAppOpsListener mAppOpsListener; private PipBoundsHandler mPipBoundsHandler; + private @NonNull PipBoundsState mPipBoundsState; private PipMediaController mMediaController; private PipTouchHandler mTouchHandler; private Consumer mPinnedStackAnimationRecentsCallback; @@ -97,7 +100,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac // If the pip was in the offset zone earlier, adjust the new bounds to the bottom of the // movement bounds mTouchHandler.adjustBoundsForRotation(mTmpNormalBounds, - mPipTaskOrganizer.getLastReportedBounds(), mTmpInsetBounds); + mPipBoundsState.getBounds(), mTmpInsetBounds); // The bounds are being applied to a specific snap fraction, so reset any known offsets // for the previous orientation before updating the movement bounds. @@ -196,6 +199,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac DisplayController displayController, PipAppOpsListener pipAppOpsListener, PipBoundsHandler pipBoundsHandler, + @NonNull PipBoundsState pipBoundsState, PipMediaController pipMediaController, PipMenuActivityController pipMenuActivityController, PipTaskOrganizer pipTaskOrganizer, @@ -206,7 +210,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac if (PipUtils.hasSystemFeature(mContext)) { initController(context, displayController, pipAppOpsListener, pipBoundsHandler, - pipMediaController, pipMenuActivityController, pipTaskOrganizer, + pipBoundsState, pipMediaController, pipMenuActivityController, pipTaskOrganizer, pipTouchHandler, windowManagerShellWrapper); } else { Log.w(TAG, "Device not support PIP feature"); @@ -217,6 +221,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac DisplayController displayController, PipAppOpsListener pipAppOpsListener, PipBoundsHandler pipBoundsHandler, + @NonNull PipBoundsState pipBoundsState, PipMediaController pipMediaController, PipMenuActivityController pipMenuActivityController, PipTaskOrganizer pipTaskOrganizer, @@ -232,6 +237,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac mWindowManagerShellWrapper = windowManagerShellWrapper; mDisplayController = displayController; mPipBoundsHandler = pipBoundsHandler; + mPipBoundsState = pipBoundsState; mPipTaskOrganizer = pipTaskOrganizer; mPipTaskOrganizer.registerPipTransitionCallback(this); mMediaController = pipMediaController; @@ -360,7 +366,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac final boolean changed = mPipBoundsHandler.setShelfHeight(visible, shelfHeight); if (changed) { mTouchHandler.onShelfVisibilityChanged(visible, shelfHeight); - updateMovementBounds(mPipTaskOrganizer.getLastReportedBounds(), + updateMovementBounds(mPipBoundsState.getBounds(), false /* fromRotation */, false /* fromImeAdjustment */, true /* fromShelfAdjustment */, null /* windowContainerTransaction */); } @@ -445,5 +451,6 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac mTouchHandler.dump(pw, innerPrefix); mPipBoundsHandler.dump(pw, innerPrefix); mPipTaskOrganizer.dump(pw, innerPrefix); + mPipBoundsState.dump(pw, innerPrefix); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java index fe1d44c72845c..b5fa030824017 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java @@ -37,6 +37,7 @@ import com.android.wm.shell.animation.FloatProperties; import com.android.wm.shell.animation.PhysicsAnimator; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.magnetictarget.MagnetizedObject; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipSnapAlgorithm; import com.android.wm.shell.pip.PipTaskOrganizer; @@ -66,6 +67,7 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, private final Context mContext; private final PipTaskOrganizer mPipTaskOrganizer; + private final @NonNull PipBoundsState mPipBoundsState; private PipMenuActivityController mMenuController; private PipSnapAlgorithm mSnapAlgorithm; @@ -178,11 +180,12 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, public void onPipTransitionCanceled(ComponentName activity, int direction) {} }; - public PipMotionHelper(Context context, PipTaskOrganizer pipTaskOrganizer, - PipMenuActivityController menuController, PipSnapAlgorithm snapAlgorithm, - FloatingContentCoordinator floatingContentCoordinator) { + public PipMotionHelper(Context context, @NonNull PipBoundsState pipBoundsState, + PipTaskOrganizer pipTaskOrganizer, PipMenuActivityController menuController, + PipSnapAlgorithm snapAlgorithm, FloatingContentCoordinator floatingContentCoordinator) { mContext = context; mPipTaskOrganizer = pipTaskOrganizer; + mPipBoundsState = pipBoundsState; mMenuController = menuController; mSnapAlgorithm = snapAlgorithm; mFloatingContentCoordinator = floatingContentCoordinator; @@ -220,7 +223,7 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, */ void synchronizePinnedStackBounds() { cancelAnimations(); - mBounds.set(mPipTaskOrganizer.getLastReportedBounds()); + mBounds.set(mPipBoundsState.getBounds()); mTemporaryBounds.setEmpty(); if (mPipTaskOrganizer.isInPip()) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java index 07beb43d4faae..a2233e5c58742 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java @@ -22,6 +22,7 @@ import static com.android.wm.shell.pip.phone.PipMenuActivityController.MENU_STAT import static com.android.wm.shell.pip.phone.PipMenuActivityController.MENU_STATE_FULL; import static com.android.wm.shell.pip.phone.PipMenuActivityController.MENU_STATE_NONE; +import android.annotation.NonNull; import android.annotation.SuppressLint; import android.content.ComponentName; import android.content.Context; @@ -48,6 +49,7 @@ import com.android.wm.shell.R; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipBoundsHandler; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipUiEventLogger; @@ -70,6 +72,7 @@ public class PipTouchHandler { private final boolean mEnableResize; private final Context mContext; private final PipBoundsHandler mPipBoundsHandler; + private final @NonNull PipBoundsState mPipBoundsState; private final PipUiEventLogger mPipUiEventLogger; private final PipDismissTargetHandler mPipDismissTargetHandler; @@ -161,6 +164,7 @@ public class PipTouchHandler { public PipTouchHandler(Context context, PipMenuActivityController menuController, PipBoundsHandler pipBoundsHandler, + @NonNull PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, FloatingContentCoordinator floatingContentCoordinator, PipUiEventLogger pipUiEventLogger) { @@ -168,11 +172,12 @@ public class PipTouchHandler { mContext = context; mAccessibilityManager = context.getSystemService(AccessibilityManager.class); mPipBoundsHandler = pipBoundsHandler; + mPipBoundsState = pipBoundsState; mMenuController = menuController; mMenuController.addListener(new PipMenuListener()); mGesture = new DefaultPipTouchGesture(); - mMotionHelper = new PipMotionHelper(mContext, pipTaskOrganizer, mMenuController, - mPipBoundsHandler.getSnapAlgorithm(), floatingContentCoordinator); + mMotionHelper = new PipMotionHelper(mContext, pipBoundsState, pipTaskOrganizer, + mMenuController, mPipBoundsHandler.getSnapAlgorithm(), floatingContentCoordinator); mPipResizeGestureHandler = new PipResizeGestureHandler(context, pipBoundsHandler, mMotionHelper, pipTaskOrganizer, this::getMovementBounds, @@ -189,8 +194,8 @@ public class PipTouchHandler { reloadResources(); mFloatingContentCoordinator = floatingContentCoordinator; - mConnection = new PipAccessibilityInteractionConnection(mContext, mMotionHelper, - pipTaskOrganizer, mPipBoundsHandler.getSnapAlgorithm(), + mConnection = new PipAccessibilityInteractionConnection(mContext, pipBoundsState, + mMotionHelper, pipTaskOrganizer, mPipBoundsHandler.getSnapAlgorithm(), this::onAccessibilityShowMenu, this::updateMovementBounds, mHandler); mPipUiEventLogger = pipUiEventLogger; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java index 92f03e1adf8f2..2b987e98bc7e0 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java @@ -34,6 +34,7 @@ import android.testing.TestableLooper; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.pip.PipBoundsHandler; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipTestCase; import com.android.wm.shell.pip.phone.PipAppOpsListener; @@ -67,10 +68,12 @@ public class PipControllerTest extends PipTestCase { @Mock private PipTaskOrganizer mMockPipTaskOrganizer; @Mock private PipTouchHandler mMockPipTouchHandler; @Mock private WindowManagerShellWrapper mMockWindowManagerShellWrapper; + private PipBoundsState mPipBoundsState; @Before public void setUp() throws RemoteException { MockitoAnnotations.initMocks(this); + mPipBoundsState = new PipBoundsState(); mSpiedContext = spy(mContext); @@ -78,9 +81,9 @@ public class PipControllerTest extends PipTestCase { when(mSpiedContext.getPackageManager()).thenReturn(mPackageManager); mPipController = new PipController(mSpiedContext, mMockdDisplayController, - mMockPipAppOpsListener, mMockPipBoundsHandler, mMockPipMediaController, - mMockPipMenuActivityController, mMockPipTaskOrganizer, mMockPipTouchHandler, - mMockWindowManagerShellWrapper); + mMockPipAppOpsListener, mMockPipBoundsHandler, mPipBoundsState, + mMockPipMediaController, mMockPipMenuActivityController, mMockPipTaskOrganizer, + mMockPipTouchHandler, mMockWindowManagerShellWrapper); } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java index c66ba13eff481..37b93bcdd051a 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java @@ -35,6 +35,7 @@ import android.testing.TestableLooper; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.pip.PipBoundsHandler; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipTestCase; @@ -66,19 +67,21 @@ public class PipTaskOrganizerTest extends PipTestCase { @Mock private PipUiEventLogger mMockPipUiEventLogger; @Mock private Optional mMockOptionalSplitScreen; @Mock private ShellTaskOrganizer mMockShellTaskOrganizer; + private PipBoundsState mPipBoundsState; @Before public void setUp() throws RemoteException { MockitoAnnotations.initMocks(this); + mPipBoundsState = new PipBoundsState(); mSpiedContext = spy(mContext); when(mPackageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)).thenReturn(false); when(mSpiedContext.getPackageManager()).thenReturn(mPackageManager); - mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mSpiedContext, mMockPipBoundsHandler, - mMockPipSurfaceTransactionHelper, mMockOptionalSplitScreen, mMockdDisplayController, - mMockPipUiEventLogger, mMockShellTaskOrganizer)); + mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mSpiedContext, mPipBoundsState, + mMockPipBoundsHandler, mMockPipSurfaceTransactionHelper, mMockOptionalSplitScreen, + mMockdDisplayController, mMockPipUiEventLogger, mMockShellTaskOrganizer)); } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java index 93a45c4e1a44e..4713142118a89 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java @@ -33,6 +33,7 @@ import androidx.test.filters.SmallTest; import com.android.wm.shell.R; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.pip.PipBoundsHandler; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipSnapAlgorithm; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipTestCase; @@ -74,6 +75,7 @@ public class PipTouchHandlerTest extends PipTestCase { @Mock private PipUiEventLogger mPipUiEventLogger; + private PipBoundsState mPipBoundsState; private PipBoundsHandler mPipBoundsHandler; private PipSnapAlgorithm mPipSnapAlgorithm; private PipMotionHelper mMotionHelper; @@ -90,11 +92,12 @@ public class PipTouchHandlerTest extends PipTestCase { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); + mPipBoundsState = new PipBoundsState(); mPipBoundsHandler = new PipBoundsHandler(mContext); mPipSnapAlgorithm = mPipBoundsHandler.getSnapAlgorithm(); mPipSnapAlgorithm = new PipSnapAlgorithm(mContext); mPipTouchHandler = new PipTouchHandler(mContext, mPipMenuActivityController, - mPipBoundsHandler, mPipTaskOrganizer, mFloatingContentCoordinator, + mPipBoundsHandler, mPipBoundsState, mPipTaskOrganizer, mFloatingContentCoordinator, mPipUiEventLogger); mMotionHelper = Mockito.spy(mPipTouchHandler.getMotionHelper()); mPipResizeGestureHandler = Mockito.spy(mPipTouchHandler.getPipResizeGestureHandler()); diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java index 247baf8f3a422..f55445ca1de3c 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java @@ -26,6 +26,7 @@ import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipBoundsHandler; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipUiEventLogger; @@ -84,14 +85,21 @@ public abstract class TvPipModule { return new PipBoundsHandler(context); } + @SysUISingleton + @Provides + static PipBoundsState providePipBoundsState() { + return new PipBoundsState(); + } + @SysUISingleton @Provides static PipTaskOrganizer providePipTaskOrganizer(Context context, + PipBoundsState pipBoundsState, PipBoundsHandler pipBoundsHandler, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional splitScreenOptional, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer) { - return new PipTaskOrganizer(context, pipBoundsHandler, + return new PipTaskOrganizer(context, pipBoundsState, pipBoundsHandler, pipSurfaceTransactionHelper, splitScreenOptional, displayController, pipUiEventLogger, shellTaskOrganizer); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java index ae7b108a2afaa..975757a4c259f 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java @@ -32,6 +32,7 @@ import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipBoundsHandler; +import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipUiEventLogger; @@ -71,14 +72,16 @@ public class WMShellModule { DisplayController displayController, PipAppOpsListener pipAppOpsListener, PipBoundsHandler pipBoundsHandler, + PipBoundsState pipBoundsState, PipMediaController pipMediaController, PipMenuActivityController pipMenuActivityController, PipTaskOrganizer pipTaskOrganizer, PipTouchHandler pipTouchHandler, WindowManagerShellWrapper windowManagerShellWrapper) { return new PipController(context, displayController, - pipAppOpsListener, pipBoundsHandler, pipMediaController, pipMenuActivityController, - pipTaskOrganizer, pipTouchHandler, windowManagerShellWrapper); + pipAppOpsListener, pipBoundsHandler, pipBoundsState, pipMediaController, + pipMenuActivityController, pipTaskOrganizer, pipTouchHandler, + windowManagerShellWrapper); } @SysUISingleton @@ -92,6 +95,12 @@ public class WMShellModule { displayImeController, handler, transactionPool, shellTaskOrganizer, syncQueue); } + @SysUISingleton + @Provides + static PipBoundsState providePipBoundsState() { + return new PipBoundsState(); + } + @SysUISingleton @Provides static PipBoundsHandler providesPipBoundsHandler(Context context) { @@ -109,21 +118,23 @@ public class WMShellModule { @Provides static PipTouchHandler providesPipTouchHandler(Context context, PipMenuActivityController menuActivityController, PipBoundsHandler pipBoundsHandler, + PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, FloatingContentCoordinator floatingContentCoordinator, PipUiEventLogger pipUiEventLogger) { return new PipTouchHandler(context, menuActivityController, pipBoundsHandler, - pipTaskOrganizer, floatingContentCoordinator, pipUiEventLogger); + pipBoundsState, pipTaskOrganizer, floatingContentCoordinator, pipUiEventLogger); } @SysUISingleton @Provides static PipTaskOrganizer providesPipTaskOrganizer(Context context, + PipBoundsState pipBoundsState, PipBoundsHandler pipBoundsHandler, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional splitScreenOptional, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer) { - return new PipTaskOrganizer(context, pipBoundsHandler, + return new PipTaskOrganizer(context, pipBoundsState, pipBoundsHandler, pipSurfaceTransactionHelper, splitScreenOptional, displayController, pipUiEventLogger, shellTaskOrganizer); }