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

Commit 2b4bdbb0 authored by Kevin Han's avatar Kevin Han
Browse files

Fix notif content when child updated to top level

Since children can be updated to not be in groups and become a top level
notification, we need to check and ensure that we inflate the content of
any top level notifications that don't have content.

Bug: 154227833
Test: repro in bug
Test: atest DynamicChildBindControllerTest
Change-Id: I83120691e20f63ee4f3d440d84c005cdfe84a719
parent a8761169
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -60,7 +60,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<>();

@@ -206,6 +206,8 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
                }
                orderedChildren.add(ent);
            } else {
                // Top-level notif
                mTmpChildOrderMap.put(ent, null);
                toShow.add(ent.getRow());
            }
        }
@@ -283,7 +285,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle

        }

        mDynamicChildBindController.updateChildContentViews(mTmpChildOrderMap);
        mDynamicChildBindController.updateContentViews(mTmpChildOrderMap);
        mVisualStabilityManager.onReorderingFinished();
        // clear the map again for the next usage
        mTmpChildOrderMap.clear();
+19 −11
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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);