Merge "Fix an issue where the start position of the stack is wrong in RTL" into tm-dev

This commit is contained in:
Mady Mellor
2022-05-24 00:29:34 +00:00
committed by Android (Google) Code Review
3 changed files with 58 additions and 34 deletions

View File

@@ -88,6 +88,9 @@ public class BubblePositioner {
private int mMaxBubbles;
private int mBubbleSize;
private int mSpacingBetweenBubbles;
private int mBubblePaddingTop;
private int mBubbleOffscreenAmount;
private int mStackOffset;
private int mExpandedViewMinHeight;
private int mExpandedViewLargeScreenWidth;
@@ -187,6 +190,10 @@ public class BubblePositioner {
mSpacingBetweenBubbles = res.getDimensionPixelSize(R.dimen.bubble_spacing);
mDefaultMaxBubbles = res.getInteger(R.integer.bubbles_max_rendered);
mExpandedViewPadding = res.getDimensionPixelSize(R.dimen.bubble_expanded_view_padding);
mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
mBubbleOffscreenAmount = res.getDimensionPixelSize(R.dimen.bubble_stack_offscreen);
mStackOffset = res.getDimensionPixelSize(R.dimen.bubble_stack_offset);
if (mIsSmallTablet) {
mExpandedViewLargeScreenWidth = (int) (bounds.width()
* EXPANDED_VIEW_SMALL_TABLET_WIDTH_PERCENT);
@@ -329,6 +336,21 @@ public class BubblePositioner {
: mBubbleSize;
}
/** The amount of padding at the top of the screen that the bubbles avoid when being placed. */
public int getBubblePaddingTop() {
return mBubblePaddingTop;
}
/** The amount the stack hang off of the screen when collapsed. */
public int getStackOffScreenAmount() {
return mBubbleOffscreenAmount;
}
/** Offset of bubbles in the stack (i.e. how much they overlap). */
public int getStackOffset() {
return mStackOffset;
}
/** Size of the visible (non-overlapping) part of the pointer. */
public int getPointerSize() {
return mPointerHeight - mPointerOverlap;
@@ -678,7 +700,28 @@ public class BubblePositioner {
return new BubbleStackView.RelativeStackPosition(
startOnLeft,
startingVerticalOffset / mPositionRect.height())
.getAbsolutePositionInRegion(new RectF(mPositionRect));
.getAbsolutePositionInRegion(getAllowableStackPositionRegion(
1 /* default starts with 1 bubble */));
}
/**
* Returns the region that the stack position must stay within. This goes slightly off the left
* and right sides of the screen, below the status bar/cutout and above the navigation bar.
* While the stack position is not allowed to rest outside of these bounds, it can temporarily
* be animated or dragged beyond them.
*/
public RectF getAllowableStackPositionRegion(int bubbleCount) {
final RectF allowableRegion = new RectF(getAvailableRect());
final int imeHeight = getImeHeight();
final float bottomPadding = bubbleCount > 1
? mBubblePaddingTop + mStackOffset
: mBubblePaddingTop;
allowableRegion.left -= mBubbleOffscreenAmount;
allowableRegion.top += mBubblePaddingTop;
allowableRegion.right += mBubbleOffscreenAmount - mBubbleSize;
allowableRegion.bottom -= imeHeight + bottomPadding + mBubbleSize;
return allowableRegion;
}
/**

View File

@@ -1296,7 +1296,7 @@ public class BubbleStackView extends FrameLayout
public void onOrientationChanged() {
mRelativeStackPositionBeforeRotation = new RelativeStackPosition(
mPositioner.getRestingPosition(),
mStackAnimationController.getAllowableStackPositionRegion());
mPositioner.getAllowableStackPositionRegion(getBubbleCount()));
addOnLayoutChangeListener(mOrientationChangedListener);
hideFlyoutImmediate();
}
@@ -1340,7 +1340,7 @@ public class BubbleStackView extends FrameLayout
mStackAnimationController.setStackPosition(
new RelativeStackPosition(
mPositioner.getRestingPosition(),
mStackAnimationController.getAllowableStackPositionRegion()));
mPositioner.getAllowableStackPositionRegion(getBubbleCount())));
}
if (mIsExpanded) {
updateExpandedView();
@@ -1440,7 +1440,7 @@ public class BubbleStackView extends FrameLayout
if (super.performAccessibilityActionInternal(action, arguments)) {
return true;
}
final RectF stackBounds = mStackAnimationController.getAllowableStackPositionRegion();
final RectF stackBounds = mPositioner.getAllowableStackPositionRegion(getBubbleCount());
// R constants are not final so we cannot use switch-case here.
if (action == AccessibilityNodeInfo.ACTION_DISMISS) {

View File

@@ -185,8 +185,6 @@ public class StackAnimationController extends
* stack goes offscreen intentionally.
*/
private int mBubblePaddingTop;
/** How far offscreen the stack rests. */
private int mBubbleOffscreen;
/** Contains display size, orientation, and inset information. */
private BubblePositioner mPositioner;
@@ -212,7 +210,8 @@ public class StackAnimationController extends
public Rect getAllowedFloatingBoundsRegion() {
final Rect floatingBounds = getFloatingBoundsOnScreen();
final Rect allowableStackArea = new Rect();
getAllowableStackPositionRegion().roundOut(allowableStackArea);
mPositioner.getAllowableStackPositionRegion(getBubbleCount())
.roundOut(allowableStackArea);
allowableStackArea.right += floatingBounds.width();
allowableStackArea.bottom += floatingBounds.height();
return allowableStackArea;
@@ -349,7 +348,7 @@ public class StackAnimationController extends
? velX < ESCAPE_VELOCITY
: velX < -ESCAPE_VELOCITY;
final RectF stackBounds = getAllowableStackPositionRegion();
final RectF stackBounds = mPositioner.getAllowableStackPositionRegion(getBubbleCount());
// Target X translation (either the left or right side of the screen).
final float destinationRelativeX = stackShouldFlingLeft
@@ -425,7 +424,7 @@ public class StackAnimationController extends
}
final PointF stackPos = getStackPosition();
final boolean onLeft = mLayout.isFirstChildXLeftOfCenter(stackPos.x);
final RectF bounds = getAllowableStackPositionRegion();
final RectF bounds = mPositioner.getAllowableStackPositionRegion(getBubbleCount());
stackPos.x = onLeft ? bounds.left : bounds.right;
return stackPos;
@@ -464,7 +463,7 @@ public class StackAnimationController extends
StackPositionProperty firstBubbleProperty = new StackPositionProperty(property);
final float currentValue = firstBubbleProperty.getValue(this);
final RectF bounds = getAllowableStackPositionRegion();
final RectF bounds = mPositioner.getAllowableStackPositionRegion(getBubbleCount());
final float min =
property.equals(DynamicAnimation.TRANSLATION_X)
? bounds.left
@@ -525,7 +524,8 @@ public class StackAnimationController extends
* of the stack if it's not moving).
*/
public float animateForImeVisibility(boolean imeVisible) {
final float maxBubbleY = getAllowableStackPositionRegion().bottom;
final float maxBubbleY = mPositioner.getAllowableStackPositionRegion(
getBubbleCount()).bottom;
float destinationY = UNSET;
if (imeVisible) {
@@ -567,25 +567,6 @@ public class StackAnimationController extends
mFloatingContentCoordinator.onContentMoved(mStackFloatingContent);
}
/**
* Returns the region that the stack position must stay within. This goes slightly off the left
* and right sides of the screen, below the status bar/cutout and above the navigation bar.
* While the stack position is not allowed to rest outside of these bounds, it can temporarily
* be animated or dragged beyond them.
*/
public RectF getAllowableStackPositionRegion() {
final RectF allowableRegion = new RectF(mPositioner.getAvailableRect());
final int imeHeight = mPositioner.getImeHeight();
final float bottomPadding = getBubbleCount() > 1
? mBubblePaddingTop + mStackOffset
: mBubblePaddingTop;
allowableRegion.left -= mBubbleOffscreen;
allowableRegion.top += mBubblePaddingTop;
allowableRegion.right += mBubbleOffscreen - mBubbleSize;
allowableRegion.bottom -= imeHeight + bottomPadding + mBubbleSize;
return allowableRegion;
}
/** Moves the stack in response to a touch event. */
public void moveStackFromTouch(float x, float y) {
// Begin the spring-to-touch catch up animation if needed.
@@ -861,13 +842,12 @@ public class StackAnimationController extends
@Override
void onActiveControllerForLayout(PhysicsAnimationLayout layout) {
Resources res = layout.getResources();
mStackOffset = res.getDimensionPixelSize(R.dimen.bubble_stack_offset);
mStackOffset = mPositioner.getStackOffset();
mSwapAnimationOffset = res.getDimensionPixelSize(R.dimen.bubble_swap_animation_offset);
mMaxBubbles = res.getInteger(R.integer.bubbles_max_rendered);
mElevation = res.getDimensionPixelSize(R.dimen.bubble_elevation);
mBubbleSize = mPositioner.getBubbleSize();
mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
mBubbleOffscreen = res.getDimensionPixelSize(R.dimen.bubble_stack_offscreen);
mBubblePaddingTop = mPositioner.getBubblePaddingTop();
}
/**
@@ -958,7 +938,8 @@ public class StackAnimationController extends
}
public void setStackPosition(BubbleStackView.RelativeStackPosition position) {
setStackPosition(position.getAbsolutePositionInRegion(getAllowableStackPositionRegion()));
setStackPosition(position.getAbsolutePositionInRegion(
mPositioner.getAllowableStackPositionRegion(getBubbleCount())));
}
private boolean isStackPositionSet() {