Merge "Check the min menu size when exp. to normal bounds" into sc-dev am: 47aa9f156e
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15144952 Change-Id: Ia71b09b4d17c648eb5c28d155f7b02ecc64b6f81
This commit is contained in:
@@ -19,6 +19,7 @@ package com.android.wm.shell.pip;
|
|||||||
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
|
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
import android.app.PictureInPictureParams;
|
import android.app.PictureInPictureParams;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
@@ -453,6 +454,56 @@ public class PipBoundsAlgorithm {
|
|||||||
return new Size(width, height);
|
return new Size(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the normal bounds adjusted so that they fit the menu actions.
|
||||||
|
*/
|
||||||
|
public Rect adjustNormalBoundsToFitMenu(@NonNull Rect normalBounds,
|
||||||
|
@Nullable Size minMenuSize) {
|
||||||
|
if (minMenuSize == null) {
|
||||||
|
return normalBounds;
|
||||||
|
}
|
||||||
|
if (normalBounds.width() >= minMenuSize.getWidth()
|
||||||
|
&& normalBounds.height() >= minMenuSize.getHeight()) {
|
||||||
|
// The normal bounds can fit the menu as is, no need to adjust the bounds.
|
||||||
|
return normalBounds;
|
||||||
|
}
|
||||||
|
final Rect adjustedNormalBounds = new Rect();
|
||||||
|
final boolean needsWidthAdj = minMenuSize.getWidth() > normalBounds.width();
|
||||||
|
final boolean needsHeightAdj = minMenuSize.getHeight() > normalBounds.height();
|
||||||
|
final int adjWidth;
|
||||||
|
final int adjHeight;
|
||||||
|
if (needsWidthAdj && needsHeightAdj) {
|
||||||
|
// Both the width and the height are too small - find the edge that needs the larger
|
||||||
|
// adjustment and scale that edge. The other edge will scale beyond the minMenuSize
|
||||||
|
// when the aspect ratio is applied.
|
||||||
|
final float widthScaleFactor =
|
||||||
|
((float) (minMenuSize.getWidth())) / ((float) (normalBounds.width()));
|
||||||
|
final float heightScaleFactor =
|
||||||
|
((float) (minMenuSize.getHeight())) / ((float) (normalBounds.height()));
|
||||||
|
if (widthScaleFactor > heightScaleFactor) {
|
||||||
|
adjWidth = minMenuSize.getWidth();
|
||||||
|
adjHeight = Math.round(adjWidth / mPipBoundsState.getAspectRatio());
|
||||||
|
} else {
|
||||||
|
adjHeight = minMenuSize.getHeight();
|
||||||
|
adjWidth = Math.round(adjHeight * mPipBoundsState.getAspectRatio());
|
||||||
|
}
|
||||||
|
} else if (needsWidthAdj) {
|
||||||
|
// Width is too small - use the min menu size width instead.
|
||||||
|
adjWidth = minMenuSize.getWidth();
|
||||||
|
adjHeight = Math.round(adjWidth / mPipBoundsState.getAspectRatio());
|
||||||
|
} else {
|
||||||
|
// Height is too small - use the min menu size height instead.
|
||||||
|
adjHeight = minMenuSize.getHeight();
|
||||||
|
adjWidth = Math.round(adjHeight * mPipBoundsState.getAspectRatio());
|
||||||
|
}
|
||||||
|
adjustedNormalBounds.set(0, 0, adjWidth, adjHeight);
|
||||||
|
// Make sure the bounds conform to the aspect ratio and min edge size.
|
||||||
|
transformBoundsToAspectRatio(adjustedNormalBounds,
|
||||||
|
mPipBoundsState.getAspectRatio(), true /* useCurrentMinEdgeSize */,
|
||||||
|
true /* useCurrentSize */);
|
||||||
|
return adjustedNormalBounds;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dumps internal states.
|
* Dumps internal states.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -726,12 +726,17 @@ public class PipTouchHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void animateToNormalSize(Runnable callback) {
|
private void animateToNormalSize(Runnable callback) {
|
||||||
|
// Save the current bounds as the user-resize bounds.
|
||||||
mPipResizeGestureHandler.setUserResizeBounds(mPipBoundsState.getBounds());
|
mPipResizeGestureHandler.setUserResizeBounds(mPipBoundsState.getBounds());
|
||||||
final Rect normalBounds = new Rect(mPipBoundsState.getNormalBounds());
|
|
||||||
|
final Size minMenuSize = mMenuController.getEstimatedMinMenuSize();
|
||||||
|
final Rect normalBounds = mPipBoundsState.getNormalBounds();
|
||||||
|
final Rect destBounds = mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds,
|
||||||
|
minMenuSize);
|
||||||
Rect restoredMovementBounds = new Rect();
|
Rect restoredMovementBounds = new Rect();
|
||||||
mPipBoundsAlgorithm.getMovementBounds(normalBounds,
|
mPipBoundsAlgorithm.getMovementBounds(destBounds,
|
||||||
mInsetBounds, restoredMovementBounds, mIsImeShowing ? mImeHeight : 0);
|
mInsetBounds, restoredMovementBounds, mIsImeShowing ? mImeHeight : 0);
|
||||||
mSavedSnapFraction = mMotionHelper.animateToExpandedState(normalBounds,
|
mSavedSnapFraction = mMotionHelper.animateToExpandedState(destBounds,
|
||||||
mPipBoundsState.getMovementBounds(), restoredMovementBounds, callback);
|
mPipBoundsState.getMovementBounds(), restoredMovementBounds, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -402,6 +402,64 @@ public class PipBoundsAlgorithmTest extends ShellTestCase {
|
|||||||
assertBoundsInclusionWithMargin("useDefaultBounds", defaultBounds, actualBounds);
|
assertBoundsInclusionWithMargin("useDefaultBounds", defaultBounds, actualBounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void adjustNormalBoundsToFitMenu_alreadyFits() {
|
||||||
|
final Rect normalBounds = new Rect(0, 0, 400, 711);
|
||||||
|
final Size minMenuSize = new Size(396, 292);
|
||||||
|
mPipBoundsState.setAspectRatio(
|
||||||
|
((float) normalBounds.width()) / ((float) normalBounds.height()));
|
||||||
|
|
||||||
|
final Rect bounds =
|
||||||
|
mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
|
||||||
|
|
||||||
|
assertEquals(normalBounds, bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void adjustNormalBoundsToFitMenu_widthTooSmall() {
|
||||||
|
final Rect normalBounds = new Rect(0, 0, 297, 528);
|
||||||
|
final Size minMenuSize = new Size(396, 292);
|
||||||
|
mPipBoundsState.setAspectRatio(
|
||||||
|
((float) normalBounds.width()) / ((float) normalBounds.height()));
|
||||||
|
|
||||||
|
final Rect bounds =
|
||||||
|
mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
|
||||||
|
|
||||||
|
assertEquals(minMenuSize.getWidth(), bounds.width());
|
||||||
|
assertEquals(minMenuSize.getWidth() / mPipBoundsState.getAspectRatio(),
|
||||||
|
bounds.height(), 0.3f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void adjustNormalBoundsToFitMenu_heightTooSmall() {
|
||||||
|
final Rect normalBounds = new Rect(0, 0, 400, 280);
|
||||||
|
final Size minMenuSize = new Size(396, 292);
|
||||||
|
mPipBoundsState.setAspectRatio(
|
||||||
|
((float) normalBounds.width()) / ((float) normalBounds.height()));
|
||||||
|
|
||||||
|
final Rect bounds =
|
||||||
|
mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
|
||||||
|
|
||||||
|
assertEquals(minMenuSize.getHeight(), bounds.height());
|
||||||
|
assertEquals(minMenuSize.getHeight() * mPipBoundsState.getAspectRatio(),
|
||||||
|
bounds.width(), 0.3f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void adjustNormalBoundsToFitMenu_widthAndHeightTooSmall() {
|
||||||
|
final Rect normalBounds = new Rect(0, 0, 350, 280);
|
||||||
|
final Size minMenuSize = new Size(396, 292);
|
||||||
|
mPipBoundsState.setAspectRatio(
|
||||||
|
((float) normalBounds.width()) / ((float) normalBounds.height()));
|
||||||
|
|
||||||
|
final Rect bounds =
|
||||||
|
mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
|
||||||
|
|
||||||
|
assertEquals(minMenuSize.getWidth(), bounds.width());
|
||||||
|
assertEquals(minMenuSize.getWidth() / mPipBoundsState.getAspectRatio(),
|
||||||
|
bounds.height(), 0.3f);
|
||||||
|
}
|
||||||
|
|
||||||
private void overrideDefaultAspectRatio(float aspectRatio) {
|
private void overrideDefaultAspectRatio(float aspectRatio) {
|
||||||
final TestableResources res = mContext.getOrCreateTestableResources();
|
final TestableResources res = mContext.getOrCreateTestableResources();
|
||||||
res.addOverride(
|
res.addOverride(
|
||||||
|
|||||||
Reference in New Issue
Block a user