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

Commit cb97a11b authored by Joshua Tsuji's avatar Joshua Tsuji
Browse files

Remove the max rendered children code.

This code is redundant given the BubbleData's handling of the bubble limit, and is responsible for the invisible bubble bugs.

Test: atest SystemUITests
Fixes: 132690748
Change-Id: I7f05f2ee12183f812abb55bf133c11dafce10909
parent c36ee6f4
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -330,8 +330,6 @@ public class BubbleStackView extends FrameLayout {
        mSurfaceSynchronizer = synchronizer != null ? synchronizer : DEFAULT_SURFACE_SYNCHRONIZER;

        mBubbleContainer = new PhysicsAnimationLayout(context);
        mBubbleContainer.setMaxRenderedChildren(
                getResources().getInteger(R.integer.bubbles_max_rendered));
        mBubbleContainer.setActiveController(mStackAnimationController);
        mBubbleContainer.setElevation(elevation);
        mBubbleContainer.setClipChildren(false);
+1 −20
Original line number Diff line number Diff line
@@ -63,8 +63,6 @@ public class ExpandedAnimationController
    private Point mDisplaySize;
    /** Size of dismiss target at bottom of screen. */
    private float mPipDismissHeight;
    /** Max number of bubbles shown in row above expanded view.*/
    private int mBubblesMaxRendered;

    /** Whether the dragged-out bubble is in the dismiss target. */
    private boolean mIndividualBubbleWithinDismissTarget = false;
@@ -291,7 +289,6 @@ public class ExpandedAnimationController
        mStatusBarHeight =
                res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
        mPipDismissHeight = res.getDimensionPixelSize(R.dimen.pip_dismiss_gradient_height);
        mBubblesMaxRendered = res.getInteger(R.integer.bubbles_max_rendered);

        // Ensure that all child views are at 1x scale, and visible, in case they were animating
        // in.
@@ -360,19 +357,6 @@ public class ExpandedAnimationController
        updateBubblePositions();
    }

    @Override
    protected void setChildVisibility(View child, int index, int visibility) {
        if (visibility == View.VISIBLE) {
            // Set alpha to 0 but then become visible immediately so the animation is visible.
            child.setAlpha(0f);
            child.setVisibility(View.VISIBLE);
        }

        animationForChild(child)
                .alpha(visibility == View.GONE ? 0f : 1f)
                .start(() -> super.setChildVisibility(child, index, visibility) /* after */);
    }

    private void updateBubblePositions() {
        for (int i = 0; i < mLayout.getChildCount(); i++) {
            final View bubble = mLayout.getChildAt(i);
@@ -407,10 +391,7 @@ public class ExpandedAnimationController
            return 0;
        }
        int bubbleCount = mLayout.getChildCount();
        if (bubbleCount > mBubblesMaxRendered) {
            // Only shown bubbles are relevant for calculating position.
            bubbleCount = mBubblesMaxRendered;
        }

        // Width calculations.
        double bubble = bubbleCount * mBubbleSizePx;
        float gap = (bubbleCount - 1) * mBubblePaddingPx;
+4 −65
Original line number Diff line number Diff line
@@ -169,15 +169,6 @@ public class PhysicsAnimationLayout extends FrameLayout {
            return mLayout;
        }

        /**
         * Sets the child's visibility when it moves beyond or within the limits set by a call to
         * {@link PhysicsAnimationLayout#setMaxRenderedChildren}. This can be overridden to animate
         * this transition.
         */
        protected void setChildVisibility(View child, int index, int visibility) {
            child.setVisibility(visibility);
        }

        /**
         * Returns a {@link PhysicsPropertyAnimator} instance for the given child view.
         */
@@ -260,25 +251,10 @@ public class PhysicsAnimationLayout extends FrameLayout {
    /** The currently active animation controller. */
    @Nullable protected PhysicsAnimationController mController;

    /**
     * The maximum number of children to render and animate at a time. See
     * {@link #setMaxRenderedChildren}.
     */
    private int mMaxRenderedChildren = 5;

    public PhysicsAnimationLayout(Context context) {
        super(context);
    }

    /**
     * The maximum number of children to render and animate at a time. Any child views added beyond
     * this limit will be set to {@link View#GONE}. If any animations attempt to run on the view,
     * the corresponding property will be set with no animation.
     */
    public void setMaxRenderedChildren(int max) {
        this.mMaxRenderedChildren = max;
    }

    /**
     * Sets the animation controller and constructs or reconfigures the layout's physics animations
     * to meet the controller's specifications.
@@ -346,8 +322,6 @@ public class PhysicsAnimationLayout extends FrameLayout {

            mController.onChildAdded(child, index);
        }

        setChildrenVisibility();
    }

    @Override
@@ -378,8 +352,6 @@ public class PhysicsAnimationLayout extends FrameLayout {
            super.removeView(view);
            addTransientView(view, index);

            setChildrenVisibility();

            // Tell the controller to animate this view out, and call the callback when it's
            // finished.
            mController.onChildRemoved(view, index, () -> {
@@ -508,33 +480,16 @@ public class PhysicsAnimationLayout extends FrameLayout {
        SpringAnimation newAnim = new SpringAnimation(child, property);
        newAnim.addUpdateListener((animation, value, velocity) -> {
            final int indexOfChild = indexOfChild(child);
            final int nextAnimInChain =
                    mController.getNextAnimationInChain(property, indexOfChild);
            final int nextAnimInChain = mController.getNextAnimationInChain(property, indexOfChild);

            if (nextAnimInChain == PhysicsAnimationController.NONE || indexOfChild < 0) {
                return;
            }

            final int animIndex = indexOfChild(child);
            final float offset =
                    mController.getOffsetForChainedPropertyAnimation(property);

            // If this property's animations should be chained, then check to see if there is a
            // subsequent animation within the rendering limit, and if so, tell it to animate to
            // this animation's new value (plus the offset).
            if (nextAnimInChain < Math.min(getChildCount(), mMaxRenderedChildren)) {
                getAnimationAtIndex(property, animIndex + 1)
            final float offset = mController.getOffsetForChainedPropertyAnimation(property);
            if (nextAnimInChain < getChildCount()) {
                getAnimationAtIndex(property, nextAnimInChain)
                        .animateToFinalPosition(value + offset);
            } else if (nextAnimInChain < getChildCount()) {
                // If the next child view is not rendered, update the property directly without
                // animating it, so that the view is still in the correct state if it later
                // becomes visible.
                for (int i = nextAnimInChain; i < getChildCount(); i++) {
                    // 'value' here is the value of the last child within the rendering limit,
                    // not the first child's value - so we want to subtract the last child's
                    // index when calculating the offset.
                    property.setValue(getChildAt(i), value + offset * (i - animIndex));
                }
            }
        });

@@ -543,22 +498,6 @@ public class PhysicsAnimationLayout extends FrameLayout {
        child.setTag(getTagIdForProperty(property), newAnim);
    }

    /** Hides children beyond the max rendering count. */
    private void setChildrenVisibility() {
        for (int i = 0; i < getChildCount(); i++) {
            final int targetVisibility = i < mMaxRenderedChildren ? View.VISIBLE : View.GONE;
            final View targetView = getChildAt(i);

            if (targetView.getVisibility() != targetVisibility) {
                if (mController != null) {
                    mController.setChildVisibility(targetView, i, targetVisibility);
                } else {
                    targetView.setVisibility(targetVisibility);
                }
            }
        }
    }

    /** Return a stable ID to use as a tag key for the given property's animations. */
    private int getTagIdForProperty(DynamicAnimation.ViewProperty property) {
        if (property.equals(DynamicAnimation.TRANSLATION_X)) {
+4 −13
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ public class ExpandedAnimationControllerTest extends PhysicsAnimationLayoutTestC
    @Before
    public void setUp() throws Exception {
        super.setUp();
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();
        mLayout.setActiveController(mExpandedController);

        Resources res = mLayout.getResources();
@@ -236,26 +236,19 @@ public class ExpandedAnimationControllerTest extends PhysicsAnimationLayoutTestC
            assertEquals(x + i * offsetMultiplier * mStackOffset,
                    mLayout.getChildAt(i).getTranslationX(), 2f);
            assertEquals(y, mLayout.getChildAt(i).getTranslationY(), 2f);

            if (i < mMaxRenderedBubbles) {
            assertEquals(1f, mLayout.getChildAt(i).getAlpha(), .01f);
        }
    }
    }

    /** Check that children are in the correct positions for being expanded. */
    private void testBubblesInCorrectExpandedPositions() {
        // Check all the visible bubbles to see if they're in the right place.
        for (int i = 0; i < Math.min(mLayout.getChildCount(), mMaxRenderedBubbles); i++) {
        for (int i = 0; i < mLayout.getChildCount(); i++) {
            assertEquals(getBubbleLeft(i),
                    mLayout.getChildAt(i).getTranslationX(),
                    2f);
            assertEquals(mExpandedController.getExpandedY(),
                    mLayout.getChildAt(i).getTranslationY(), 2f);

            if (i < mMaxRenderedBubbles) {
                assertEquals(1f, mLayout.getChildAt(i).getAlpha(), .01f);
            }
        }
    }

@@ -273,9 +266,7 @@ public class ExpandedAnimationControllerTest extends PhysicsAnimationLayoutTestC
            return 0;
        }
        int bubbleCount = mLayout.getChildCount();
        if (bubbleCount > mMaxRenderedBubbles) {
            bubbleCount = mMaxRenderedBubbles;
        }

        // Width calculations.
        double bubble = bubbleCount * mBubbleSize;
        float gap = (bubbleCount - 1) * mBubblePadding;
+11 −51
Original line number Diff line number Diff line
@@ -76,22 +76,10 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
        mTestableController.setRemoveImmediately(false);
    }

    @Test
    public void testRenderVisibility() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();

        // The last child should be GONE, the rest VISIBLE.
        for (int i = 0; i < mMaxRenderedBubbles + 1; i++) {
            assertEquals(i == mMaxRenderedBubbles ? View.GONE : View.VISIBLE,
                    mLayout.getChildAt(i).getVisibility());
        }
    }

    @Test
    public void testHierarchyChanges() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();

        // Make sure the controller was notified of all the views we added.
        for (View mView : mViews) {
@@ -116,7 +104,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
    @Test
    public void testUpdateValueNotChained() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();

        // Don't chain any values.
        mTestableController.setChainedProperties(Sets.newHashSet());
@@ -147,7 +135,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
    @Test
    public void testSetEndActions() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();
        mTestableController.setChainedProperties(Sets.newHashSet());

        final CountDownLatch xLatch = new CountDownLatch(1);
@@ -190,7 +178,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
    @Test
    public void testRemoveEndListeners() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();
        mTestableController.setChainedProperties(Sets.newHashSet());

        final CountDownLatch xLatch = new CountDownLatch(1);
@@ -229,7 +217,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
    public void testSetController() throws InterruptedException {
        // Add the bubbles, then set the controller, to make sure that a controller added to an
        // already-initialized view works correctly.
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();
        mLayout.setActiveController(mTestableController);
        testChainedTranslationAnimations();

@@ -284,7 +272,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
    @Test
    public void testArePropertiesAnimating() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();

        assertFalse(mLayout.arePropertiesAnimating(
                DynamicAnimation.TRANSLATION_X, DynamicAnimation.TRANSLATION_Y));
@@ -308,7 +296,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
    @Test
    public void testCancelAllAnimations() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();

        mTestableController.animationForChildAtIndex(0)
                .position(1000, 1000)
@@ -321,29 +309,10 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
        assertTrue(mViews.get(0).getTranslationY() < 1000);
    }

    @Test
    public void testSetChildVisibility() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();

        // The last view should have been set to GONE by the controller, since we added one more
        // than the limit and it got pushed off. None of the first children should have been set
        // VISIBLE, since they would have been animated in by onChildAdded.
        Mockito.verify(mTestableController).setChildVisibility(
                mViews.get(mViews.size() - 1), 5, View.GONE);
        Mockito.verify(mTestableController, never()).setChildVisibility(
                any(View.class), anyInt(), eq(View.VISIBLE));

        // Remove the first view, which should cause the last view to become visible again.
        mLayout.removeView(mViews.get(0));
        Mockito.verify(mTestableController).setChildVisibility(
                mViews.get(mViews.size() - 1), 4, View.VISIBLE);
    }

    /** Standard test of chained translation animations. */
    private void testChainedTranslationAnimations() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();

        assertEquals(0, mLayout.getChildAt(0).getTranslationX(), .1f);
        assertEquals(0, mLayout.getChildAt(1).getTranslationX(), .1f);
@@ -354,11 +323,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {

        waitForPropertyAnimations(DynamicAnimation.TRANSLATION_X);

        // Since we enabled chaining, animating the first view to 100 should animate the second to
        // 115 (since we set the offset to 15) and the third to 130, etc. Despite the sixth bubble
        // not being visible, or animated, make sure that it has the appropriate chained
        // translation.
        for (int i = 0; i < mMaxRenderedBubbles + 1; i++) {
        for (int i = 0; i < mLayout.getChildCount(); i++) {
            assertEquals(
                    100 + i * TEST_TRANSLATION_X_OFFSET,
                    mLayout.getChildAt(i).getTranslationX(), .1f);
@@ -384,7 +349,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {
    @Test
    public void testPhysicsAnimator() throws InterruptedException {
        mLayout.setActiveController(mTestableController);
        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();

        Runnable afterAll = Mockito.mock(Runnable.class);
        Runnable after = Mockito.spy(new Runnable() {
@@ -432,7 +397,7 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {

        mLayout.setActiveController(mTestableController);

        addOneMoreThanRenderLimitBubbles();
        addOneMoreThanBubbleLimitBubbles();

        Runnable allEnd = Mockito.mock(Runnable.class);

@@ -524,10 +489,5 @@ public class PhysicsAnimationLayoutTest extends PhysicsAnimationLayoutTestCase {

        @Override
        void onActiveControllerForLayout(PhysicsAnimationLayout layout) {}

        @Override
        protected void setChildVisibility(View child, int index, int visibility) {
            super.setChildVisibility(child, index, visibility);
        }
    }
}
Loading