diff options
7 files changed, 53 insertions, 6 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index f80ca68d4e51..392183b554a9 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -41,8 +41,6 @@ import static java.lang.annotation.RetentionPolicy.SOURCE; import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; -import android.app.ActivityTaskManager; -import android.app.IActivityTaskManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; @@ -54,6 +52,7 @@ import android.graphics.Rect; import android.os.RemoteException; import android.os.ServiceManager; import android.provider.Settings; +import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; import android.util.Log; @@ -139,7 +138,6 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private final Context mContext; private final NotificationEntryManager mNotificationEntryManager; - private final IActivityTaskManager mActivityTaskManager; private final BubbleTaskStackListener mTaskStackListener; private BubbleStateChangeListener mStateChangeListener; private BubbleExpandListener mExpandListener; @@ -251,7 +249,6 @@ public class BubbleController implements ConfigurationController.ConfigurationLi mStatusBarStateListener = new StatusBarStateListener(); Dependency.get(StatusBarStateController.class).addCallback(mStatusBarStateListener); - mActivityTaskManager = ActivityTaskManager.getService(); mTaskStackListener = new BubbleTaskStackListener(); ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener); @@ -510,6 +507,12 @@ public class BubbleController implements ConfigurationController.ConfigurationLi updateBubble(entry); } } + + @Override + public void onNotificationRankingUpdated(RankingMap rankingMap) { + // Forward to BubbleData to block any bubbles which should no longer be shown + mBubbleData.notificationRankingUpdated(rankingMap); + } }; @SuppressWarnings("FieldCanBeLocal") diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java index 6ab973eb3065..5575b35a12ae 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java @@ -22,6 +22,8 @@ import static java.util.stream.Collectors.toList; import android.app.Notification; import android.app.PendingIntent; import android.content.Context; +import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationListenerService.RankingMap; import android.util.Log; import android.util.Pair; @@ -114,6 +116,8 @@ public class BubbleData { // State tracked during an operation -- keeps track of what listener events to dispatch. private Update mStateChange; + private NotificationListenerService.Ranking mTmpRanking; + private TimeSource mTimeSource = System::currentTimeMillis; @Nullable @@ -193,6 +197,31 @@ public class BubbleData { dispatchPendingChanges(); } + /** + * Called when NotificationListener has received adjusted notification rank and reapplied + * filtering and sorting. This is used to dismiss any bubbles which should no longer be shown + * due to changes in permissions on the notification channel or the global setting. + * + * @param rankingMap the updated ranking map from NotificationListenerService + */ + public void notificationRankingUpdated(RankingMap rankingMap) { + if (mTmpRanking == null) { + mTmpRanking = new NotificationListenerService.Ranking(); + } + + String[] orderedKeys = rankingMap.getOrderedKeys(); + for (int i = 0; i < orderedKeys.length; i++) { + String key = orderedKeys[i]; + if (hasBubbleWithKey(key)) { + rankingMap.getRanking(key, mTmpRanking); + if (!mTmpRanking.canBubble()) { + doRemove(key, BubbleController.DISMISS_BLOCKED); + } + } + } + dispatchPendingChanges(); + } + private void doAdd(Bubble bubble) { if (DEBUG) { Log.d(TAG, "doAdd: " + bubble); diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 6de0fb581e90..c63389a47d2d 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -732,7 +732,6 @@ public class BubbleStackView extends FrameLayout { } } - /** * Changes the currently selected bubble. If the stack is already expanded, the newly selected * bubble will be shown immediately. This does not change the expanded state or change the diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java index 9d5871eb595c..c375574f023d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java @@ -169,6 +169,5 @@ public class NotificationListener extends NotificationListenerWithPlugins { public interface NotificationSettingsListener { default void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java index a5a6d87c2030..1aa6bc9ae5f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification; import android.annotation.Nullable; +import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; import com.android.internal.statusbar.NotificationVisibility; @@ -98,4 +100,14 @@ public interface NotificationEntryListener { @Nullable NotificationVisibility visibility, boolean removedByUser) { } + + /** + * Called whenever notification ranking changes, in response to + * {@link NotificationListenerService#onNotificationRankingUpdate}. This is called after + * NotificationData has processed the update and notifications have been re-sorted and filtered. + * + * @param rankingMap provides access to ranking information on currently active notifications + */ + default void onNotificationRankingUpdated(RankingMap rankingMap) { + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index 3ac5768f091a..e8388ceded04 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -483,6 +483,10 @@ public class NotificationEntryManager implements } updateNotifications(); + + for (NotificationEntryListener listener : mNotificationEntryListeners) { + listener.onNotificationRankingUpdated(rankingMap); + } } private void updateRankingOfPendingNotifications( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index 4d593c101706..72f3a62f30a7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -402,6 +402,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { verify(mRow).setEntry(eq(mEntry)); assertEquals(1, mEntry.systemGeneratedSmartActions.size()); assertEquals("action", mEntry.systemGeneratedSmartActions.get(0).title); + verify(mEntryListener).onNotificationRankingUpdated(mRankingMap); } @Test |