Merge "Interface for notification collection being used"
This commit is contained in:
committed by
Android (Google) Code Review
commit
2b3feba757
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification;
|
||||
import static android.service.notification.NotificationListenerService.REASON_CANCEL;
|
||||
import static android.service.notification.NotificationListenerService.REASON_ERROR;
|
||||
|
||||
import static com.android.systemui.statusbar.notification.collection.NotifCollection.REASON_UNKNOWN;
|
||||
import static com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.InflationCallback;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
@@ -44,6 +45,8 @@ import com.android.systemui.statusbar.NotificationUiAdjustment;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationRankingManager;
|
||||
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
|
||||
import com.android.systemui.statusbar.notification.logging.NotifEvent;
|
||||
import com.android.systemui.statusbar.notification.logging.NotifLog;
|
||||
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
|
||||
@@ -96,6 +99,7 @@ import dagger.Lazy;
|
||||
*/
|
||||
@Singleton
|
||||
public class NotificationEntryManager implements
|
||||
CommonNotifCollection,
|
||||
Dumpable,
|
||||
InflationCallback,
|
||||
VisualStabilityManager.Callback {
|
||||
@@ -130,6 +134,7 @@ public class NotificationEntryManager implements
|
||||
private final Lazy<NotificationRowBinder> mNotificationRowBinderLazy;
|
||||
private final Lazy<NotificationRemoteInputManager> mRemoteInputManagerLazy;
|
||||
private final LeakDetector mLeakDetector;
|
||||
private final List<NotifCollectionListener> mNotifCollectionListeners = new ArrayList<>();
|
||||
|
||||
private final KeyguardEnvironment mKeyguardEnvironment;
|
||||
private final NotificationGroupManager mGroupManager;
|
||||
@@ -488,6 +493,13 @@ public class NotificationEntryManager implements
|
||||
for (NotificationEntryListener listener : mNotificationEntryListeners) {
|
||||
listener.onEntryRemoved(entry, visibility, removedByUser);
|
||||
}
|
||||
for (NotifCollectionListener listener : mNotifCollectionListeners) {
|
||||
// NEM doesn't have a good knowledge of reasons so defaulting to unknown.
|
||||
listener.onEntryRemoved(entry, REASON_UNKNOWN);
|
||||
}
|
||||
for (NotifCollectionListener listener : mNotifCollectionListeners) {
|
||||
listener.onEntryCleanUp(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -553,6 +565,10 @@ public class NotificationEntryManager implements
|
||||
|
||||
mLeakDetector.trackInstance(entry);
|
||||
|
||||
for (NotifCollectionListener listener : mNotifCollectionListeners) {
|
||||
listener.onEntryInit(entry);
|
||||
}
|
||||
|
||||
// Construct the expanded view.
|
||||
if (!mFeatureFlags.isNewNotifPipelineRenderingEnabled()) {
|
||||
mNotificationRowBinderLazy.get()
|
||||
@@ -566,6 +582,9 @@ public class NotificationEntryManager implements
|
||||
for (NotificationEntryListener listener : mNotificationEntryListeners) {
|
||||
listener.onPendingEntryAdded(entry);
|
||||
}
|
||||
for (NotifCollectionListener listener : mNotifCollectionListeners) {
|
||||
listener.onEntryAdded(entry);
|
||||
}
|
||||
}
|
||||
|
||||
public void addNotification(StatusBarNotification notification, RankingMap ranking) {
|
||||
@@ -600,6 +619,9 @@ public class NotificationEntryManager implements
|
||||
for (NotificationEntryListener listener : mNotificationEntryListeners) {
|
||||
listener.onPreEntryUpdated(entry);
|
||||
}
|
||||
for (NotifCollectionListener listener : mNotifCollectionListeners) {
|
||||
listener.onEntryUpdated(entry);
|
||||
}
|
||||
|
||||
if (!mFeatureFlags.isNewNotifPipelineRenderingEnabled()) {
|
||||
mNotificationRowBinderLazy.get()
|
||||
@@ -674,6 +696,9 @@ public class NotificationEntryManager implements
|
||||
for (NotificationEntryListener listener : mNotificationEntryListeners) {
|
||||
listener.onNotificationRankingUpdated(rankingMap);
|
||||
}
|
||||
for (NotifCollectionListener listener : mNotifCollectionListeners) {
|
||||
listener.onRankingUpdate(rankingMap);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateRankingOfPendingNotifications(@Nullable RankingMap rankingMap) {
|
||||
@@ -862,6 +887,11 @@ public class NotificationEntryManager implements
|
||||
return mReadOnlyNotifications.size() != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCollectionListener(NotifCollectionListener listener) {
|
||||
mNotifCollectionListeners.add(listener);
|
||||
}
|
||||
|
||||
/*
|
||||
* End annexation
|
||||
* -----
|
||||
|
||||
@@ -23,6 +23,7 @@ import com.android.systemui.statusbar.notification.collection.listbuilder.plugga
|
||||
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
|
||||
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter;
|
||||
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender;
|
||||
|
||||
@@ -66,7 +67,7 @@ import javax.inject.Singleton;
|
||||
* 9. The list is handed off to the view layer to be rendered
|
||||
*/
|
||||
@Singleton
|
||||
public class NotifPipeline {
|
||||
public class NotifPipeline implements CommonNotifCollection {
|
||||
private final NotifCollection mNotifCollection;
|
||||
private final ShadeListBuilder mShadeListBuilder;
|
||||
|
||||
@@ -89,10 +90,7 @@ public class NotifPipeline {
|
||||
return mNotifCollection.getActiveNotifs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a listener to be informed when there is a notification entry event such as an add,
|
||||
* update, or remove.
|
||||
*/
|
||||
@Override
|
||||
public void addCollectionListener(NotifCollectionListener listener) {
|
||||
mNotifCollection.addCollectionListener(listener);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.notifcollection;
|
||||
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
|
||||
/**
|
||||
* A notification collection that manages the list of {@link NotificationEntry}s that will be
|
||||
* rendered.
|
||||
*
|
||||
* TODO: (b/145659174) Once we fully switch off {@link NotificationEntryManager} to
|
||||
* {@link NotifPipeline}, we probably won't need this, but having it for now makes it easy to
|
||||
* switch between the two.
|
||||
*/
|
||||
public interface CommonNotifCollection {
|
||||
/**
|
||||
* Registers a listener to be informed when notifications are created, added, updated, removed,
|
||||
* or deleted.
|
||||
*/
|
||||
void addCollectionListener(NotifCollectionListener listener);
|
||||
}
|
||||
@@ -19,6 +19,10 @@ package com.android.systemui.statusbar.notification.dagger;
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.FeatureFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
import com.android.systemui.statusbar.notification.init.NotificationsController;
|
||||
import com.android.systemui.statusbar.notification.init.NotificationsControllerImpl;
|
||||
import com.android.systemui.statusbar.notification.init.NotificationsControllerStub;
|
||||
@@ -45,4 +49,16 @@ public class NotificationsModule {
|
||||
return stubController.get();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide the active notification collection managing the notifications to render.
|
||||
*/
|
||||
@Provides
|
||||
@Singleton
|
||||
public CommonNotifCollection provideCommonNotifCollection(
|
||||
FeatureFlags featureFlags,
|
||||
Lazy<NotifPipeline> pipeline,
|
||||
NotificationEntryManager entryManager) {
|
||||
return featureFlags.isNewNotifPipelineRenderingEnabled() ? pipeline.get() : entryManager;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,10 +22,9 @@ import android.widget.RemoteViews;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.statusbar.NotificationVisibility;
|
||||
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.notifcollection.CommonNotifCollection;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
|
||||
import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.InflationFlag;
|
||||
|
||||
import java.util.Map;
|
||||
@@ -40,8 +39,8 @@ public class NotifRemoteViewCacheImpl implements NotifRemoteViewCache {
|
||||
new ArrayMap<>();
|
||||
|
||||
@Inject
|
||||
NotifRemoteViewCacheImpl(NotificationEntryManager entryManager) {
|
||||
entryManager.addNotificationEntryListener(mEntryListener);
|
||||
NotifRemoteViewCacheImpl(CommonNotifCollection collection) {
|
||||
collection.addCollectionListener(mCollectionListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -93,17 +92,14 @@ public class NotifRemoteViewCacheImpl implements NotifRemoteViewCache {
|
||||
contentViews.clear();
|
||||
}
|
||||
|
||||
private final NotificationEntryListener mEntryListener = new NotificationEntryListener() {
|
||||
private final NotifCollectionListener mCollectionListener = new NotifCollectionListener() {
|
||||
@Override
|
||||
public void onPendingEntryAdded(NotificationEntry entry) {
|
||||
public void onEntryInit(NotificationEntry entry) {
|
||||
mNotifCachedContentViews.put(entry, new SparseArray<>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEntryRemoved(
|
||||
NotificationEntry entry,
|
||||
@Nullable NotificationVisibility visibility,
|
||||
boolean removedByUser) {
|
||||
public void onEntryCleanUp(NotificationEntry entry) {
|
||||
mNotifCachedContentViews.remove(entry);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -32,10 +32,10 @@ import android.widget.RemoteViews;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
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.notifcollection.CommonNotifCollection;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -50,7 +50,7 @@ public class NotifRemoteViewCacheImplTest extends SysuiTestCase {
|
||||
|
||||
private NotifRemoteViewCacheImpl mNotifRemoteViewCache;
|
||||
private NotificationEntry mEntry;
|
||||
private NotificationEntryListener mEntryListener;
|
||||
private NotifCollectionListener mEntryListener;
|
||||
@Mock private RemoteViews mRemoteViews;
|
||||
|
||||
@Before
|
||||
@@ -58,19 +58,17 @@ public class NotifRemoteViewCacheImplTest extends SysuiTestCase {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mEntry = new NotificationEntryBuilder().build();
|
||||
|
||||
NotificationEntryManager entryManager = mock(NotificationEntryManager.class);
|
||||
mNotifRemoteViewCache = new NotifRemoteViewCacheImpl(entryManager);
|
||||
ArgumentCaptor<NotificationEntryListener> entryListenerCaptor =
|
||||
ArgumentCaptor.forClass(NotificationEntryListener.class);
|
||||
verify(entryManager).addNotificationEntryListener(entryListenerCaptor.capture());
|
||||
CommonNotifCollection collection = mock(CommonNotifCollection.class);
|
||||
mNotifRemoteViewCache = new NotifRemoteViewCacheImpl(collection);
|
||||
ArgumentCaptor<NotifCollectionListener> entryListenerCaptor =
|
||||
ArgumentCaptor.forClass(NotifCollectionListener.class);
|
||||
verify(collection).addCollectionListener(entryListenerCaptor.capture());
|
||||
mEntryListener = entryListenerCaptor.getValue();
|
||||
mEntryListener.onEntryInit(mEntry);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPutCachedView() {
|
||||
// GIVEN an initialized cache for an entry.
|
||||
mEntryListener.onPendingEntryAdded(mEntry);
|
||||
|
||||
// WHEN a notification's cached remote views is put in.
|
||||
mNotifRemoteViewCache.putCachedView(mEntry, FLAG_CONTENT_VIEW_CONTRACTED, mRemoteViews);
|
||||
|
||||
@@ -85,7 +83,6 @@ public class NotifRemoteViewCacheImplTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testRemoveCachedView() {
|
||||
// GIVEN a cache with a cached view.
|
||||
mEntryListener.onPendingEntryAdded(mEntry);
|
||||
mNotifRemoteViewCache.putCachedView(mEntry, FLAG_CONTENT_VIEW_CONTRACTED, mRemoteViews);
|
||||
|
||||
// WHEN we remove the cached view.
|
||||
@@ -98,7 +95,6 @@ public class NotifRemoteViewCacheImplTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testClearCache() {
|
||||
// GIVEN a non-empty cache.
|
||||
mEntryListener.onPendingEntryAdded(mEntry);
|
||||
mNotifRemoteViewCache.putCachedView(mEntry, FLAG_CONTENT_VIEW_CONTRACTED, mRemoteViews);
|
||||
mNotifRemoteViewCache.putCachedView(mEntry, FLAG_CONTENT_VIEW_EXPANDED, mRemoteViews);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user