Merge "Don't move PiP towards a corner after user manually moved it." into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
77f5aecbb2
@@ -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 {
|
||||
|
||||
@@ -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());
|
||||
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);
|
||||
}
|
||||
}
|
||||
if (horizontalGravity == Gravity.RIGHT) {
|
||||
pushedBounds.offsetTo(insets.right - pushedBounds.width(), pushedBounds.top);
|
||||
} else {
|
||||
pushedBounds.offsetTo(insets.left, pushedBounds.top);
|
||||
}
|
||||
return findUnoccludedPosition(pushedBounds, pipBoundsState.getRestrictedKeepClearAreas(),
|
||||
|
||||
return findUnoccludedPosition(pipBounds, pipBoundsState.getRestrictedKeepClearAreas(),
|
||||
pipBoundsState.getUnrestrictedKeepClearAreas(), insets);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user