diff options
3 files changed, 25 insertions, 15 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 02c41e5aaefe..8fcc67a0708e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -61,7 +61,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle private final Handler mHandler; - /** Re-usable map of notifications to their sorted children.*/ + /** Re-usable map of top-level notifications to their sorted children if any.*/ private final HashMap<NotificationEntry, List<NotificationEntry>> mTmpChildOrderMap = new HashMap<>(); @@ -211,6 +211,8 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle } orderedChildren.add(ent); } else { + // Top-level notif + mTmpChildOrderMap.put(ent, null); toShow.add(ent.getRow()); } } @@ -288,7 +290,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle } - mDynamicChildBindController.updateChildContentViews(mTmpChildOrderMap); + mDynamicChildBindController.updateContentViews(mTmpChildOrderMap); mVisualStabilityManager.onReorderingFinished(); // clear the map again for the next usage mTmpChildOrderMap.clear(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicChildBindController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicChildBindController.java index 148cdea92052..57b41f36e51f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicChildBindController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicChildBindController.java @@ -63,44 +63,52 @@ public class DynamicChildBindController { } /** - * Update the child content views, unbinding content views on children that won't be visible - * and binding content views on children that will be visible eventually. + * Update the content views, unbinding content views on children that won't be visible + * and binding content views on children that will be visible eventually and previously unbound + * children that are no longer children. * - * @param groupNotifs map of notification summaries to their children + * @param groupNotifs map of top-level notifs to their children, if any */ - public void updateChildContentViews( + public void updateContentViews( Map<NotificationEntry, List<NotificationEntry>> groupNotifs) { for (NotificationEntry entry : groupNotifs.keySet()) { List<NotificationEntry> children = groupNotifs.get(entry); + if (children == null) { + if (!hasContent(entry)) { + // Case where child is updated to be top level + bindContent(entry); + } + continue; + } for (int j = 0; j < children.size(); j++) { NotificationEntry childEntry = children.get(j); if (j >= mChildBindCutoff) { - if (hasChildContent(childEntry)) { - freeChildContent(childEntry); + if (hasContent(childEntry)) { + freeContent(childEntry); } } else { - if (!hasChildContent(childEntry)) { - bindChildContent(childEntry); + if (!hasContent(childEntry)) { + bindContent(childEntry); } } } } } - private boolean hasChildContent(NotificationEntry entry) { + private boolean hasContent(NotificationEntry entry) { ExpandableNotificationRow row = entry.getRow(); return row.getPrivateLayout().getContractedChild() != null || row.getPrivateLayout().getExpandedChild() != null; } - private void freeChildContent(NotificationEntry entry) { + private void freeContent(NotificationEntry entry) { RowContentBindParams params = mStage.getStageParams(entry); params.markContentViewsFreeable(FLAG_CONTENT_VIEW_CONTRACTED); params.markContentViewsFreeable(FLAG_CONTENT_VIEW_EXPANDED); mStage.requestRebind(entry, null); } - private void bindChildContent(NotificationEntry entry) { + private void bindContent(NotificationEntry entry) { RowContentBindParams params = mStage.getStageParams(entry); params.requireContentViews(FLAG_CONTENT_VIEW_CONTRACTED); params.requireContentViews(FLAG_CONTENT_VIEW_EXPANDED); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicChildBindControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicChildBindControllerTest.java index 29040147d1ca..d0dfb17111c6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicChildBindControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicChildBindControllerTest.java @@ -80,7 +80,7 @@ public class DynamicChildBindControllerTest extends SysuiTestCase { when(mBindStage.getStageParams(lastChild)).thenReturn(bindParams); // WHEN the controller gets the list - mDynamicChildBindController.updateChildContentViews(mGroupNotifs); + mDynamicChildBindController.updateContentViews(mGroupNotifs); // THEN we free content views verify(bindParams).markContentViewsFreeable(FLAG_CONTENT_VIEW_CONTRACTED); @@ -101,7 +101,7 @@ public class DynamicChildBindControllerTest extends SysuiTestCase { when(mBindStage.getStageParams(lastChild)).thenReturn(bindParams); // WHEN the controller gets the list - mDynamicChildBindController.updateChildContentViews(mGroupNotifs); + mDynamicChildBindController.updateContentViews(mGroupNotifs); // THEN we bind content views verify(bindParams).requireContentViews(FLAG_CONTENT_VIEW_CONTRACTED); |