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:
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user