Merge "Don't move PiP towards a corner after user manually moved it." into tm-qpr-dev am: 77f5aecbb2
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20592536 Change-Id: Ica5cd46bdd3d4f836ef454264f887064dcdb7a9f Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -97,6 +97,8 @@ public class PipBoundsState {
|
|||||||
private int mShelfHeight;
|
private int mShelfHeight;
|
||||||
/** Whether the user has resized the PIP manually. */
|
/** Whether the user has resized the PIP manually. */
|
||||||
private boolean mHasUserResizedPip;
|
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
|
* 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.
|
* 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) {
|
if (changed) {
|
||||||
clearReentryState();
|
clearReentryState();
|
||||||
setHasUserResizedPip(false);
|
setHasUserResizedPip(false);
|
||||||
|
setHasUserMovedPip(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,6 +445,16 @@ public class PipBoundsState {
|
|||||||
mHasUserResizedPip = hasUserResizedPip;
|
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.
|
* 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 + "mImeHeight=" + mImeHeight);
|
||||||
pw.println(innerPrefix + "mIsShelfShowing=" + mIsShelfShowing);
|
pw.println(innerPrefix + "mIsShelfShowing=" + mIsShelfShowing);
|
||||||
pw.println(innerPrefix + "mShelfHeight=" + mShelfHeight);
|
pw.println(innerPrefix + "mShelfHeight=" + mShelfHeight);
|
||||||
|
pw.println(innerPrefix + "mHasUserMovedPip=" + mHasUserMovedPip);
|
||||||
|
pw.println(innerPrefix + "mHasUserResizedPip=" + mHasUserResizedPip);
|
||||||
if (mPipReentryState == null) {
|
if (mPipReentryState == null) {
|
||||||
pw.println(innerPrefix + "mPipReentryState=null");
|
pw.println(innerPrefix + "mPipReentryState=null");
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.wm.shell.pip.phone;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
|
import android.os.SystemProperties;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
|
|
||||||
@@ -34,6 +35,10 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
public class PhonePipKeepClearAlgorithm implements PipKeepClearAlgorithm {
|
public class PhonePipKeepClearAlgorithm implements PipKeepClearAlgorithm {
|
||||||
|
|
||||||
|
private boolean mKeepClearAreaGravityEnabled =
|
||||||
|
SystemProperties.getBoolean(
|
||||||
|
"persist.wm.debug.enable_pip_keep_clear_algorithm_gravity", false);
|
||||||
|
|
||||||
protected int mKeepClearAreasPadding;
|
protected int mKeepClearAreasPadding;
|
||||||
|
|
||||||
public PhonePipKeepClearAlgorithm(Context context) {
|
public PhonePipKeepClearAlgorithm(Context context) {
|
||||||
@@ -53,31 +58,36 @@ public class PhonePipKeepClearAlgorithm implements PipKeepClearAlgorithm {
|
|||||||
Rect startingBounds = pipBoundsState.getBounds().isEmpty()
|
Rect startingBounds = pipBoundsState.getBounds().isEmpty()
|
||||||
? pipBoundsAlgorithm.getEntryDestinationBoundsIgnoringKeepClearAreas()
|
? pipBoundsAlgorithm.getEntryDestinationBoundsIgnoringKeepClearAreas()
|
||||||
: pipBoundsState.getBounds();
|
: 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();
|
Rect insets = new Rect();
|
||||||
pipBoundsAlgorithm.getInsetBounds(insets);
|
pipBoundsAlgorithm.getInsetBounds(insets);
|
||||||
if (pipBoundsState.isImeShowing()) {
|
if (pipBoundsState.isImeShowing()) {
|
||||||
insets.bottom -= pipBoundsState.getImeHeight();
|
insets.bottom -= pipBoundsState.getImeHeight();
|
||||||
}
|
}
|
||||||
Rect pushedBounds = new Rect(startingBounds);
|
Rect pipBounds = new Rect(startingBounds);
|
||||||
if (verticalGravity == Gravity.BOTTOM) {
|
|
||||||
pushedBounds.offsetTo(pushedBounds.left,
|
// move PiP towards corner if user hasn't moved it manually or the flag is on
|
||||||
insets.bottom - pushedBounds.height());
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (horizontalGravity == Gravity.RIGHT) {
|
|
||||||
pushedBounds.offsetTo(insets.right - pushedBounds.width(), pushedBounds.top);
|
return findUnoccludedPosition(pipBounds, pipBoundsState.getRestrictedKeepClearAreas(),
|
||||||
} else {
|
|
||||||
pushedBounds.offsetTo(insets.left, pushedBounds.top);
|
|
||||||
}
|
|
||||||
return findUnoccludedPosition(pushedBounds, pipBoundsState.getRestrictedKeepClearAreas(),
|
|
||||||
pipBoundsState.getUnrestrictedKeepClearAreas(), insets);
|
pipBoundsState.getUnrestrictedKeepClearAreas(), insets);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -875,6 +875,8 @@ public class PipTouchHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (touchState.isDragging()) {
|
if (touchState.isDragging()) {
|
||||||
|
mPipBoundsState.setHasUserMovedPip(true);
|
||||||
|
|
||||||
// Move the pinned stack freely
|
// Move the pinned stack freely
|
||||||
final PointF lastDelta = touchState.getLastTouchDelta();
|
final PointF lastDelta = touchState.getLastTouchDelta();
|
||||||
float lastX = mStartPosition.x + mDelta.x;
|
float lastX = mStartPosition.x + mDelta.x;
|
||||||
|
|||||||
Reference in New Issue
Block a user