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

Commit 59d8322d authored by Selim Cinek's avatar Selim Cinek
Browse files

Fixed an issue where notification dismissals wouldn't animate

For notification groups with a single child, where the parent
is suppressed, no notifications were generated for the dismissal
because the stackscroller thought that a child transfer was in
progress.
This also fixes a case where we accidentally triggered a resize
animation because remoteInputs were removed even though they
haven't changed their visibility. This was masking the above
behavior from manifesting always and only showed for notifications
that had no remote input.

Fixes: 187291379
Test: add group with a single child and no remote input, dismiss, observe animation happening
Change-Id: Iab4f6697feb393c4e1cc8b5f546c9daa110f3230
parent f2d2fb52
Loading
Loading
Loading
Loading
+22 −10
Original line number Diff line number Diff line
@@ -158,14 +158,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
        final int N = activeNotifications.size();
        for (int i = 0; i < N; i++) {
            NotificationEntry ent = activeNotifications.get(i);
            final boolean isBubbleNotificationSuppressedFromShade = mBubblesOptional.isPresent()
                    && mBubblesOptional.get().isBubbleNotificationSuppressedFromShade(
                            ent.getKey(), ent.getSbn().getGroupKey());
            if (ent.isRowDismissed() || ent.isRowRemoved()
                    || isBubbleNotificationSuppressedFromShade
                    || mFgsSectionController.hasEntry(ent)) {
                // we don't want to update removed notifications because they could
                // temporarily become children if they were isolated before.
            if (shouldSuppressActiveNotification(ent)) {
                continue;
            }

@@ -254,9 +247,11 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
        }

        for (ExpandableNotificationRow viewToRemove : viewsToRemove) {
            if (mEntryManager.getPendingOrActiveNotif(viewToRemove.getEntry().getKey()) != null) {
            NotificationEntry entry = viewToRemove.getEntry();
            if (mEntryManager.getPendingOrActiveNotif(entry.getKey()) != null
                && !shouldSuppressActiveNotification(entry)) {
                // we are only transferring this notification to its parent, don't generate an
                // animation
                // animation. If the notification is suppressed, this isn't a transfer.
                mListContainer.setChildTransferInProgress(true);
            }
            if (viewToRemove.isSummaryWithChildren()) {
@@ -325,6 +320,23 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
        endUpdate();
    }

    /**
     * Should a notification entry from the active list be suppressed and not show?
     */
    private boolean shouldSuppressActiveNotification(NotificationEntry ent) {
        final boolean isBubbleNotificationSuppressedFromShade = mBubblesOptional.isPresent()
                && mBubblesOptional.get().isBubbleNotificationSuppressedFromShade(
                        ent.getKey(), ent.getSbn().getGroupKey());
        if (ent.isRowDismissed() || ent.isRowRemoved()
                || isBubbleNotificationSuppressedFromShade
                || mFgsSectionController.hasEntry(ent)) {
            // we want to suppress removed notifications because they could
            // temporarily become children if they were isolated before.
            return true;
        }
        return false;
    }

    private void addNotificationChildrenAndSort() {
        // Let's now add all notification children which are missing
        boolean orderChanged = false;
+2 −0
Original line number Diff line number Diff line
@@ -132,6 +132,8 @@ public class RemoteInputController {
    public void removeRemoteInput(NotificationEntry entry, Object token) {
        Objects.requireNonNull(entry);
        if (entry.mRemoteEditImeVisible) return;
        // If the view is being removed, this may be called even though we're not active
        if (!isRemoteInputActive(entry)) return;

        pruneWeakThenRemoveAndContains(null /* contains */, entry /* remove */, token);

+8 −1
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
            false /* default */);
    // TODO(b/187291379) disable again before release
    private static final boolean DEBUG_REMOVE_ANIMATION = SystemProperties.getBoolean(
            "persist.debug.nssl.dismiss", true /* default */);
            "persist.debug.nssl.dismiss", false /* default */);

    private static final float RUBBER_BAND_FACTOR_NORMAL = 0.35f;
    private static final float RUBBER_BAND_FACTOR_AFTER_EXPAND = 0.15f;
@@ -3205,6 +3205,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
                    ignoreChildren);
            mAnimationEvents.add(event);
            mSwipedOutViews.remove(child);
            if (DEBUG_REMOVE_ANIMATION) {
                String key = "";
                if (child instanceof ExpandableNotificationRow) {
                    key = ((ExpandableNotificationRow) child).getEntry().getKey();
                }
                Log.d(TAG, "created Remove Event - SwipedOut: " + childWasSwipedOut + " " + key);
            }
        }
        mChildrenToRemoveAnimated.clear();
    }