Fix bubble position with IME when the bubble has a custom height

Usually bubbles are full height, but it is possible for a bubble
to have a smaller height. In this case the pointer didn't align
correctly when the IME came up.

This change makes it so that the expanded view will translate up
a bit with the bubble (only when the view isn't full height and has
space to translate), which keeps it aligned with the pointer.
This is a bit of a nicer experience because the IME doesn't overlap
as much of the app as it would before.

Test: manual - have a bubble that has a small height, focus the IME
             => verify the pointer follows the bubble
Bug: 223906486
Change-Id: I1542f06887ccc8370a762fc6ebe42aca26559cb4
This commit is contained in:
Mady Mellor
2022-04-08 21:09:06 +00:00
parent 89a9dcc8e9
commit d303a02627
2 changed files with 16 additions and 0 deletions

View File

@@ -112,6 +112,7 @@ public class BubbleExpandedView extends LinearLayout {
private ShapeDrawable mRightPointer;
private float mCornerRadius = 0f;
private int mBackgroundColorFloating;
private boolean mUsingMaxHeight;
@Nullable private Bubble mBubble;
private PendingIntent mPendingIntent;
@@ -621,6 +622,13 @@ public class BubbleExpandedView extends LinearLayout {
return prevWasIntentBased != newIsIntentBased;
}
/**
* Whether the bubble is using all available height to display or not.
*/
public boolean isUsingMaxHeight() {
return mUsingMaxHeight;
}
void updateHeight() {
if (mExpandedViewContainerLocation == null) {
return;
@@ -632,6 +640,7 @@ public class BubbleExpandedView extends LinearLayout {
float height = desiredHeight == MAX_HEIGHT
? maxHeight
: Math.min(desiredHeight, maxHeight);
mUsingMaxHeight = height == maxHeight;
FrameLayout.LayoutParams lp = mIsOverflow
? (FrameLayout.LayoutParams) mOverflowView.getLayoutParams()
: (FrameLayout.LayoutParams) mTaskView.getLayoutParams();

View File

@@ -2355,7 +2355,14 @@ public class BubbleStackView extends FrameLayout
}
} else if (mPositioner.showBubblesVertically() && mIsExpanded
&& mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) {
float selectedY = mPositioner.getExpandedBubbleXY(getState().selectedIndex,
getState()).y;
float newExpandedViewTop = mPositioner.getExpandedViewY(mExpandedBubble, selectedY);
mExpandedBubble.getExpandedView().setImeVisible(visible);
if (!mExpandedBubble.getExpandedView().isUsingMaxHeight()) {
mExpandedViewContainer.animate().translationY(newExpandedViewTop);
}
List<Animator> animList = new ArrayList();
for (int i = 0; i < mBubbleContainer.getChildCount(); i++) {
View child = mBubbleContainer.getChildAt(i);