Media player attempts to dismiss notifications when players removed.

NOTE: this is only a partial fix.  See bug for discussion.

Bug: 160713608
Test: manual
Change-Id: I64db4cc618a812063c18a40ea4465aa4c520a3be
This commit is contained in:
Jeff DeCew
2020-09-28 13:14:28 -04:00
parent cbec8517d3
commit 725d67d889
3 changed files with 72 additions and 2 deletions

View File

@@ -631,13 +631,13 @@ class MediaDataManager(
Assert.isMainThread() Assert.isMainThread()
val removed = mediaEntries.remove(key) val removed = mediaEntries.remove(key)
if (useMediaResumption && removed?.resumeAction != null && if (useMediaResumption && removed?.resumeAction != null &&
!isBlockedFromResume(removed?.packageName)) { !isBlockedFromResume(removed.packageName)) {
Log.d(TAG, "Not removing $key because resumable") Log.d(TAG, "Not removing $key because resumable")
// Move to resume key (aka package name) if that key doesn't already exist. // Move to resume key (aka package name) if that key doesn't already exist.
val resumeAction = getResumeMediaAction(removed.resumeAction!!) val resumeAction = getResumeMediaAction(removed.resumeAction!!)
val updated = removed.copy(token = null, actions = listOf(resumeAction), val updated = removed.copy(token = null, actions = listOf(resumeAction),
actionsToShowInCompact = listOf(0), active = false, resumption = true) actionsToShowInCompact = listOf(0), active = false, resumption = true)
val pkg = removed?.packageName val pkg = removed.packageName
val migrate = mediaEntries.put(pkg, updated) == null val migrate = mediaEntries.put(pkg, updated) == null
// Notify listeners of "new" controls when migrating or removed and update when not // Notify listeners of "new" controls when migrating or removed and update when not
if (migrate) { if (migrate) {

View File

@@ -40,6 +40,8 @@ import android.os.Trace;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.DeviceConfig; import android.provider.DeviceConfig;
import android.provider.DeviceConfig.Properties; import android.provider.DeviceConfig.Properties;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationStats;
import android.service.notification.StatusBarNotification; import android.service.notification.StatusBarNotification;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.Log; import android.util.Log;
@@ -53,14 +55,18 @@ import com.android.systemui.Dumpable;
import com.android.systemui.Interpolators; import com.android.systemui.Interpolators;
import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.media.MediaData;
import com.android.systemui.media.MediaDataManager; import com.android.systemui.media.MediaDataManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.dagger.StatusBarModule; import com.android.systemui.statusbar.dagger.StatusBarModule;
import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.DismissedByUserStats;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.LockscreenWallpaper; import com.android.systemui.statusbar.phone.LockscreenWallpaper;
@@ -110,6 +116,7 @@ public class NotificationMediaManager implements Dumpable {
private final NotificationEntryManager mEntryManager; private final NotificationEntryManager mEntryManager;
private final MediaDataManager mMediaDataManager; private final MediaDataManager mMediaDataManager;
private final NotifPipeline mNotifPipeline; private final NotifPipeline mNotifPipeline;
private final NotifCollection mNotifCollection;
private final boolean mUsingNotifPipeline; private final boolean mUsingNotifPipeline;
@Nullable @Nullable
@@ -195,6 +202,7 @@ public class NotificationMediaManager implements Dumpable {
MediaArtworkProcessor mediaArtworkProcessor, MediaArtworkProcessor mediaArtworkProcessor,
KeyguardBypassController keyguardBypassController, KeyguardBypassController keyguardBypassController,
NotifPipeline notifPipeline, NotifPipeline notifPipeline,
NotifCollection notifCollection,
FeatureFlags featureFlags, FeatureFlags featureFlags,
@Main DelayableExecutor mainExecutor, @Main DelayableExecutor mainExecutor,
DeviceConfigProxy deviceConfig, DeviceConfigProxy deviceConfig,
@@ -214,6 +222,7 @@ public class NotificationMediaManager implements Dumpable {
mMainExecutor = mainExecutor; mMainExecutor = mainExecutor;
mMediaDataManager = mediaDataManager; mMediaDataManager = mediaDataManager;
mNotifPipeline = notifPipeline; mNotifPipeline = notifPipeline;
mNotifCollection = notifCollection;
if (!featureFlags.isNewNotifPipelineRenderingEnabled()) { if (!featureFlags.isNewNotifPipelineRenderingEnabled()) {
setupNEM(); setupNEM();
@@ -259,6 +268,27 @@ public class NotificationMediaManager implements Dumpable {
removeEntry(entry); removeEntry(entry);
} }
}); });
mMediaDataManager.addListener(new MediaDataManager.Listener() {
@Override
public void onMediaDataLoaded(@NonNull String key,
@Nullable String oldKey, @NonNull MediaData data) {
}
@Override
public void onMediaDataRemoved(@NonNull String key) {
mNotifPipeline.getAllNotifs()
.stream()
.filter(entry -> Objects.equals(entry.getKey(), key))
.findAny()
.ifPresent(entry -> {
// TODO(b/160713608): "removing" this notification won't happen and
// won't send the 'deleteIntent' if the notification is ongoing.
mNotifCollection.dismissNotification(entry,
getDismissedByUserStats(entry));
});
}
});
} }
private void setupNEM() { private void setupNEM() {
@@ -303,6 +333,43 @@ public class NotificationMediaManager implements Dumpable {
removeEntry(entry); removeEntry(entry);
} }
}); });
mMediaDataManager.addListener(new MediaDataManager.Listener() {
@Override
public void onMediaDataLoaded(@NonNull String key,
@Nullable String oldKey, @NonNull MediaData data) {
}
@Override
public void onMediaDataRemoved(@NonNull String key) {
NotificationEntry entry = mEntryManager.getPendingOrActiveNotif(key);
if (entry != null) {
// TODO(b/160713608): "removing" this notification won't happen and
// won't send the 'deleteIntent' if the notification is ongoing.
mEntryManager.performRemoveNotification(entry.getSbn(),
getDismissedByUserStats(entry),
NotificationListenerService.REASON_CANCEL);
}
}
});
}
private DismissedByUserStats getDismissedByUserStats(NotificationEntry entry) {
final int activeNotificationsCount;
if (mUsingNotifPipeline) {
activeNotificationsCount = mNotifPipeline.getShadeListCount();
} else {
activeNotificationsCount = mEntryManager.getActiveNotificationsCount();
}
return new DismissedByUserStats(
NotificationStats.DISMISSAL_SHADE, // Add DISMISSAL_MEDIA?
NotificationStats.DISMISS_SENTIMENT_NEUTRAL,
NotificationVisibility.obtain(
entry.getKey(),
entry.getRanking().getRank(),
activeNotificationsCount,
/* visible= */ true,
NotificationLogger.getNotificationLocation(entry)));
} }
private void removeEntry(NotificationEntry entry) { private void removeEntry(NotificationEntry entry) {

View File

@@ -44,6 +44,7 @@ import com.android.systemui.statusbar.notification.AssistantFeedbackController;
import com.android.systemui.statusbar.notification.DynamicChildBindController; import com.android.systemui.statusbar.notification.DynamicChildBindController;
import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper; import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy; import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
@@ -111,6 +112,7 @@ public interface StatusBarDependenciesModule {
MediaArtworkProcessor mediaArtworkProcessor, MediaArtworkProcessor mediaArtworkProcessor,
KeyguardBypassController keyguardBypassController, KeyguardBypassController keyguardBypassController,
NotifPipeline notifPipeline, NotifPipeline notifPipeline,
NotifCollection notifCollection,
FeatureFlags featureFlags, FeatureFlags featureFlags,
@Main DelayableExecutor mainExecutor, @Main DelayableExecutor mainExecutor,
DeviceConfigProxy deviceConfigProxy, DeviceConfigProxy deviceConfigProxy,
@@ -123,6 +125,7 @@ public interface StatusBarDependenciesModule {
mediaArtworkProcessor, mediaArtworkProcessor,
keyguardBypassController, keyguardBypassController,
notifPipeline, notifPipeline,
notifCollection,
featureFlags, featureFlags,
mainExecutor, mainExecutor,
deviceConfigProxy, deviceConfigProxy,