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:
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user