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

Commit 6ba54164 authored by mpodolian's avatar mpodolian
Browse files

Improvement for the Bubble Bar Bubbles' Shadows

The issue was caused by the alpha animation applied to the bubble bar.
Added code to check if the alpha applied to the bubble bar is less than
1 and instruct child bubble views not to provide a shadow outline in
such cases. While this is not a full fix, but rather an improvement,
b/345490679 should introduce a proper fix.

Bug: 345484712
Test: visual - go to any application and stash/unstash bubble bar
Flag: com.android.wm.shell.enable_bubble_bar
Change-Id: Icb6bdb009f4d5998ec1638f97de89f7a4c9feccf
parent 5ace16c7
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -307,6 +307,17 @@ public class BubbleBarView extends FrameLayout {
        }
    }

    @Override
    public void setAlpha(float alpha) {
        super.setAlpha(alpha);
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            View childView = getChildAt(i);
            if (!(childView instanceof BubbleView)) continue;
            ((BubbleView) childView).setProvideShadowOutline(alpha == 1f);
        }
    }

    /**
     * Sets new icon sizes and newBubbleBarPadding between icons and bubble bar borders.
     *
+14 −1
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ public class BubbleView extends ConstraintLayout {
    // The current scale value of the dot
    private float mDotScale;

    private boolean mProvideShadowOutline = true;

    // TODO: (b/273310265) handle RTL
    // Whether the bubbles are positioned on the left or right side of the screen
    private boolean mOnLeft = false;
@@ -113,17 +115,28 @@ public class BubbleView extends ConstraintLayout {
        });
    }

    //TODO(b/345490679) remove once proper shadow is applied
    /** Set whether provide an outline. */
    public void setProvideShadowOutline(boolean provideOutline) {
        if (mProvideShadowOutline == provideOutline) return;
        mProvideShadowOutline = provideOutline;
        invalidateOutline();
    }

    private void getOutline(Outline outline) {
        updateBubbleSizeAndDotRender();
        final int normalizedSize = IconNormalizer.getNormalizedCircleSize(mBubbleSize);
        final int inset = (mBubbleSize - normalizedSize) / 2;
        if (mProvideShadowOutline) {
            outline.setOval(inset, inset, inset + normalizedSize, inset + normalizedSize);
        }
    }

    private void updateBubbleSizeAndDotRender() {
        int updatedBubbleSize = Math.min(getWidth(), getHeight());
        if (updatedBubbleSize == mBubbleSize) return;
        mBubbleSize = updatedBubbleSize;
        invalidateOutline();
        if (mBubble == null || mBubble instanceof BubbleBarOverflow) return;
        Path dotPath = ((BubbleBarBubble) mBubble).getDotPath();
        mDotRenderer = new DotRenderer(mBubbleSize, dotPath, DEFAULT_PATH_SIZE);