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

Commit 65f41278 authored by Matt Pietal's avatar Matt Pietal
Browse files

Media - Handle cleanup of pending notification entries

It is possible for notifications to be canceled prior to inflation,
which means there will not be a callback when the notification is
removed. Utitlize the NotifCollectionListener to get this event.

Fixes: 166315453
Test: manual, using RCNs to generate a race condition as they
create/cancel notifications immediately

Change-Id: I56d3ab9ef46d86c8623f9bac9152e8a2b8341c01
(cherry picked from commit a332522a)
parent 6b771b65
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static com.android.systemui.statusbar.phone.StatusBar.ENABLE_LOCKSCREEN_W
import static com.android.systemui.statusbar.phone.StatusBar.SHOW_LOCKSCREEN_MEDIA_ARTWORK;

import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Notification;
import android.content.Context;
@@ -57,6 +58,7 @@ import com.android.systemui.statusbar.dagger.StatusBarModule;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
@@ -234,8 +236,17 @@ public class NotificationMediaManager implements Dumpable {
                    NotificationVisibility visibility,
                    boolean removedByUser,
                    int reason) {
                onNotificationRemoved(entry.getKey());
                mediaDataManager.onNotificationRemoved(entry.getKey());
                removeEntry(entry);
            }
        });

        // Pending entries are never inflated, and will never generate a call to onEntryRemoved().
        // This can happen when notifications are added and canceled before inflation. Add this
        // separate listener for cleanup, since media inflation occurs onPendingEntryAdded().
        notificationEntryManager.addCollectionListener(new NotifCollectionListener() {
            @Override
            public void onEntryCleanUp(@NonNull NotificationEntry entry) {
                removeEntry(entry);
            }
        });

@@ -248,6 +259,11 @@ public class NotificationMediaManager implements Dumpable {
                mPropertiesChangedListener);
    }

    private void removeEntry(NotificationEntry entry) {
        onNotificationRemoved(entry.getKey());
        mMediaDataManager.onNotificationRemoved(entry.getKey());
    }

    /**
     * Check if a state should be considered actively playing
     * @param state a PlaybackState