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

Commit 2745336f authored by Kevin Han's avatar Kevin Han
Browse files

Fix content views not updating

Content views weren't getting marked dirty inherently on notification
updates from the app, so the inflater wouldn't bother binding the
content view again, even if the layout actually changed. This fixes
that by providing the ability to mark all the active content views as
dirty and needing to be rebound and calling it on add/update.

Bug: 149002542
Test: repro from bug
Test: atest RowContentBindStageTest
Change-Id: I59d7f86e43763c3c03329a60a052e6c51cdc845a
parent cd240190
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -295,6 +295,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
        }
        //TODO: Replace this API with RowContentBindParams directly
        row.setNeedsRedaction(mNotificationLockscreenUserManager.needsRedaction(entry));
        params.rebindAllContentViews();
        mRowContentBindStage.requestRebind(entry, en -> {
            row.setUsesIncreasedCollapsedHeight(useIncreasedCollapsedHeight);
            row.setUsesIncreasedHeadsUpHeight(useIncreasedHeadsUp);
+8 −0
Original line number Diff line number Diff line
@@ -122,6 +122,14 @@ public final class RowContentBindParams {
        return mContentViews;
    }

    /**
     * Request that all content views be rebound. This may happen if, for example, the underlying
     * layout has changed.
     */
    public void rebindAllContentViews() {
        mDirtyContentViews = mContentViews;
    }

    /**
     * Clears all dirty content views so that they no longer need to be rebound.
     */
+24 −2
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ public class RowContentBindStageTest extends SysuiTestCase {
    }

    @Test
    public void testSetShouldContentViewsBeBound_bindsContent() {
    public void testRequireContentViews() {
        // WHEN inflation flags are set and pipeline is invalidated.
        final int flags = FLAG_CONTENT_VIEW_CONTRACTED | FLAG_CONTENT_VIEW_EXPANDED;
        RowContentBindParams params = mRowContentBindStage.getStageParams(mEntry);
@@ -85,7 +85,7 @@ public class RowContentBindStageTest extends SysuiTestCase {
    }

    @Test
    public void testSetShouldContentViewsBeBound_unbindsContent() {
    public void testFreeContentViews() {
        // GIVEN a view with all content bound.
        RowContentBindParams params = mRowContentBindStage.getStageParams(mEntry);
        params.requireContentViews(FLAG_CONTENT_VIEW_ALL);
@@ -99,6 +99,28 @@ public class RowContentBindStageTest extends SysuiTestCase {
        verify(mBinder).unbindContent(eq(mEntry), any(), eq(flags));
    }

    @Test
    public void testRebindAllContentViews() {
        // GIVEN a view with content bound.
        RowContentBindParams params = mRowContentBindStage.getStageParams(mEntry);
        final int flags = FLAG_CONTENT_VIEW_CONTRACTED | FLAG_CONTENT_VIEW_EXPANDED;
        params.requireContentViews(flags);
        params.clearDirtyContentViews();

        // WHEN we request rebind and stage executed.
        params.rebindAllContentViews();
        mRowContentBindStage.executeStage(mEntry, mRow, (en) -> { });

        // THEN binder binds inflation flags.
        verify(mBinder).bindContent(
                eq(mEntry),
                any(),
                eq(flags),
                any(),
                anyBoolean(),
                any());
    }

    @Test
    public void testSetUseLowPriority() {
        // GIVEN a view with all content bound.