Dismiss any active bubbles when the channel setting is disabled

This change routes a callback to BubbleController to notify when the
bubble setting of a channel is disabed. In response, any active bubbles
associated with notifications in that channel will be dismissed.

Test: add a bubble, disable bubble on channel settings
Bug: 130441629
Change-Id: Iba20051c4eadebfda949fa7a6f73042c05358c93
This commit is contained in:
Mark Renouf
2019-05-09 10:42:43 -04:00
committed by Mady Mellor
parent aa21a4a71c
commit bbcf07f3f3
6 changed files with 52 additions and 6 deletions

View File

@@ -40,8 +40,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;
@@ -53,6 +51,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;
@@ -138,7 +137,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;
@@ -250,7 +248,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);
@@ -509,6 +506,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")

View File

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

View File

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

View File

@@ -169,6 +169,5 @@ public class NotificationListener extends NotificationListenerWithPlugins {
public interface NotificationSettingsListener {
default void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { }
}
}

View File

@@ -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) {
}
}

View File

@@ -483,6 +483,10 @@ public class NotificationEntryManager implements
}
updateNotifications();
for (NotificationEntryListener listener : mNotificationEntryListeners) {
listener.onNotificationRankingUpdated(rankingMap);
}
}
private void updateRankingOfPendingNotifications(