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

Commit 821e678d authored by Mark Renouf's avatar Mark Renouf
Browse files

Set system gesture exclusion rects for Bubbles

When there is at least one Bubble on-screen, the bounds
of the first (top) bubble are set to exclude system
navigation gestures.

Test: manually w/fully gesture nav enabled
Bug: 126360272
Change-Id: I47a3c69fdc89476805d48b5214a7f05f5d033306
parent f8aeee04
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -64,6 +64,8 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collections;
import java.util.List;

/**
 * Renders bubbles in a stack and handles animating expanded and collapsed states.
@@ -164,6 +166,8 @@ public class BubbleStackView extends FrameLayout {
    int[] mTempLoc = new int[2];
    RectF mTempRect = new RectF();

    private final List<Rect> mSystemGestureExclusionRects = Collections.singletonList(new Rect());

    private ViewTreeObserver.OnPreDrawListener mViewUpdater =
            new ViewTreeObserver.OnPreDrawListener() {
                @Override
@@ -175,6 +179,9 @@ public class BubbleStackView extends FrameLayout {
                }
            };

    private ViewTreeObserver.OnDrawListener mSystemGestureExcludeUpdater =
            this::updateSystemGestureExcludeRects;

    private ViewClippingUtil.ClippingParameters mClippingParameters =
            new ViewClippingUtil.ClippingParameters() {

@@ -296,6 +303,9 @@ public class BubbleStackView extends FrameLayout {
                    () -> mExpandedBubble.expandedView.updateInsets(insets));
            return view.onApplyWindowInsets(insets);
        });

        // This must be a separate OnDrawListener since it should be called for every draw.
        getViewTreeObserver().addOnDrawListener(mSystemGestureExcludeUpdater);
    }

    /**
@@ -362,6 +372,22 @@ public class BubbleStackView extends FrameLayout {
        return false;
    }

    private void updateSystemGestureExcludeRects() {
        // Exclude the region occupied by the first BubbleView in the stack
        Rect excludeZone = mSystemGestureExclusionRects.get(0);
        if (mBubbleContainer.getChildCount() > 0) {
            View firstBubble = mBubbleContainer.getChildAt(0);
            excludeZone.set(firstBubble.getLeft(), firstBubble.getTop(), firstBubble.getRight(),
                    firstBubble.getBottom());
            excludeZone.offset((int) (firstBubble.getTranslationX() + 0.5f),
                    (int) (firstBubble.getTranslationY() + 0.5f));
            mBubbleContainer.setSystemGestureExclusionRects(mSystemGestureExclusionRects);
        } else {
            excludeZone.setEmpty();
            mBubbleContainer.setSystemGestureExclusionRects(Collections.emptyList());
        }
    }

    /**
     * Updates the visibility of the 'dot' indicating an update on the bubble.
     * @param key the {@link NotificationEntry#key} associated with the bubble.