New Pipeline: Add a NotificationVisibilityProvider to support both pipelines

Fixes: 169655596
Fixes: 204183781
Fixes: 204770080
Test: atest SystemUITests
Change-Id: I96cd96d1a037e7cca301242b1dba25ecdd72be9a
This commit is contained in:
Jeff DeCew
2021-11-01 10:42:04 -04:00
parent db866e75c0
commit b8da5df67a
31 changed files with 407 additions and 155 deletions

View File

@@ -60,6 +60,7 @@ import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
import com.android.systemui.statusbar.notification.people.PeopleHubModule;
import com.android.systemui.statusbar.notification.row.dagger.ExpandableNotificationRowComponent;
@@ -204,7 +205,9 @@ public abstract class SystemUIModule {
NotificationShadeWindowController notificationShadeWindowController,
StatusBarStateController statusBarStateController, ShadeController shadeController,
ConfigurationController configurationController,
@Nullable IStatusBarService statusBarService, INotificationManager notificationManager,
@Nullable IStatusBarService statusBarService,
INotificationManager notificationManager,
NotificationVisibilityProvider visibilityProvider,
NotificationInterruptStateProvider interruptionStateProvider,
ZenModeController zenModeController, NotificationLockscreenUserManager notifUserManager,
NotificationGroupManagerLegacy groupManager, NotificationEntryManager entryManager,
@@ -213,6 +216,7 @@ public abstract class SystemUIModule {
return Optional.ofNullable(BubblesManager.create(context, bubblesOptional,
notificationShadeWindowController, statusBarStateController, shadeController,
configurationController, statusBarService, notificationManager,
visibilityProvider,
interruptionStateProvider, zenModeController, notifUserManager,
groupManager, entryManager, notifPipeline, sysUiState, featureFlags, dumpManager,
sysuiMainExecutor));

View File

@@ -36,8 +36,9 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.people.PeopleSpaceUtils;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubble;
@@ -50,7 +51,8 @@ public class LaunchConversationActivity extends Activity {
private static final String TAG = "PeopleSpaceLaunchConv";
private static final boolean DEBUG = PeopleSpaceUtils.DEBUG;
private UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
private NotificationEntryManager mNotificationEntryManager;
private NotificationVisibilityProvider mVisibilityProvider;
private CommonNotifCollection mCommonNotifCollection;
private final Optional<BubblesManager> mBubblesManagerOptional;
private final UserManager mUserManager;
private boolean mIsForTesting;
@@ -60,11 +62,16 @@ public class LaunchConversationActivity extends Activity {
private NotificationEntry mEntryToBubble;
@Inject
public LaunchConversationActivity(NotificationEntryManager notificationEntryManager,
Optional<BubblesManager> bubblesManagerOptional, UserManager userManager,
CommandQueue commandQueue) {
public LaunchConversationActivity(
NotificationVisibilityProvider visibilityProvider,
CommonNotifCollection commonNotifCollection,
Optional<BubblesManager> bubblesManagerOptional,
UserManager userManager,
CommandQueue commandQueue
) {
super();
mNotificationEntryManager = notificationEntryManager;
mVisibilityProvider = visibilityProvider;
mCommonNotifCollection = commonNotifCollection;
mBubblesManagerOptional = bubblesManagerOptional;
mUserManager = userManager;
mCommandQueue = commandQueue;
@@ -128,8 +135,7 @@ public class LaunchConversationActivity extends Activity {
// shortcutId, fallback to notificationKey if it exists.
if (mBubblesManagerOptional.isPresent()) {
mBubble = mBubblesManagerOptional.get().getBubbleWithShortcutId(tileId);
NotificationEntry entry = mNotificationEntryManager.getPendingOrActiveNotif(
notificationKey);
NotificationEntry entry = mCommonNotifCollection.getEntry(notificationKey);
if (mBubble != null || (entry != null && entry.canBubble())) {
mEntryToBubble = entry;
if (DEBUG) {
@@ -167,14 +173,14 @@ public class LaunchConversationActivity extends Activity {
}
try {
if (mIStatusBarService == null || mNotificationEntryManager == null) {
if (mIStatusBarService == null || mCommonNotifCollection == null) {
if (DEBUG) {
Log.d(TAG, "Skipping clear notification: null services, key: " + notifKey);
}
return;
}
NotificationEntry entry = mNotificationEntryManager.getPendingOrActiveNotif(notifKey);
NotificationEntry entry = mCommonNotifCollection.getEntry(notifKey);
if (entry == null || entry.getRanking() == null) {
if (DEBUG) {
Log.d(TAG, "Skipping clear notification: NotificationEntry or its Ranking"
@@ -183,10 +189,8 @@ public class LaunchConversationActivity extends Activity {
return;
}
int count = mNotificationEntryManager.getActiveNotificationsCount();
int rank = entry.getRanking().getRank();
NotificationVisibility notifVisibility = NotificationVisibility.obtain(notifKey,
rank, count, true);
NotificationVisibility notifVisibility = mVisibilityProvider.obtain(entry, true);
int rank = notifVisibility.rank;
if (DEBUG) Log.d(TAG, "Clearing notification, key: " + notifKey + ", rank: " + rank);
mIStatusBarService.onNotificationClear(

View File

@@ -51,12 +51,13 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -67,6 +68,8 @@ import java.util.List;
import javax.inject.Inject;
import dagger.Lazy;
/**
* Handles keeping track of the current user, profiles, and various things related to hiding
* contents, redacting notifications, and the lockscreen.
@@ -86,6 +89,8 @@ public class NotificationLockscreenUserManagerImpl implements
// Lazy
private NotificationEntryManager mEntryManager;
private final FeatureFlags mFeatureFlags;
private final Lazy<NotificationVisibilityProvider> mVisibilityProviderLazy;
private final DevicePolicyManager mDevicePolicyManager;
private final SparseBooleanArray mLockscreenPublicMode = new SparseBooleanArray();
private final SparseBooleanArray mUsersWithSeperateWorkChallenge = new SparseBooleanArray();
@@ -162,15 +167,8 @@ public class NotificationLockscreenUserManagerImpl implements
}
}
if (notificationKey != null) {
NotificationEntry entry =
getEntryManager().getActiveNotificationUnfiltered(notificationKey);
final int count = getEntryManager().getActiveNotificationsCount();
final int rank = entry != null ? entry.getRanking().getRank() : 0;
NotificationVisibility.NotificationLocation location =
NotificationLogger.getNotificationLocation(entry);
final NotificationVisibility nv = NotificationVisibility.obtain(
notificationKey,
rank, count, true, location);
final NotificationVisibility nv = mVisibilityProviderLazy.get()
.obtain(notificationKey, true);
mClickNotifier.onNotificationClick(notificationKey, nv);
}
break;
@@ -197,9 +195,11 @@ public class NotificationLockscreenUserManagerImpl implements
@Inject
public NotificationLockscreenUserManagerImpl(Context context,
FeatureFlags featureFlags,
BroadcastDispatcher broadcastDispatcher,
DevicePolicyManager devicePolicyManager,
UserManager userManager,
Lazy<NotificationVisibilityProvider> visibilityProviderLazy,
NotificationClickNotifier clickNotifier,
KeyguardManager keyguardManager,
StatusBarStateController statusBarStateController,
@@ -208,10 +208,12 @@ public class NotificationLockscreenUserManagerImpl implements
KeyguardStateController keyguardStateController,
DumpManager dumpManager) {
mContext = context;
mFeatureFlags = featureFlags;
mMainHandler = mainHandler;
mDevicePolicyManager = devicePolicyManager;
mUserManager = userManager;
mCurrentUserId = ActivityManager.getCurrentUser();
mVisibilityProviderLazy = visibilityProviderLazy;
mClickNotifier = clickNotifier;
statusBarStateController.addCallback(this);
mLockPatternUtils = new LockPatternUtils(context);
@@ -337,6 +339,8 @@ public class NotificationLockscreenUserManagerImpl implements
* package-specific override.
*/
public boolean shouldHideNotifications(String key) {
// TODO(b/204764178): support new pipeline
mFeatureFlags.checkLegacyPipelineEnabled();
if (getEntryManager() == null) {
Log.wtf(TAG, "mEntryManager was null!", new Throwable());
return true;
@@ -347,6 +351,8 @@ public class NotificationLockscreenUserManagerImpl implements
}
public boolean shouldShowOnKeyguard(NotificationEntry entry) {
// TODO(b/204764178): support new pipeline
mFeatureFlags.checkLegacyPipelineEnabled();
if (getEntryManager() == null) {
Log.wtf(TAG, "mEntryManager was null!", new Throwable());
return false;
@@ -520,6 +526,8 @@ public class NotificationLockscreenUserManagerImpl implements
}
private boolean packageHasVisibilityOverride(String key) {
// TODO(b/204764178): support new pipeline
mFeatureFlags.checkLegacyPipelineEnabled();
if (getEntryManager() == null) {
Log.wtf(TAG, "mEntryManager was null!", new Throwable());
return true;

View File

@@ -66,7 +66,7 @@ import com.android.systemui.statusbar.notification.collection.NotifPipeline;
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.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
@@ -113,6 +113,7 @@ public class NotificationMediaManager implements Dumpable {
PAUSED_MEDIA_STATES.add(PlaybackState.STATE_CONNECTING);
}
private final NotificationVisibilityProvider mVisibilityProvider;
private final NotificationEntryManager mEntryManager;
private final MediaDataManager mMediaDataManager;
private final NotifPipeline mNotifPipeline;
@@ -181,6 +182,7 @@ public class NotificationMediaManager implements Dumpable {
Context context,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
Lazy<NotificationShadeWindowController> notificationShadeWindowController,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
MediaArtworkProcessor mediaArtworkProcessor,
KeyguardBypassController keyguardBypassController,
@@ -201,6 +203,7 @@ public class NotificationMediaManager implements Dumpable {
// TODO: use KeyguardStateController#isOccluded to remove this dependency
mStatusBarOptionalLazy = statusBarOptionalLazy;
mNotificationShadeWindowController = notificationShadeWindowController;
mVisibilityProvider = visibilityProvider;
mEntryManager = notificationEntryManager;
mMainExecutor = mainExecutor;
mMediaDataManager = mediaDataManager;
@@ -351,21 +354,10 @@ public class NotificationMediaManager implements Dumpable {
}
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)));
mVisibilityProvider.obtain(entry, /* visible= */ true));
}
private void removeEntry(NotificationEntry entry) {
@@ -406,10 +398,7 @@ public class NotificationMediaManager implements Dumpable {
return null;
}
if (mUsingNotifPipeline) {
// TODO(b/169655596): Either add O(1) lookup, or cache this icon?
return mNotifPipeline.getAllNotifs().stream()
.filter(entry -> Objects.equals(entry.getKey(), mMediaNotificationKey))
.findAny()
return Optional.ofNullable(mNotifPipeline.getEntry(mMediaNotificationKey))
.map(entry -> entry.getIcons().getShelfIcon())
.map(StatusBarIconView::getSourceIcon)
.orElse(null);

View File

@@ -60,6 +60,7 @@ 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.NotificationEntry.EditedSuggestionInfo;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -95,6 +96,7 @@ public class NotificationRemoteInputManager implements Dumpable {
// Dependencies:
private final NotificationLockscreenUserManager mLockscreenUserManager;
private final SmartReplyController mSmartReplyController;
private final NotificationVisibilityProvider mVisibilityProvider;
private final NotificationEntryManager mEntryManager;
private final Handler mMainHandler;
private final ActionClickLogger mLogger;
@@ -202,14 +204,7 @@ public class NotificationRemoteInputManager implements Dumpable {
ViewGroup actionGroup = (ViewGroup) parent;
buttonIndex = actionGroup.indexOfChild(view);
}
// TODO(b/204183781): get this from the current pipeline
final int count = mEntryManager.getActiveNotificationsCount();
final int rank = entry.getRanking().getRank();
NotificationVisibility.NotificationLocation location =
NotificationLogger.getNotificationLocation(entry);
final NotificationVisibility nv =
NotificationVisibility.obtain(key, rank, count, true, location);
final NotificationVisibility nv = mVisibilityProvider.obtain(entry, true);
mClickNotifier.onNotificationActionClick(key, buttonIndex, action, nv, false);
}
@@ -263,6 +258,7 @@ public class NotificationRemoteInputManager implements Dumpable {
FeatureFlags featureFlags,
NotificationLockscreenUserManager lockscreenUserManager,
SmartReplyController smartReplyController,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
RemoteInputNotificationRebuilder rebuilder,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
@@ -276,6 +272,7 @@ public class NotificationRemoteInputManager implements Dumpable {
mFeatureFlags = featureFlags;
mLockscreenUserManager = lockscreenUserManager;
mSmartReplyController = smartReplyController;
mVisibilityProvider = visibilityProvider;
mEntryManager = notificationEntryManager;
mStatusBarOptionalLazy = statusBarOptionalLazy;
mMainHandler = mainHandler;

View File

@@ -26,9 +26,8 @@ import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dumpable;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.statusbar.dagger.StatusBarModule;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -40,7 +39,7 @@ import java.util.Set;
*/
public class SmartReplyController implements Dumpable {
private final IStatusBarService mBarService;
private final NotificationEntryManager mEntryManager;
private final NotificationVisibilityProvider mVisibilityProvider;
private final NotificationClickNotifier mClickNotifier;
private final Set<String> mSendingKeys = new ArraySet<>();
private Callback mCallback;
@@ -50,11 +49,11 @@ public class SmartReplyController implements Dumpable {
*/
public SmartReplyController(
DumpManager dumpManager,
NotificationEntryManager entryManager,
NotificationVisibilityProvider visibilityProvider,
IStatusBarService statusBarService,
NotificationClickNotifier clickNotifier) {
mBarService = statusBarService;
mEntryManager = entryManager;
mVisibilityProvider = visibilityProvider;
mClickNotifier = clickNotifier;
dumpManager.registerDumpable(this);
}
@@ -84,13 +83,7 @@ public class SmartReplyController implements Dumpable {
public void smartActionClicked(
NotificationEntry entry, int actionIndex, Notification.Action action,
boolean generatedByAssistant) {
// TODO(b/204183781): get this from the current pipeline
final int count = mEntryManager.getActiveNotificationsCount();
final int rank = entry.getRanking().getRank();
NotificationVisibility.NotificationLocation location =
NotificationLogger.getNotificationLocation(entry);
final NotificationVisibility nv = NotificationVisibility.obtain(
entry.getKey(), rank, count, true, location);
final NotificationVisibility nv = mVisibilityProvider.obtain(entry, true);
mClickNotifier.onNotificationActionClick(
entry.getKey(), actionIndex, action, nv, generatedByAssistant);
}

View File

@@ -59,6 +59,7 @@ import com.android.systemui.statusbar.notification.collection.inflation.LowPrior
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.ManagedProfileController;
@@ -102,6 +103,7 @@ public interface StatusBarDependenciesModule {
FeatureFlags featureFlags,
NotificationLockscreenUserManager lockscreenUserManager,
SmartReplyController smartReplyController,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
RemoteInputNotificationRebuilder rebuilder,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
@@ -116,6 +118,7 @@ public interface StatusBarDependenciesModule {
featureFlags,
lockscreenUserManager,
smartReplyController,
visibilityProvider,
notificationEntryManager,
rebuilder,
statusBarOptionalLazy,
@@ -134,6 +137,7 @@ public interface StatusBarDependenciesModule {
Context context,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
Lazy<NotificationShadeWindowController> notificationShadeWindowController,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
MediaArtworkProcessor mediaArtworkProcessor,
KeyguardBypassController keyguardBypassController,
@@ -147,6 +151,7 @@ public interface StatusBarDependenciesModule {
context,
statusBarOptionalLazy,
notificationShadeWindowController,
visibilityProvider,
notificationEntryManager,
mediaArtworkProcessor,
keyguardBypassController,
@@ -174,10 +179,14 @@ public interface StatusBarDependenciesModule {
@Provides
static SmartReplyController provideSmartReplyController(
DumpManager dumpManager,
NotificationEntryManager entryManager,
NotificationVisibilityProvider visibilityProvider,
IStatusBarService statusBarService,
NotificationClickNotifier clickNotifier) {
return new SmartReplyController(dumpManager, entryManager, statusBarService, clickNotifier);
return new SmartReplyController(
dumpManager,
visibilityProvider,
statusBarService,
clickNotifier);
}

View File

@@ -808,11 +808,11 @@ public class NotificationEntryManager implements
* notification doesn't exist.
*/
public NotificationEntry getPendingOrActiveNotif(String key) {
if (mPendingNotifications.containsKey(key)) {
return mPendingNotifications.get(key);
} else {
return mActiveNotifications.get(key);
NotificationEntry entry = mPendingNotifications.get(key);
if (entry != null) {
return entry;
}
return mActiveNotifications.get(key);
}
private void extendLifetime(NotificationEntry entry, NotificationLifetimeExtender extender) {
@@ -946,6 +946,12 @@ public class NotificationEntryManager implements
return mReadOnlyAllNotifications;
}
@Nullable
@Override
public NotificationEntry getEntry(String key) {
return getPendingOrActiveNotif(key);
}
/** @return A count of the active notifications */
public int getActiveNotificationsCount() {
return mReadOnlyNotifications.size();

View File

@@ -16,8 +16,6 @@
package com.android.systemui.statusbar.notification.collection;
import android.os.Handler;
import androidx.annotation.Nullable;
import com.android.systemui.dagger.SysUISingleton;
@@ -108,6 +106,7 @@ public class NotifPipeline implements CommonNotifCollection {
/**
* Returns the NotificationEntry associated with [key].
*/
@Override
@Nullable
public NotificationEntry getEntry(String key) {
return mNotifCollection.getEntry(key);

View File

@@ -134,7 +134,7 @@ public class BubbleCoordinator implements Coordinator {
mInterceptedDismissalEntries.remove(entry.getKey());
mOnEndDismissInterception.onEndDismissInterception(mDismissInterceptor, entry,
dismissedByUserStats);
} else if (mNotifPipeline.getAllNotifs().contains(entry)) {
} else if (mNotifPipeline.getEntry(entry.getKey()) != null) {
// Bubbles are hiding the notifications from the shade, but the bubble was
// deleted; therefore, the notification should be cancelled as if it were a user
// dismissal (this won't re-enter handleInterceptDimissal because Bubbles

View File

@@ -23,15 +23,13 @@ import android.os.SystemClock;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationStats;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.coordinator.VisualStabilityCoordinator;
import com.android.systemui.statusbar.notification.collection.notifcollection.DismissedByUserStats;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -40,7 +38,7 @@ import com.android.systemui.statusbar.policy.HeadsUpManager;
* information about the interaction to the notification pipeline.
*/
public class OnUserInteractionCallbackImpl implements OnUserInteractionCallback {
private final NotifPipeline mNotifPipeline;
private final NotificationVisibilityProvider mVisibilityProvider;
private final NotifCollection mNotifCollection;
private final HeadsUpManager mHeadsUpManager;
private final StatusBarStateController mStatusBarStateController;
@@ -48,14 +46,14 @@ public class OnUserInteractionCallbackImpl implements OnUserInteractionCallback
private final GroupMembershipManager mGroupMembershipManager;
public OnUserInteractionCallbackImpl(
NotifPipeline notifPipeline,
NotificationVisibilityProvider visibilityProvider,
NotifCollection notifCollection,
HeadsUpManager headsUpManager,
StatusBarStateController statusBarStateController,
VisualStabilityCoordinator visualStabilityCoordinator,
GroupMembershipManager groupMembershipManager
) {
mNotifPipeline = notifPipeline;
mVisibilityProvider = visibilityProvider;
mNotifCollection = notifCollection;
mHeadsUpManager = headsUpManager;
mStatusBarStateController = statusBarStateController;
@@ -91,12 +89,7 @@ public class OnUserInteractionCallbackImpl implements OnUserInteractionCallback
new DismissedByUserStats(
dismissalSurface,
DISMISS_SENTIMENT_NEUTRAL,
NotificationVisibility.obtain(
entry.getKey(),
entry.getRanking().getRank(),
mNotifPipeline.getShadeListCount(),
true,
NotificationLogger.getNotificationLocation(entry)))
mVisibilityProvider.obtain(entry, true))
);
}

View File

@@ -0,0 +1,50 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.notification.collection.legacy
import com.android.internal.statusbar.NotificationVisibility
import com.android.systemui.statusbar.notification.NotificationEntryManager
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider
import com.android.systemui.statusbar.notification.logging.NotificationLogger
import javax.inject.Inject
/** Legacy pipeline implementation for getting [NotificationVisibility]. */
class LegacyNotificationVisibilityProvider @Inject constructor(
private val notifEntryManager: NotificationEntryManager
) : NotificationVisibilityProvider {
override fun obtain(entry: NotificationEntry, visible: Boolean): NotificationVisibility {
val count: Int = notifEntryManager.activeNotificationsCount
val rank = entry.ranking.rank
val hasRow = entry.row != null
val location = NotificationLogger.getNotificationLocation(entry)
return NotificationVisibility.obtain(entry.key, rank, count, visible && hasRow, location)
}
override fun obtain(key: String, visible: Boolean): NotificationVisibility {
val entry: NotificationEntry? = notifEntryManager.getActiveNotificationUnfiltered(key)
val count: Int = notifEntryManager.activeNotificationsCount
val rank = entry?.ranking?.rank ?: -1
val hasRow = entry?.row != null
val location = NotificationLogger.getNotificationLocation(entry)
return NotificationVisibility.obtain(key, rank, count, visible && hasRow, location)
}
override fun getLocation(key: String): NotificationVisibility.NotificationLocation =
NotificationLogger.getNotificationLocation(
notifEntryManager.getActiveNotificationUnfiltered(key))
}

View File

@@ -22,13 +22,12 @@ import android.annotation.Nullable;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationStats;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.DismissedByUserStats;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -37,6 +36,7 @@ import com.android.systemui.statusbar.policy.HeadsUpManager;
*/
public class OnUserInteractionCallbackImplLegacy implements OnUserInteractionCallback {
private final NotificationEntryManager mNotificationEntryManager;
private final NotificationVisibilityProvider mVisibilityProvider;
private final HeadsUpManager mHeadsUpManager;
private final StatusBarStateController mStatusBarStateController;
private final VisualStabilityManager mVisualStabilityManager;
@@ -44,12 +44,14 @@ public class OnUserInteractionCallbackImplLegacy implements OnUserInteractionCal
public OnUserInteractionCallbackImplLegacy(
NotificationEntryManager notificationEntryManager,
NotificationVisibilityProvider visibilityProvider,
HeadsUpManager headsUpManager,
StatusBarStateController statusBarStateController,
VisualStabilityManager visualStabilityManager,
GroupMembershipManager groupMembershipManager
) {
mNotificationEntryManager = notificationEntryManager;
mVisibilityProvider = visibilityProvider;
mHeadsUpManager = headsUpManager;
mStatusBarStateController = statusBarStateController;
mVisualStabilityManager = visualStabilityManager;
@@ -88,12 +90,7 @@ public class OnUserInteractionCallbackImplLegacy implements OnUserInteractionCal
new DismissedByUserStats(
dismissalSurface,
DISMISS_SENTIMENT_NEUTRAL,
NotificationVisibility.obtain(
entry.getKey(),
entry.getRanking().getRank(),
mNotificationEntryManager.getActiveNotificationsCount(),
true,
NotificationLogger.getNotificationLocation(entry))),
mVisibilityProvider.obtain(entry, true)),
cancellationReason
);

View File

@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.notification.collection.notifcollection;
import androidx.annotation.Nullable;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -45,4 +47,10 @@ public interface CommonNotifCollection {
* The returned collection is read-only, unsorted, unfiltered, and ungrouped.
*/
Collection<NotificationEntry> getAllNotifs();
/**
* Returns the notification entry for the given notification key;
* the returned entry (if present) may be in any state.
*/
@Nullable NotificationEntry getEntry(String key);
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.notification.collection.render
import com.android.internal.statusbar.NotificationVisibility
import com.android.systemui.statusbar.notification.collection.NotificationEntry
/**
* An interface for getting the current [NotificationVisibility] object for a notification.
*/
interface NotificationVisibilityProvider {
/** Given a notification entry, return the visibility object */
fun obtain(entry: NotificationEntry, visible: Boolean): NotificationVisibility
/** Given a notification key, return the visibility object */
fun obtain(key: String, visible: Boolean): NotificationVisibility
/** Given a notification key, return the location */
fun getLocation(key: String): NotificationVisibility.NotificationLocation
}

View File

@@ -0,0 +1,43 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.notification.collection.render
import com.android.internal.statusbar.NotificationVisibility
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.logging.NotificationLogger
import javax.inject.Inject
/** New pipeline implementation for getting [NotificationVisibility]. */
class NotificationVisibilityProviderImpl @Inject constructor(
private val notifPipeline: NotifPipeline
) : NotificationVisibilityProvider {
override fun obtain(entry: NotificationEntry, visible: Boolean): NotificationVisibility {
val count: Int = notifPipeline.getShadeListCount()
val rank = entry.ranking.rank
val hasRow = entry.row != null
val location = NotificationLogger.getNotificationLocation(entry)
return NotificationVisibility.obtain(entry.key, rank, count, visible && hasRow, location)
}
override fun obtain(key: String, visible: Boolean): NotificationVisibility =
notifPipeline.getEntry(key)?.let { return obtain(it, visible) }
?: NotificationVisibility.obtain(key, -1, notifPipeline.getShadeListCount(), false)
override fun getLocation(key: String): NotificationVisibility.NotificationLocation =
NotificationLogger.getNotificationLocation(notifPipeline.getEntry(key))
}

View File

@@ -52,6 +52,7 @@ import com.android.systemui.statusbar.notification.collection.inflation.NotifInf
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
import com.android.systemui.statusbar.notification.collection.inflation.OnUserInteractionCallbackImpl;
import com.android.systemui.statusbar.notification.collection.legacy.LegacyNotificationPresenterExtensions;
import com.android.systemui.statusbar.notification.collection.legacy.LegacyNotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.legacy.OnUserInteractionCallbackImplLegacy;
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
@@ -63,6 +64,8 @@ import com.android.systemui.statusbar.notification.collection.render.GroupMember
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManagerImpl;
import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewManager;
import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProviderImpl;
import com.android.systemui.statusbar.notification.init.NotificationsController;
import com.android.systemui.statusbar.notification.init.NotificationsControllerImpl;
import com.android.systemui.statusbar.notification.init.NotificationsControllerStub;
@@ -208,6 +211,8 @@ public interface NotificationsModule {
static NotificationLogger provideNotificationLogger(
NotificationListener notificationListener,
@UiBackground Executor uiBgExecutor,
FeatureFlags featureFlags,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager entryManager,
StatusBarStateController statusBarStateController,
NotificationLogger.ExpansionStateLogger expansionStateLogger,
@@ -215,6 +220,8 @@ public interface NotificationsModule {
return new NotificationLogger(
notificationListener,
uiBgExecutor,
featureFlags,
visibilityProvider,
entryManager,
statusBarStateController,
expansionStateLogger,
@@ -277,6 +284,20 @@ public interface NotificationsModule {
return featureFlags.isNewNotifPipelineRenderingEnabled() ? pipeline.get() : entryManager;
}
/**
* Provide the object which can be used to obtain NotificationVisibility objects.
*/
@Provides
@SysUISingleton
static NotificationVisibilityProvider provideNotificationVisibilityProvider(
FeatureFlags featureFlags,
Lazy<NotificationVisibilityProviderImpl> newProvider,
Lazy<LegacyNotificationVisibilityProvider> legacyProvider) {
return featureFlags.isNewNotifPipelineRenderingEnabled()
? newProvider.get()
: legacyProvider.get();
}
/**
* Provide the active implementation for presenting notifications.
*/
@@ -301,15 +322,15 @@ public interface NotificationsModule {
FeatureFlags featureFlags,
HeadsUpManager headsUpManager,
StatusBarStateController statusBarStateController,
Lazy<NotifPipeline> pipeline,
Lazy<NotifCollection> notifCollection,
Lazy<NotificationVisibilityProvider> visibilityProvider,
Lazy<VisualStabilityCoordinator> visualStabilityCoordinator,
NotificationEntryManager entryManager,
VisualStabilityManager visualStabilityManager,
Lazy<GroupMembershipManager> groupMembershipManagerLazy) {
return featureFlags.isNewNotifPipelineRenderingEnabled()
? new OnUserInteractionCallbackImpl(
pipeline.get(),
visibilityProvider.get(),
notifCollection.get(),
headsUpManager,
statusBarStateController,
@@ -317,6 +338,7 @@ public interface NotificationsModule {
groupMembershipManagerLazy.get())
: new OnUserInteractionCallbackImplLegacy(
entryManager,
visibilityProvider.get(),
headsUpManager,
statusBarStateController,
visualStabilityManager,

View File

@@ -33,6 +33,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.NotificationListener;
@@ -40,6 +41,7 @@ import com.android.systemui.statusbar.StatusBarState;
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.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
@@ -70,6 +72,8 @@ public class NotificationLogger implements StateListener {
// Dependencies:
private final NotificationListenerService mNotificationListener;
private final Executor mUiBgExecutor;
private final FeatureFlags mFeatureFlags;
private final NotificationVisibilityProvider mVisibilityProvider;
private final NotificationEntryManager mEntryManager;
private final NotificationPanelLogger mNotificationPanelLogger;
private final ExpansionStateLogger mExpansionStateLogger;
@@ -127,6 +131,8 @@ public class NotificationLogger implements StateListener {
// notifications.
// 3. Report newly visible and no-longer visible notifications.
// 4. Keep currently visible notifications for next report.
// TODO(b/204764064): support new pipeline
mFeatureFlags.checkLegacyPipelineEnabled();
List<NotificationEntry> activeNotifications = mEntryManager.getVisibleNotifications();
int N = activeNotifications.size();
for (int i = 0; i < N; i++) {
@@ -202,12 +208,16 @@ public class NotificationLogger implements StateListener {
*/
public NotificationLogger(NotificationListener notificationListener,
@UiBackground Executor uiBgExecutor,
FeatureFlags featureFlags,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager entryManager,
StatusBarStateController statusBarStateController,
ExpansionStateLogger expansionStateLogger,
NotificationPanelLogger notificationPanelLogger) {
mNotificationListener = notificationListener;
mUiBgExecutor = uiBgExecutor;
mFeatureFlags = featureFlags;
mVisibilityProvider = visibilityProvider;
mEntryManager = entryManager;
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
@@ -407,6 +417,8 @@ public class NotificationLogger implements StateListener {
// Once we know panelExpanded and Dozing, turn logging on & off when appropriate
boolean lockscreen = mLockscreen == null ? false : mLockscreen;
if (mPanelExpanded && !mDozing) {
// TODO(b/204764064): support new pipeline
mFeatureFlags.checkLegacyPipelineEnabled();
mNotificationPanelLogger.logPanelShown(lockscreen,
mEntryManager.getVisibleNotifications());
if (DEBUG) {
@@ -440,8 +452,7 @@ public class NotificationLogger implements StateListener {
* Called when the notification is expanded / collapsed.
*/
public void onExpansionChanged(String key, boolean isUserAction, boolean isExpanded) {
NotificationVisibility.NotificationLocation location =
getNotificationLocation(mEntryManager.getActiveNotificationUnfiltered(key));
NotificationVisibility.NotificationLocation location = mVisibilityProvider.getLocation(key);
mExpansionStateLogger.onExpansionChanged(key, isUserAction, isExpanded, location);
}

View File

@@ -58,7 +58,6 @@ import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.ExpandHelper;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
@@ -99,6 +98,7 @@ import com.android.systemui.statusbar.notification.collection.legacy.VisualStabi
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.render.GroupExpansionManager;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
import com.android.systemui.statusbar.notification.dagger.SilentHeader;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
@@ -145,6 +145,7 @@ public class NotificationStackScrollLayoutController {
private final boolean mAllowLongPress;
private final NotificationGutsManager mNotificationGutsManager;
private final NotificationVisibilityProvider mVisibilityProvider;
private final HeadsUpManagerPhone mHeadsUpManager;
private final NotificationRoundnessManager mNotificationRoundnessManager;
private final TunerService mTunerService;
@@ -618,6 +619,7 @@ public class NotificationStackScrollLayoutController {
public NotificationStackScrollLayoutController(
@Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress,
NotificationGutsManager notificationGutsManager,
NotificationVisibilityProvider visibilityProvider,
HeadsUpManagerPhone headsUpManager,
NotificationRoundnessManager notificationRoundnessManager,
TunerService tunerService,
@@ -655,6 +657,7 @@ public class NotificationStackScrollLayoutController {
ShadeController shadeController) {
mAllowLongPress = allowLongPress;
mNotificationGutsManager = notificationGutsManager;
mVisibilityProvider = visibilityProvider;
mHeadsUpManager = headsUpManager;
mNotificationRoundnessManager = notificationRoundnessManager;
mTunerService = tunerService;
@@ -1384,19 +1387,11 @@ public class NotificationStackScrollLayoutController {
mView.resetCheckSnoozeLeavebehind();
}
private DismissedByUserStats getDismissedByUserStats(
NotificationEntry entry,
int numVisibleEntries
) {
private DismissedByUserStats getDismissedByUserStats(NotificationEntry entry) {
return new DismissedByUserStats(
DISMISSAL_SHADE,
DISMISS_SENTIMENT_NEUTRAL,
NotificationVisibility.obtain(
entry.getKey(),
entry.getRanking().getRank(),
numVisibleEntries,
true,
NotificationLogger.getNotificationLocation(entry)));
mVisibilityProvider.obtain(entry, true));
}
/**
@@ -1447,13 +1442,10 @@ public class NotificationStackScrollLayoutController {
} else {
final List<Pair<NotificationEntry, DismissedByUserStats>>
entriesWithRowsDismissedFromShade = new ArrayList<>();
final int numVisibleEntries = mNotifPipeline.getShadeListCount();
for (ExpandableNotificationRow row : viewsToRemove) {
final NotificationEntry entry = row.getEntry();
entriesWithRowsDismissedFromShade.add(
new Pair<>(
entry,
getDismissedByUserStats(entry, numVisibleEntries)));
new Pair<>(entry, getDismissedByUserStats(entry)));
}
mNotifCollection.dismissNotifications(entriesWithRowsDismissedFromShade);
}
@@ -1462,9 +1454,7 @@ public class NotificationStackScrollLayoutController {
if (canChildBeDismissed(rowToRemove)) {
mNotificationEntryManager.performRemoveNotification(
rowToRemove.getEntry().getSbn(),
getDismissedByUserStats(
rowToRemove.getEntry(),
mNotificationEntryManager.getActiveNotificationsCount()),
getDismissedByUserStats(rowToRemove.getEntry()),
NotificationListenerService.REASON_CANCEL_ALL);
} else {
rowToRemove.resetTranslation();

View File

@@ -68,8 +68,8 @@ import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowDragController;
import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
@@ -97,6 +97,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
private final NotificationEntryManager mEntryManager;
private final NotifPipeline mNotifPipeline;
private final NotificationVisibilityProvider mVisibilityProvider;
private final HeadsUpManagerPhone mHeadsUpManager;
private final ActivityStarter mActivityStarter;
private final NotificationClickNotifier mClickNotifier;
@@ -136,6 +137,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
Executor uiBgExecutor,
NotificationEntryManager entryManager,
NotifPipeline notifPipeline,
NotificationVisibilityProvider visibilityProvider,
HeadsUpManagerPhone headsUpManager,
ActivityStarter activityStarter,
NotificationClickNotifier clickNotifier,
@@ -171,6 +173,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
mUiBgExecutor = uiBgExecutor;
mEntryManager = entryManager;
mNotifPipeline = notifPipeline;
mVisibilityProvider = visibilityProvider;
mHeadsUpManager = headsUpManager;
mActivityStarter = activityStarter;
mClickNotifier = clickNotifier;
@@ -366,10 +369,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
mAssistManagerLazy.get().hideAssist();
}
NotificationVisibility.NotificationLocation location =
NotificationLogger.getNotificationLocation(entry);
final NotificationVisibility nv = NotificationVisibility.obtain(entry.getKey(),
entry.getRanking().getRank(), getVisibleNotificationsCount(), true, location);
final NotificationVisibility nv = mVisibilityProvider.obtain(entry, true);
// retrieve the group summary to remove with this entry before we tell NMS the
// notification was clicked to avoid a race condition
@@ -414,10 +414,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
public void onDragSuccess(NotificationEntry entry) {
// this method is not responsible for intent sending.
// will focus follow operation only after drag-and-drop that notification.
NotificationVisibility.NotificationLocation location =
NotificationLogger.getNotificationLocation(entry);
final NotificationVisibility nv = NotificationVisibility.obtain(entry.getKey(),
entry.getRanking().getRank(), getVisibleNotificationsCount(), true, location);
final NotificationVisibility nv = mVisibilityProvider.obtain(entry, true);
// retrieve the group summary to remove with this entry before we tell NMS the
// notification was clicked to avoid a race condition
@@ -681,6 +678,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
private final Executor mUiBgExecutor;
private final NotificationEntryManager mEntryManager;
private final NotifPipeline mNotifPipeline;
private final NotificationVisibilityProvider mVisibilityProvider;
private final HeadsUpManagerPhone mHeadsUpManager;
private final ActivityStarter mActivityStarter;
private final NotificationClickNotifier mClickNotifier;
@@ -719,6 +717,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
@UiBackground Executor uiBgExecutor,
NotificationEntryManager entryManager,
NotifPipeline notifPipeline,
NotificationVisibilityProvider visibilityProvider,
HeadsUpManagerPhone headsUpManager,
ActivityStarter activityStarter,
NotificationClickNotifier clickNotifier,
@@ -749,6 +748,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
mUiBgExecutor = uiBgExecutor;
mEntryManager = entryManager;
mNotifPipeline = notifPipeline;
mVisibilityProvider = visibilityProvider;
mHeadsUpManager = headsUpManager;
mActivityStarter = activityStarter;
mClickNotifier = clickNotifier;
@@ -813,6 +813,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
mUiBgExecutor,
mEntryManager,
mNotifPipeline,
mVisibilityProvider,
mHeadsUpManager,
mActivityStarter,
mClickNotifier,

View File

@@ -76,8 +76,8 @@ import com.android.systemui.statusbar.notification.collection.coordinator.Bubble
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
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.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -109,6 +109,7 @@ public class BubblesManager implements Dumpable {
private final ShadeController mShadeController;
private final IStatusBarService mBarService;
private final INotificationManager mNotificationManager;
private final NotificationVisibilityProvider mVisibilityProvider;
private final NotificationInterruptStateProvider mNotificationInterruptStateProvider;
private final NotificationGroupManagerLegacy mNotificationGroupManager;
private final NotificationEntryManager mNotificationEntryManager;
@@ -132,6 +133,7 @@ public class BubblesManager implements Dumpable {
ConfigurationController configurationController,
@Nullable IStatusBarService statusBarService,
INotificationManager notificationManager,
NotificationVisibilityProvider visibilityProvider,
NotificationInterruptStateProvider interruptionStateProvider,
ZenModeController zenModeController,
NotificationLockscreenUserManager notifUserManager,
@@ -146,6 +148,7 @@ public class BubblesManager implements Dumpable {
return new BubblesManager(context, bubblesOptional.get(),
notificationShadeWindowController, statusBarStateController, shadeController,
configurationController, statusBarService, notificationManager,
visibilityProvider,
interruptionStateProvider, zenModeController, notifUserManager,
groupManager, entryManager, notifPipeline, sysUiState, featureFlags,
dumpManager, sysuiMainExecutor);
@@ -163,6 +166,7 @@ public class BubblesManager implements Dumpable {
ConfigurationController configurationController,
@Nullable IStatusBarService statusBarService,
INotificationManager notificationManager,
NotificationVisibilityProvider visibilityProvider,
NotificationInterruptStateProvider interruptionStateProvider,
ZenModeController zenModeController,
NotificationLockscreenUserManager notifUserManager,
@@ -178,6 +182,7 @@ public class BubblesManager implements Dumpable {
mNotificationShadeWindowController = notificationShadeWindowController;
mShadeController = shadeController;
mNotificationManager = notificationManager;
mVisibilityProvider = visibilityProvider;
mNotificationInterruptStateProvider = interruptionStateProvider;
mNotificationGroupManager = groupManager;
mNotificationEntryManager = entryManager;
@@ -598,12 +603,7 @@ public class BubblesManager implements Dumpable {
return new DismissedByUserStats(
DISMISSAL_BUBBLE,
DISMISS_SENTIMENT_NEUTRAL,
NotificationVisibility.obtain(
entry.getKey(),
entry.getRanking().getRank(),
mNotificationEntryManager.getActiveNotificationsCount(),
isVisible,
NotificationLogger.getNotificationLocation(entry)));
mVisibilityProvider.obtain(entry, isVisible));
}
/**

View File

@@ -21,7 +21,9 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -43,8 +45,9 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubble;
@@ -76,7 +79,9 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
private LaunchConversationActivity mActivity;
@Mock
private NotificationEntryManager mNotificationEntryManager;
private NotificationVisibilityProvider mVisibilityProvider;
@Mock
private CommonNotifCollection mNotifCollection;
@Mock
private IStatusBarService mIStatusBarService;
@Mock
@@ -104,8 +109,13 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mActivity = new LaunchConversationActivity(mNotificationEntryManager,
Optional.of(mBubblesManager), mUserManager, mCommandQueue);
mActivity = new LaunchConversationActivity(
mVisibilityProvider,
mNotifCollection,
Optional.of(mBubblesManager),
mUserManager,
mCommandQueue
);
verify(mCommandQueue, times(1)).addCallback(mCallbacksCaptor.capture());
mActivity.setIsForTesting(true, mIStatusBarService);
@@ -114,19 +124,26 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
mIntent.putExtra(PeopleSpaceWidgetProvider.EXTRA_PACKAGE_NAME, PACKAGE_NAME);
mIntent.putExtra(PeopleSpaceWidgetProvider.EXTRA_USER_HANDLE, USER_HANDLE);
when(mNotificationEntryManager.getActiveNotificationsCount()).thenReturn(NOTIF_COUNT);
when(mNotificationEntryManager.getPendingOrActiveNotif(NOTIF_KEY)).thenReturn(mNotifEntry);
when(mNotificationEntryManager.getPendingOrActiveNotif(NOTIF_KEY_NO_ENTRY))
.thenReturn(null);
when(mNotificationEntryManager.getPendingOrActiveNotif(NOTIF_KEY_NO_RANKING))
.thenReturn(mNotifEntryNoRanking);
when(mNotificationEntryManager.getPendingOrActiveNotif(NOTIF_KEY_CAN_BUBBLE))
.thenReturn(mNotifEntryCanBubble);
when(mNotifCollection.getEntry(NOTIF_KEY)).thenReturn(mNotifEntry);
when(mNotifCollection.getEntry(NOTIF_KEY_NO_ENTRY)).thenReturn(null);
when(mNotifCollection.getEntry(NOTIF_KEY_NO_RANKING)).thenReturn(mNotifEntryNoRanking);
when(mNotifCollection.getEntry(NOTIF_KEY_CAN_BUBBLE)).thenReturn(mNotifEntryCanBubble);
when(mVisibilityProvider.obtain(anyString(), anyBoolean())).thenAnswer(
invocation-> {
String key = invocation.getArgument(0);
boolean visible = invocation.getArgument(1);
return NotificationVisibility.obtain(key, NOTIF_RANK, NOTIF_COUNT, visible);
});
when(mVisibilityProvider.obtain(any(NotificationEntry.class), anyBoolean())).thenAnswer(
invocation-> {
String key = invocation.<NotificationEntry>getArgument(0).getKey();
boolean visible = invocation.getArgument(1);
return NotificationVisibility.obtain(key, NOTIF_RANK, NOTIF_COUNT, visible);
});
when(mNotifEntry.getRanking()).thenReturn(mRanking);
when(mNotifEntryCanBubble.getRanking()).thenReturn(mRanking);
when(mNotifEntryCanBubble.canBubble()).thenReturn(true);
when(mNotifEntryNoRanking.getRanking()).thenReturn(null);
when(mRanking.getRank()).thenReturn(NOTIF_RANK);
when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false);
}
@@ -173,8 +190,12 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
assertThat(mActivity.isFinishing()).isTrue();
mCallbacksCaptor.getValue().appTransitionFinished(DEFAULT_DISPLAY);
// Ensure callback removed
verify(mCommandQueue).removeCallback(any());
// Clear the notification for bubbles.
verify(mIStatusBarService, times(1)).onNotificationClear(any(),
anyInt(), any(), anyInt(), anyInt(), mNotificationVisibilityCaptor.capture());
// Do not select the bubble.
verify(mBubblesManager, never()).expandStackAndSelectBubble(any(Bubble.class));
verify(mBubblesManager, never()).expandStackAndSelectBubble(any(NotificationEntry.class));
@@ -194,6 +215,8 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
assertThat(mActivity.isFinishing()).isTrue();
mCallbacksCaptor.getValue().appTransitionFinished(DEFAULT_DISPLAY);
// Ensure callback removed
verify(mCommandQueue).removeCallback(any());
// Don't clear the notification for bubbles.
verify(mIStatusBarService, never()).onNotificationClear(any(),
anyInt(), any(), anyInt(), anyInt(), any());
@@ -211,10 +234,14 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
mActivity.onCreate(new Bundle());
assertThat(mActivity.isFinishing()).isTrue();
mCommandQueue.appTransitionFinished(DEFAULT_DISPLAY);
mCallbacksCaptor.getValue().appTransitionFinished(DEFAULT_DISPLAY);
// Ensure callback removed
verify(mCommandQueue).removeCallback(any());
// Don't clear the notification for bubbles.
verify(mIStatusBarService, never()).onNotificationClear(any(),
anyInt(), any(), anyInt(), anyInt(), any());
// Do not select the bubble.
verify(mBubblesManager, never()).expandStackAndSelectBubble(any(Bubble.class));
verify(mBubblesManager, never()).expandStackAndSelectBubble(any(NotificationEntry.class));
}
@@ -233,6 +260,9 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
assertThat(mActivity.isFinishing()).isTrue();
mCallbacksCaptor.getValue().appTransitionFinished(DEFAULT_DISPLAY);
// Ensure callback removed
verify(mCommandQueue).removeCallback(any());
// Select the bubble.
verify(mBubblesManager, times(1)).expandStackAndSelectBubble(eq(bubble));
}
}

View File

@@ -57,11 +57,13 @@ import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager.KeyguardNotificationSuppressor;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -84,6 +86,8 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase {
// Dependency mocks:
@Mock
private NotificationVisibilityProvider mVisibilityProvider;
@Mock
private NotificationEntryManager mEntryManager;
@Mock
private DevicePolicyManager mDevicePolicyManager;
@@ -96,6 +100,8 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase {
@Mock
private StatusBarStateController mStatusBarStateController;
@Mock
private FeatureFlags mFeatureFlags;
@Mock
private BroadcastDispatcher mBroadcastDispatcher;
@Mock
private KeyguardStateController mKeyguardStateController;
@@ -416,9 +422,11 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase {
public TestNotificationLockscreenUserManager(Context context) {
super(
context,
mFeatureFlags,
mBroadcastDispatcher,
mDevicePolicyManager,
mUserManager,
(() -> mVisibilityProvider),
mClickNotifier,
NotificationLockscreenUserManagerTest.this.mKeyguardManager,
mStatusBarStateController,

View File

@@ -47,6 +47,7 @@ import com.android.systemui.statusbar.NotificationRemoteInputManager.LegacyRemot
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
@@ -70,7 +71,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
private static final String TEST_PACKAGE_NAME = "test";
private static final int TEST_UID = 0;
@Mock private NotificationPresenter mPresenter;
@Mock private NotificationVisibilityProvider mVisibilityProvider;
@Mock private RemoteInputController.Delegate mDelegate;
@Mock private NotificationRemoteInputManager.Callback mCallback;
@Mock private RemoteInputController mController;
@@ -101,6 +102,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
mock(FeatureFlags.class),
mLockscreenUserManager,
mSmartReplyController,
mVisibilityProvider,
mEntryManager,
mock(RemoteInputNotificationRebuilder.class),
() -> Optional.of(mock(StatusBar.class)),
@@ -191,6 +193,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
FeatureFlags featureFlags,
NotificationLockscreenUserManager lockscreenUserManager,
SmartReplyController smartReplyController,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
RemoteInputNotificationRebuilder rebuilder,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
@@ -205,6 +208,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
featureFlags,
lockscreenUserManager,
smartReplyController,
visibilityProvider,
notificationEntryManager,
rebuilder,
statusBarOptionalLazy,

View File

@@ -44,6 +44,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
@@ -71,7 +72,7 @@ public class SmartReplyControllerTest extends SysuiTestCase {
private SmartReplyController mSmartReplyController;
private NotificationRemoteInputManager mRemoteInputManager;
@Mock private NotificationPresenter mPresenter;
@Mock private NotificationVisibilityProvider mVisibilityProvider;
@Mock private RemoteInputController.Delegate mDelegate;
@Mock private NotificationRemoteInputManager.Callback mCallback;
@Mock private StatusBarNotification mSbn;
@@ -89,7 +90,7 @@ public class SmartReplyControllerTest extends SysuiTestCase {
mSmartReplyController = new SmartReplyController(
mock(DumpManager.class),
mNotificationEntryManager,
mVisibilityProvider,
mIStatusBarService,
mClickNotifier);
mDependency.injectTestDependency(SmartReplyController.class,
@@ -97,7 +98,9 @@ public class SmartReplyControllerTest extends SysuiTestCase {
mRemoteInputManager = new NotificationRemoteInputManager(mContext,
mock(FeatureFlags.class),
mock(NotificationLockscreenUserManager.class), mSmartReplyController,
mock(NotificationLockscreenUserManager.class),
mSmartReplyController,
mVisibilityProvider,
mNotificationEntryManager,
new RemoteInputNotificationRebuilder(mContext),
() -> Optional.of(mock(StatusBar.class)),

View File

@@ -41,6 +41,7 @@ import com.android.internal.logging.InstanceId;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateControllerImpl;
@@ -48,6 +49,7 @@ 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.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.logging.nano.Notifications;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
@@ -81,6 +83,8 @@ public class NotificationLoggerTest extends SysuiTestCase {
@Mock private NotificationLogger.ExpansionStateLogger mExpansionStateLogger;
// Dependency mocks:
@Mock private FeatureFlags mFeatureFlags;
@Mock private NotificationVisibilityProvider mVisibilityProvider;
@Mock private NotificationEntryManager mEntryManager;
@Mock private NotificationListener mListener;
@Captor private ArgumentCaptor<NotificationEntryListener> mEntryListenerCaptor;
@@ -108,9 +112,16 @@ public class NotificationLoggerTest extends SysuiTestCase {
.build();
mEntry.setRow(mRow);
mLogger = new TestableNotificationLogger(mListener, mUiBgExecutor,
mEntryManager, mock(StatusBarStateControllerImpl.class), mBarService,
mExpansionStateLogger);
mLogger = new TestableNotificationLogger(
mListener,
mUiBgExecutor,
mFeatureFlags,
mVisibilityProvider,
mEntryManager,
mock(StatusBarStateControllerImpl.class),
mBarService,
mExpansionStateLogger
);
mLogger.setUpWithContainer(mListContainer);
verify(mEntryManager).addNotificationEntryListener(mEntryListenerCaptor.capture());
}
@@ -244,12 +255,22 @@ public class NotificationLoggerTest extends SysuiTestCase {
TestableNotificationLogger(NotificationListener notificationListener,
Executor uiBgExecutor,
FeatureFlags featureFlags,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager entryManager,
StatusBarStateControllerImpl statusBarStateController,
IStatusBarService barService,
ExpansionStateLogger expansionStateLogger) {
super(notificationListener, uiBgExecutor, entryManager, statusBarStateController,
expansionStateLogger, mNotificationPanelLoggerFake);
super(
notificationListener,
uiBgExecutor,
featureFlags,
visibilityProvider,
entryManager,
statusBarStateController,
expansionStateLogger,
mNotificationPanelLoggerFake
);
mBarService = barService;
// Make this on the current thread so we can wait for it during tests.
mHandler = Handler.createAsync(Looper.myLooper());

View File

@@ -64,6 +64,7 @@ import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ForegroundServiceDungeonView;
@@ -97,6 +98,7 @@ import org.mockito.MockitoAnnotations;
public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase {
@Mock private NotificationGutsManager mNotificationGutsManager;
@Mock private NotificationVisibilityProvider mVisibilityProvider;
@Mock private HeadsUpManagerPhone mHeadsUpManager;
@Mock private NotificationRoundnessManager mNotificationRoundnessManager;
@Mock private TunerService mTunerService;
@@ -151,6 +153,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase {
mController = new NotificationStackScrollLayoutController(
true,
mNotificationGutsManager,
mVisibilityProvider,
mHeadsUpManager,
mNotificationRoundnessManager,
mTunerService,

View File

@@ -22,6 +22,7 @@ import static org.mockito.AdditionalAnswers.answerVoid;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
@@ -68,6 +69,7 @@ import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorCon
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
@@ -123,6 +125,8 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
private FeatureFlags mFeatureFlags;
@Mock
private NotifPipeline mNotifPipeline;
@Mock
private NotificationVisibilityProvider mVisibilityProvider;
@Mock
private ActivityIntentHelper mActivityIntentHelper;
@@ -179,6 +183,11 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
when(mFeatureFlags.isNewNotifPipelineRenderingEnabled()).thenReturn(false);
when(mOnUserInteractionCallback.getGroupSummaryToDismiss(mNotificationRow.getEntry()))
.thenReturn(null);
when(mVisibilityProvider.obtain(anyString(), anyBoolean())).thenAnswer(
invocation-> NotificationVisibility.obtain(invocation.getArgument(0), 0, 1, false));
when(mVisibilityProvider.obtain(any(NotificationEntry.class), anyBoolean())).thenAnswer(
invocation-> NotificationVisibility.obtain(
invocation.<NotificationEntry>getArgument(0).getKey(), 0, 1, false));
HeadsUpManagerPhone headsUpManager = mock(HeadsUpManagerPhone.class);
NotificationLaunchAnimatorControllerProvider notificationAnimationProvider =
@@ -195,6 +204,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
mUiBgExecutor,
mEntryManager,
mNotifPipeline,
mVisibilityProvider,
headsUpManager,
mActivityStarter,
mClickNotifier,

View File

@@ -121,6 +121,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.init.NotificationsController;
import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl;
@@ -272,6 +273,7 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private StatusBarIconController mIconController;
@Mock private LockscreenShadeTransitionController mLockscreenTransitionController;
@Mock private FeatureFlags mFeatureFlags;
@Mock private NotificationVisibilityProvider mVisibilityProvider;
@Mock private WallpaperManager mWallpaperManager;
@Mock private IWallpaperManager mIWallpaperManager;
@Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
@@ -309,9 +311,16 @@ public class StatusBarTest extends SysuiTestCase {
mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
mMetricsLogger = new FakeMetricsLogger();
NotificationLogger notificationLogger = new NotificationLogger(mNotificationListener,
mUiBgExecutor, mock(NotificationEntryManager.class), mStatusBarStateController,
mExpansionStateLogger, new NotificationPanelLoggerFake());
NotificationLogger notificationLogger = new NotificationLogger(
mNotificationListener,
mUiBgExecutor,
mFeatureFlags,
mVisibilityProvider,
mock(NotificationEntryManager.class),
mStatusBarStateController,
mExpansionStateLogger,
new NotificationPanelLoggerFake()
);
notificationLogger.setVisibilityReporter(mock(Runnable.class));
when(mCommandQueue.asBinder()).thenReturn(new Binder());

View File

@@ -92,6 +92,7 @@ import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
import com.android.systemui.statusbar.phone.DozeParameters;
@@ -228,6 +229,8 @@ public class BubblesTest extends SysuiTestCase {
@Mock
private IStatusBarService mStatusBarService;
@Mock
private NotificationVisibilityProvider mVisibilityProvider;
@Mock
private LauncherApps mLauncherApps;
@Mock
private WindowManagerShellWrapper mWindowManagerShellWrapper;
@@ -354,6 +357,7 @@ public class BubblesTest extends SysuiTestCase {
mConfigurationController,
mStatusBarService,
mock(INotificationManager.class),
mVisibilityProvider,
interruptionStateProvider,
mZenModeController,
mLockscreenUserManager,

View File

@@ -78,6 +78,7 @@ import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
import com.android.systemui.statusbar.phone.DozeParameters;
@@ -204,6 +205,8 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
@Mock
private IStatusBarService mStatusBarService;
@Mock
private NotificationVisibilityProvider mVisibilityProvider;
@Mock
private LauncherApps mLauncherApps;
@Mock
private WindowManagerShellWrapper mWindowManagerShellWrapper;
@@ -319,6 +322,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mConfigurationController,
mStatusBarService,
mock(INotificationManager.class),
mVisibilityProvider,
interruptionStateProvider,
mZenModeController,
mLockscreenUserManager,