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

Commit 3f19f60d authored by Selim Cinek's avatar Selim Cinek
Browse files

Fixed an issue where children would animate strangely when removed

Previously we tried to fix a notification flicker when the summary
of a group was removed. This lead to a few issues that group children
would now also generate an animation and the whole notification would
just look weird.
We are now cancelling notification children as soon as their parent
is cancelled already in systemUI to ensure that the animations are
properly rendered.

Change-Id: Ie639b4ad28bdb55d922308e04c14a4e5b32b90bb
Fixes: 28190616
parent 589fd3e4
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -2161,7 +2161,8 @@ public abstract class BaseStatusBar extends SystemUI implements
                entry.row.setOnKeyguard(false);
                entry.row.setSystemExpanded(visibleNotifications == 0 && !childNotification);
            }
            boolean suppressedSummary = mGroupManager.isSummaryOfSuppressedGroup(entry.notification);
            boolean suppressedSummary = mGroupManager.isSummaryOfSuppressedGroup(
                    entry.notification) && !entry.row.isRemoved();
            boolean childWithVisibleSummary = childNotification
                    && mGroupManager.getGroupSummary(entry.notification).getVisibility()
                    == View.VISIBLE;
+30 −0
Original line number Diff line number Diff line
@@ -156,6 +156,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
            }
        }
    };
    private boolean mDismissed;
    private boolean mKeepInParent;
    private boolean mRemoved;

    public NotificationContentView getPrivateLayout() {
        return mPrivateLayout;
@@ -632,6 +635,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
        ArrayList<ExpandableNotificationRow> clonedList = new ArrayList<>(notificationChildren);
        for (int i = 0; i < clonedList.size(); i++) {
            ExpandableNotificationRow row = clonedList.get(i);
            if (row.keepInParent()) {
                continue;
            }
            mChildrenContainer.removeNotification(row);
            mHeaderUtil.restoreNotificationHeader(row);
            row.setIsChildInGroup(false, null);
@@ -639,6 +645,30 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
        onChildrenCountChanged();
    }

    public void setDismissed(boolean dismissed) {
        mDismissed = dismissed;
    }

    public boolean isDismissed() {
        return mDismissed;
    }

    public boolean keepInParent() {
        return mKeepInParent;
    }

    public void setKeepInParent(boolean keepInParent) {
        mKeepInParent = keepInParent;
    }

    public boolean isRemoved() {
        return mRemoved;
    }

    public void setRemoved(boolean removed) {
        mRemoved = removed;
    }

    public interface ExpansionLogger {
        public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
    }
+6 −0
Original line number Diff line number Diff line
@@ -241,6 +241,12 @@ public class NotificationGroupManager implements HeadsUpManager.OnHeadsUpChanged
        if (group == null || group.summary == null || group.suppressed) {
            return false;
        }
        if (group.children.isEmpty()) {
            // If the suppression of a group changes because the last child was removed, this can
            // still be called temporarily because the child hasn't been fully removed yet. Let's
            // make sure we still return false in that case.
            return false;
        }
        return true;
    }

+39 −1
Original line number Diff line number Diff line
@@ -1484,6 +1484,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
            mHeadsUpEntriesToRemoveOnSwitch.add(mHeadsUpManager.getEntry(key));
            return;
        }
        // Let's remove the children if this was a summary
        handleGroupSummaryRemoved(key, ranking);
        StatusBarNotification old = removeNotificationViews(key, ranking);
        if (SPEW) Log.d(TAG, "removeNotification key=" + key + " old=" + old);

@@ -1500,6 +1502,40 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        setAreThereNotifications();
    }

    /**
     * Ensures that the group children are cancelled immediately when the group summary is cancelled
     * instead of waiting for the notification manager to send all cancels. Otherwise this could
     * lead to flickers.
     *
     * This also ensures that the animation looks nice and only consists of a single disappear
     * animation instead of multiple.
     *
     * @param key the key of the notification was removed
     * @param ranking the current ranking
     */
    private void handleGroupSummaryRemoved(String key,
            RankingMap ranking) {
        Entry entry = mNotificationData.get(key);
        if (entry != null && entry.row != null
                && entry.row.isSummaryWithChildren()) {
            if (entry.notification.getOverrideGroupKey() != null && !entry.row.isDismissed()) {
                // We don't want to remove children for autobundled notifications as they are not
                // always cancelled. We only remove them if they were dismissed by the user.
                return;
            }
            entry.row.setRemoved(true);
            List<ExpandableNotificationRow> notificationChildren =
                    entry.row.getNotificationChildren();
            ArrayList<ExpandableNotificationRow> toRemove = new ArrayList<>(notificationChildren);
            for (int i = 0; i < toRemove.size(); i++) {
                toRemove.get(i).setKeepInParent(true);
            }
            for (int i = 0; i < toRemove.size(); i++) {
                removeNotification(toRemove.get(i).getStatusBarNotification().getKey(), ranking);
            }
        }
    }

    @Override
    protected void refreshLayout(int layoutDirection) {
        if (mNavigationBarView != null) {
@@ -1689,7 +1725,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
            if (children != null) {
                toRemove.clear();
                for (ExpandableNotificationRow childRow : children) {
                    if (orderedChildren == null || !orderedChildren.contains(childRow)) {
                    if ((orderedChildren == null
                            || !orderedChildren.contains(childRow))
                            && !childRow.keepInParent()) {
                        toRemove.add(childRow);
                    }
                }
+1 −0
Original line number Diff line number Diff line
@@ -723,6 +723,7 @@ public class NotificationStackScrollLayout extends ViewGroup
                    performDismiss(groupSummary);
                }
            }
            row.setDismissed(true);
        }
        final View veto = v.findViewById(R.id.veto);
        if (veto != null && veto.getVisibility() != View.GONE) {
Loading