Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9619ee3a authored by Johannes Gallmann's avatar Johannes Gallmann
Browse files

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
parent e076cf2d
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -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;