Fix inline reply notification not aligned to IME
When inline replying within a notification, the notification's bottom should align to the opened IME. This was broken due to multiple problems: 1. When calculating the position of the notification within the stack, there was only a default padding between notifications considered. However, there are cases when a larger gap is added between notifications. (See `StackScrollAlgorithm.childNeedsGapHeight()`) 2. The scrimTopPadding is also not considered in the same calculation. 3. In the split shade mode, it needs to be taken into account that the top of the NotificationStackScrollLayout is not at 0. Therefore this offset needs to be subtracted in the `getImeInset()` function. 4. `mBottomInset` was set to `inset.getInset(WindowInset.Type.ime()).bottom + inset.getSystemWindowInsetBottom()`. The `+ inset.getSystemWindowInsetBottom()` part compensated for the aforementioned three miscalculations in some lucky cases. After fixing the three miscalculations, this is not needed anymore. Bug: 233683829 Test: Manual, i.e. posting multiple notifications (in separate groups) with an inline reply option and ensuring that the bottom of the notification is aligned to the top of the IME. I tested this on split shade and normal shade. Change-Id: Iceaf0ac540ed367cb49eb3aca7bdec7b7cabb1cb
This commit is contained in:
@@ -1811,9 +1811,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
|
||||
@Override
|
||||
@ShadeViewRefactor(RefactorComponent.COORDINATOR)
|
||||
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
|
||||
mBottomInset = insets.getSystemWindowInsetBottom()
|
||||
+ insets.getInsets(WindowInsets.Type.ime()).bottom;
|
||||
|
||||
mBottomInset = insets.getInsets(WindowInsets.Type.ime()).bottom;
|
||||
mWaterfallTopInset = 0;
|
||||
final DisplayCutout cutout = insets.getDisplayCutout();
|
||||
if (cutout != null) {
|
||||
@@ -2262,7 +2260,11 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
|
||||
|
||||
@ShadeViewRefactor(RefactorComponent.COORDINATOR)
|
||||
private int getImeInset() {
|
||||
return Math.max(0, mBottomInset - (getRootView().getHeight() - getHeight()));
|
||||
// The NotificationStackScrollLayout does not extend all the way to the bottom of the
|
||||
// display. Therefore, subtract that space from the mBottomInset, in order to only include
|
||||
// the portion of the bottom inset that actually overlaps the NotificationStackScrollLayout.
|
||||
return Math.max(0, mBottomInset
|
||||
- (getRootView().getHeight() - getHeight() - getLocationOnScreen()[1]));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2970,12 +2972,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
|
||||
childInGroup = (ExpandableNotificationRow) requestedView;
|
||||
requestedView = requestedRow = childInGroup.getNotificationParent();
|
||||
}
|
||||
int position = 0;
|
||||
final float scrimTopPadding = mAmbientState.isOnKeyguard() ? 0 : mMinimumPaddings;
|
||||
int position = (int) scrimTopPadding;
|
||||
int visibleIndex = -1;
|
||||
ExpandableView lastVisibleChild = null;
|
||||
for (int i = 0; i < getChildCount(); i++) {
|
||||
ExpandableView child = getChildAtIndex(i);
|
||||
boolean notGone = child.getVisibility() != View.GONE;
|
||||
if (notGone) visibleIndex++;
|
||||
if (notGone && !child.hasNoContentHeight()) {
|
||||
if (position != 0) {
|
||||
if (position != scrimTopPadding) {
|
||||
if (lastVisibleChild != null) {
|
||||
position += calculateGapHeight(lastVisibleChild, child, visibleIndex);
|
||||
}
|
||||
position += mPaddingBetweenElements;
|
||||
}
|
||||
}
|
||||
@@ -2987,6 +2996,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
|
||||
}
|
||||
if (notGone) {
|
||||
position += getIntrinsicHeight(child);
|
||||
lastVisibleChild = child;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user