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
(cherry picked from commit 2745336f8f8d0a10451c9da4c4ce2cfe9795c358)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java
index 59d82a1..ecf62db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java
@@ -295,6 +295,7 @@
         }
         //TODO: Replace this API with RowContentBindParams directly
         row.setNeedsRedaction(mNotificationLockscreenUserManager.needsRedaction(entry));
+        params.rebindAllContentViews();
         mRowContentBindStage.requestRebind(entry, en -> {
             row.setUsesIncreasedCollapsedHeight(useIncreasedCollapsedHeight);
             row.setUsesIncreasedHeadsUpHeight(useIncreasedHeadsUp);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java
index 8280a63..5170d0b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java
@@ -123,6 +123,14 @@
     }
 
     /**
+     * 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.
      */
     void clearDirtyContentViews() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/RowContentBindStageTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/RowContentBindStageTest.java
index 66aa5e1..775f722 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/RowContentBindStageTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/RowContentBindStageTest.java
@@ -67,7 +67,7 @@
     }
 
     @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 @@
     }
 
     @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);
@@ -100,6 +100,28 @@
     }
 
     @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.
         RowContentBindParams params = mRowContentBindStage.getStageParams(mEntry);