diff options
3 files changed, 46 insertions, 19 deletions
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 index 17d7f5d0d567..5376ae372de2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java @@ -97,6 +97,8 @@ public class PipBoundsState { private int mShelfHeight; /** Whether the user has resized the PIP manually. */ private boolean mHasUserResizedPip; + /** Whether the user has moved the PIP manually. */ + private boolean mHasUserMovedPip; /** * Areas defined by currently visible apps that they prefer to keep clear from overlays such as * the PiP. Restricted areas may only move the PiP a limited amount from its anchor position. @@ -279,6 +281,7 @@ public class PipBoundsState { if (changed) { clearReentryState(); setHasUserResizedPip(false); + setHasUserMovedPip(false); } } @@ -442,6 +445,16 @@ public class PipBoundsState { mHasUserResizedPip = hasUserResizedPip; } + /** Returns whether the user has moved the PIP. */ + public boolean hasUserMovedPip() { + return mHasUserMovedPip; + } + + /** Set whether the user has moved the PIP. */ + public void setHasUserMovedPip(boolean hasUserMovedPip) { + mHasUserMovedPip = hasUserMovedPip; + } + /** * Registers a callback when the minimal size of PIP that is set by the app changes. */ @@ -577,6 +590,8 @@ public class PipBoundsState { pw.println(innerPrefix + "mImeHeight=" + mImeHeight); pw.println(innerPrefix + "mIsShelfShowing=" + mIsShelfShowing); pw.println(innerPrefix + "mShelfHeight=" + mShelfHeight); + pw.println(innerPrefix + "mHasUserMovedPip=" + mHasUserMovedPip); + pw.println(innerPrefix + "mHasUserResizedPip=" + mHasUserResizedPip); if (mPipReentryState == null) { pw.println(innerPrefix + "mPipReentryState=null"); } else { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithm.java index 84071e08d472..690505e03fce 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithm.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithm.java @@ -19,6 +19,7 @@ package com.android.wm.shell.pip.phone; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; +import android.os.SystemProperties; import android.util.ArraySet; import android.view.Gravity; @@ -34,6 +35,10 @@ import java.util.Set; */ public class PhonePipKeepClearAlgorithm implements PipKeepClearAlgorithm { + private boolean mKeepClearAreaGravityEnabled = + SystemProperties.getBoolean( + "persist.wm.debug.enable_pip_keep_clear_algorithm_gravity", false); + protected int mKeepClearAreasPadding; public PhonePipKeepClearAlgorithm(Context context) { @@ -53,31 +58,36 @@ public class PhonePipKeepClearAlgorithm implements PipKeepClearAlgorithm { Rect startingBounds = pipBoundsState.getBounds().isEmpty() ? pipBoundsAlgorithm.getEntryDestinationBoundsIgnoringKeepClearAreas() : pipBoundsState.getBounds(); - float snapFraction = pipBoundsAlgorithm.getSnapFraction(startingBounds); - int verticalGravity = Gravity.BOTTOM; - int horizontalGravity; - if (snapFraction >= 0.5f && snapFraction < 2.5f) { - horizontalGravity = Gravity.RIGHT; - } else { - horizontalGravity = Gravity.LEFT; - } - // push the bounds based on the gravity Rect insets = new Rect(); pipBoundsAlgorithm.getInsetBounds(insets); if (pipBoundsState.isImeShowing()) { insets.bottom -= pipBoundsState.getImeHeight(); } - Rect pushedBounds = new Rect(startingBounds); - if (verticalGravity == Gravity.BOTTOM) { - pushedBounds.offsetTo(pushedBounds.left, - insets.bottom - pushedBounds.height()); - } - if (horizontalGravity == Gravity.RIGHT) { - pushedBounds.offsetTo(insets.right - pushedBounds.width(), pushedBounds.top); - } else { - pushedBounds.offsetTo(insets.left, pushedBounds.top); + Rect pipBounds = new Rect(startingBounds); + + // move PiP towards corner if user hasn't moved it manually or the flag is on + if (mKeepClearAreaGravityEnabled + || (!pipBoundsState.hasUserMovedPip() && !pipBoundsState.hasUserResizedPip())) { + float snapFraction = pipBoundsAlgorithm.getSnapFraction(startingBounds); + int verticalGravity = Gravity.BOTTOM; + int horizontalGravity; + if (snapFraction >= 0.5f && snapFraction < 2.5f) { + horizontalGravity = Gravity.RIGHT; + } else { + horizontalGravity = Gravity.LEFT; + } + if (verticalGravity == Gravity.BOTTOM) { + pipBounds.offsetTo(pipBounds.left, + insets.bottom - pipBounds.height()); + } + if (horizontalGravity == Gravity.RIGHT) { + pipBounds.offsetTo(insets.right - pipBounds.width(), pipBounds.top); + } else { + pipBounds.offsetTo(insets.left, pipBounds.top); + } } - return findUnoccludedPosition(pushedBounds, pipBoundsState.getRestrictedKeepClearAreas(), + + return findUnoccludedPosition(pipBounds, pipBoundsState.getRestrictedKeepClearAreas(), pipBoundsState.getUnrestrictedKeepClearAreas(), insets); } 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 a9a97beb9180..83bc7c0e6e7d 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 @@ -875,6 +875,8 @@ public class PipTouchHandler { } if (touchState.isDragging()) { + mPipBoundsState.setHasUserMovedPip(true); + // Move the pinned stack freely final PointF lastDelta = touchState.getLastTouchDelta(); float lastX = mStartPosition.x + mDelta.x; |