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
This commit is contained in:
Kevin Han
2020-02-06 16:54:50 -08:00
parent cd24019091
commit 2745336f8f
3 changed files with 33 additions and 2 deletions

View File

@@ -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);

View File

@@ -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.
*/

View File

@@ -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.