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
This commit is contained in:
Selim Cinek
2021-06-24 14:02:27 +02:00
parent f2d2fb5292
commit 59d8322d5e
3 changed files with 32 additions and 11 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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();
}