Merge changes I2cc194ad,I1ed99b7f,I404a307a into tm-qpr-dev

* changes:
  Reinflate active notifications when SHOW_NOTIFICATION_SNOOZE setting changes.
  New Pipeline: Move SectionClassifier to the provider package
  New Pipeline: Move SectionHeaderVisibilityProvider to the provider package
This commit is contained in:
Jeff DeCew
2022-06-23 11:17:49 +00:00
committed by Android (Google) Code Review
15 changed files with 171 additions and 47 deletions

View File

@@ -19,13 +19,13 @@ package com.android.systemui.statusbar.notification.collection.coordinator;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.SectionHeaderVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider; import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider; import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider;
import javax.inject.Inject; import javax.inject.Inject;

View File

@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.SectionClassifier;
import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.ListEntry;
import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -28,6 +27,7 @@ import com.android.systemui.statusbar.notification.collection.coordinator.dagger
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner;
import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider; import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider;
import com.android.systemui.statusbar.notification.collection.render.NodeController; import com.android.systemui.statusbar.notification.collection.render.NodeController;
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController; import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
import com.android.systemui.statusbar.notification.dagger.AlertingHeader; import com.android.systemui.statusbar.notification.dagger.AlertingHeader;
@@ -51,7 +51,7 @@ public class RankingCoordinator implements Coordinator {
public static final boolean SHOW_ALL_SECTIONS = false; public static final boolean SHOW_ALL_SECTIONS = false;
private final StatusBarStateController mStatusBarStateController; private final StatusBarStateController mStatusBarStateController;
private final HighPriorityProvider mHighPriorityProvider; private final HighPriorityProvider mHighPriorityProvider;
private final SectionClassifier mSectionClassifier; private final SectionStyleProvider mSectionStyleProvider;
private final NodeController mSilentNodeController; private final NodeController mSilentNodeController;
private final SectionHeaderController mSilentHeaderController; private final SectionHeaderController mSilentHeaderController;
private final NodeController mAlertingHeaderController; private final NodeController mAlertingHeaderController;
@@ -62,13 +62,13 @@ public class RankingCoordinator implements Coordinator {
public RankingCoordinator( public RankingCoordinator(
StatusBarStateController statusBarStateController, StatusBarStateController statusBarStateController,
HighPriorityProvider highPriorityProvider, HighPriorityProvider highPriorityProvider,
SectionClassifier sectionClassifier, SectionStyleProvider sectionStyleProvider,
@AlertingHeader NodeController alertingHeaderController, @AlertingHeader NodeController alertingHeaderController,
@SilentHeader SectionHeaderController silentHeaderController, @SilentHeader SectionHeaderController silentHeaderController,
@SilentHeader NodeController silentNodeController) { @SilentHeader NodeController silentNodeController) {
mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController;
mHighPriorityProvider = highPriorityProvider; mHighPriorityProvider = highPriorityProvider;
mSectionClassifier = sectionClassifier; mSectionStyleProvider = sectionStyleProvider;
mAlertingHeaderController = alertingHeaderController; mAlertingHeaderController = alertingHeaderController;
mSilentNodeController = silentNodeController; mSilentNodeController = silentNodeController;
mSilentHeaderController = silentHeaderController; mSilentHeaderController = silentHeaderController;
@@ -77,7 +77,7 @@ public class RankingCoordinator implements Coordinator {
@Override @Override
public void attach(NotifPipeline pipeline) { public void attach(NotifPipeline pipeline) {
mStatusBarStateController.addCallback(mStatusBarStateCallback); mStatusBarStateController.addCallback(mStatusBarStateCallback);
mSectionClassifier.setMinimizedSections(Collections.singleton(mMinimizedNotifSectioner)); mSectionStyleProvider.setMinimizedSections(Collections.singleton(mMinimizedNotifSectioner));
pipeline.addPreGroupFilter(mSuspendedFilter); pipeline.addPreGroupFilter(mSuspendedFilter);
pipeline.addPreGroupFilter(mDndVisualEffectsFilter); pipeline.addPreGroupFilter(mDndVisualEffectsFilter);

View File

@@ -19,11 +19,11 @@ package com.android.systemui.statusbar.notification.collection.coordinator
import android.content.Context import android.content.Context
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.statusbar.notification.AssistantFeedbackController import com.android.systemui.statusbar.notification.AssistantFeedbackController
import com.android.systemui.statusbar.notification.SectionClassifier
import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
import com.android.systemui.statusbar.notification.collection.render.NotifRowController import com.android.systemui.statusbar.notification.collection.render.NotifRowController
import javax.inject.Inject import javax.inject.Inject
@@ -35,7 +35,7 @@ import javax.inject.Inject
class RowAppearanceCoordinator @Inject internal constructor( class RowAppearanceCoordinator @Inject internal constructor(
context: Context, context: Context,
private var mAssistantFeedbackController: AssistantFeedbackController, private var mAssistantFeedbackController: AssistantFeedbackController,
private var mSectionClassifier: SectionClassifier private var mSectionStyleProvider: SectionStyleProvider
) : Coordinator { ) : Coordinator {
private var entryToExpand: NotificationEntry? = null private var entryToExpand: NotificationEntry? = null
@@ -55,7 +55,7 @@ class RowAppearanceCoordinator @Inject internal constructor(
private fun onBeforeRenderList(list: List<ListEntry>) { private fun onBeforeRenderList(list: List<ListEntry>) {
entryToExpand = list.firstOrNull()?.representativeEntry?.takeIf { entry -> entryToExpand = list.firstOrNull()?.representativeEntry?.takeIf { entry ->
!mSectionClassifier.isMinimizedSection(entry.section!!) !mSectionStyleProvider.isMinimizedSection(entry.section!!)
} }
} }

View File

@@ -31,6 +31,7 @@ class NotifUiAdjustment internal constructor(
val smartActions: List<Notification.Action>, val smartActions: List<Notification.Action>,
val smartReplies: List<CharSequence>, val smartReplies: List<CharSequence>,
val isConversation: Boolean, val isConversation: Boolean,
val isSnoozeEnabled: Boolean,
val isMinimized: Boolean, val isMinimized: Boolean,
val needsRedaction: Boolean, val needsRedaction: Boolean,
) { ) {
@@ -42,6 +43,7 @@ class NotifUiAdjustment internal constructor(
): Boolean = when { ): Boolean = when {
oldAdjustment === newAdjustment -> false oldAdjustment === newAdjustment -> false
oldAdjustment.isConversation != newAdjustment.isConversation -> true oldAdjustment.isConversation != newAdjustment.isConversation -> true
oldAdjustment.isSnoozeEnabled != newAdjustment.isSnoozeEnabled -> true
oldAdjustment.isMinimized != newAdjustment.isMinimized -> true oldAdjustment.isMinimized != newAdjustment.isMinimized -> true
oldAdjustment.needsRedaction != newAdjustment.needsRedaction -> true oldAdjustment.needsRedaction != newAdjustment.needsRedaction -> true
areDifferent(oldAdjustment.smartActions, newAdjustment.smartActions) -> true areDifferent(oldAdjustment.smartActions, newAdjustment.smartActions) -> true
@@ -57,9 +59,9 @@ class NotifUiAdjustment internal constructor(
first.size != second.size -> true first.size != second.size -> true
else -> first.asSequence().zip(second.asSequence()).any { else -> first.asSequence().zip(second.asSequence()).any {
(!TextUtils.equals(it.first.title, it.second.title)) || (!TextUtils.equals(it.first.title, it.second.title)) ||
(areDifferent(it.first.getIcon(), it.second.getIcon())) || (areDifferent(it.first.getIcon(), it.second.getIcon())) ||
(it.first.actionIntent != it.second.actionIntent) || (it.first.actionIntent != it.second.actionIntent) ||
(areDifferent(it.first.remoteInputs, it.second.remoteInputs)) (areDifferent(it.first.remoteInputs, it.second.remoteInputs))
} }
} }
@@ -78,7 +80,7 @@ class NotifUiAdjustment internal constructor(
first.size != second.size -> true first.size != second.size -> true
else -> first.asSequence().zip(second.asSequence()).any { else -> first.asSequence().zip(second.asSequence()).any {
(!TextUtils.equals(it.first.label, it.second.label)) || (!TextUtils.equals(it.first.label, it.second.label)) ||
(areDifferent(it.first.choices, it.second.choices)) (areDifferent(it.first.choices, it.second.choices))
} }
} }
@@ -94,4 +96,4 @@ class NotifUiAdjustment internal constructor(
} }
} }
} }
} }

View File

@@ -16,12 +16,18 @@
package com.android.systemui.statusbar.notification.collection.inflation package com.android.systemui.statusbar.notification.collection.inflation
import android.database.ContentObserver
import android.os.Handler
import android.os.UserHandle
import android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.notification.SectionClassifier
import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
import com.android.systemui.util.ListenerSet import com.android.systemui.util.ListenerSet
import com.android.systemui.util.settings.SecureSettings
import javax.inject.Inject import javax.inject.Inject
/** /**
@@ -30,14 +36,23 @@ import javax.inject.Inject
*/ */
@SysUISingleton @SysUISingleton
class NotifUiAdjustmentProvider @Inject constructor( class NotifUiAdjustmentProvider @Inject constructor(
@Main private val handler: Handler,
private val secureSettings: SecureSettings,
private val lockscreenUserManager: NotificationLockscreenUserManager, private val lockscreenUserManager: NotificationLockscreenUserManager,
private val sectionClassifier: SectionClassifier, private val sectionStyleProvider: SectionStyleProvider
) { ) {
private val dirtyListeners = ListenerSet<Runnable>() private val dirtyListeners = ListenerSet<Runnable>()
private var isSnoozeEnabled = false
fun addDirtyListener(listener: Runnable) { fun addDirtyListener(listener: Runnable) {
if (dirtyListeners.isEmpty()) { if (dirtyListeners.isEmpty()) {
lockscreenUserManager.addNotificationStateChangedListener(notifStateChangedListener) lockscreenUserManager.addNotificationStateChangedListener(notifStateChangedListener)
updateSnoozeEnabled()
secureSettings.registerContentObserverForUser(
SHOW_NOTIFICATION_SNOOZE,
settingsObserver,
UserHandle.USER_ALL
)
} }
dirtyListeners.addIfAbsent(listener) dirtyListeners.addIfAbsent(listener)
} }
@@ -46,6 +61,7 @@ class NotifUiAdjustmentProvider @Inject constructor(
dirtyListeners.remove(listener) dirtyListeners.remove(listener)
if (dirtyListeners.isEmpty()) { if (dirtyListeners.isEmpty()) {
lockscreenUserManager.removeNotificationStateChangedListener(notifStateChangedListener) lockscreenUserManager.removeNotificationStateChangedListener(notifStateChangedListener)
secureSettings.unregisterContentObserver(settingsObserver)
} }
} }
@@ -54,10 +70,21 @@ class NotifUiAdjustmentProvider @Inject constructor(
dirtyListeners.forEach(Runnable::run) dirtyListeners.forEach(Runnable::run)
} }
private val settingsObserver = object : ContentObserver(handler) {
override fun onChange(selfChange: Boolean) {
updateSnoozeEnabled()
dirtyListeners.forEach(Runnable::run)
}
}
private fun updateSnoozeEnabled() {
isSnoozeEnabled = secureSettings.getInt(SHOW_NOTIFICATION_SNOOZE, 0) == 1
}
private fun isEntryMinimized(entry: NotificationEntry): Boolean { private fun isEntryMinimized(entry: NotificationEntry): Boolean {
val section = entry.section ?: error("Entry must have a section to determine if minimized") val section = entry.section ?: error("Entry must have a section to determine if minimized")
val parent = entry.parent ?: error("Entry must have a parent to determine if minimized") val parent = entry.parent ?: error("Entry must have a parent to determine if minimized")
val isMinimizedSection = sectionClassifier.isMinimizedSection(section) val isMinimizedSection = sectionStyleProvider.isMinimizedSection(section)
val isTopLevelEntry = parent == GroupEntry.ROOT_ENTRY val isTopLevelEntry = parent == GroupEntry.ROOT_ENTRY
val isGroupSummary = parent.summary == entry val isGroupSummary = parent.summary == entry
return isMinimizedSection && (isTopLevelEntry || isGroupSummary) return isMinimizedSection && (isTopLevelEntry || isGroupSummary)
@@ -73,7 +100,8 @@ class NotifUiAdjustmentProvider @Inject constructor(
smartActions = entry.ranking.smartActions, smartActions = entry.ranking.smartActions,
smartReplies = entry.ranking.smartReplies, smartReplies = entry.ranking.smartReplies,
isConversation = entry.ranking.isConversation, isConversation = entry.ranking.isConversation,
isSnoozeEnabled = isSnoozeEnabled,
isMinimized = isEntryMinimized(entry), isMinimized = isEntryMinimized(entry),
needsRedaction = lockscreenUserManager.needsRedaction(entry), needsRedaction = lockscreenUserManager.needsRedaction(entry),
) )
} }

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.systemui.statusbar.notification package com.android.systemui.statusbar.notification.collection.provider
import android.content.Context import android.content.Context
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
@@ -34,7 +34,7 @@ import javax.inject.Inject
class SectionHeaderVisibilityProvider @Inject constructor( class SectionHeaderVisibilityProvider @Inject constructor(
context: Context context: Context
) { ) {
var neverShowSectionHeaders = context.resources.getBoolean(R.bool.config_notification_never_show_section_headers) val neverShowSectionHeaders =
private set context.resources.getBoolean(R.bool.config_notification_never_show_section_headers)
var sectionHeadersVisible = true var sectionHeadersVisible = true
} }

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.systemui.statusbar.notification package com.android.systemui.statusbar.notification.collection.provider
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
@@ -26,7 +26,7 @@ import javax.inject.Inject
* NOTE: This class exists to avoid putting metadata like "isMinimized" on the NotifSection * NOTE: This class exists to avoid putting metadata like "isMinimized" on the NotifSection
*/ */
@SysUISingleton @SysUISingleton
class SectionClassifier @Inject constructor() { class SectionStyleProvider @Inject constructor() {
private lateinit var lowPrioritySections: Set<NotifSectioner> private lateinit var lowPrioritySections: Set<NotifSectioner>
/** /**

View File

@@ -16,12 +16,12 @@
package com.android.systemui.statusbar.notification.collection.render package com.android.systemui.statusbar.notification.collection.render
import com.android.systemui.statusbar.notification.SectionHeaderVisibilityProvider
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider
import com.android.systemui.util.Compile import com.android.systemui.util.Compile
import com.android.systemui.util.traceSection import com.android.systemui.util.traceSection

View File

@@ -19,10 +19,10 @@ package com.android.systemui.statusbar.notification.collection.render
import android.content.Context import android.content.Context
import android.view.View import android.view.View
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
import com.android.systemui.statusbar.notification.SectionHeaderVisibilityProvider
import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider
import com.android.systemui.statusbar.notification.stack.NotificationListContainer import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.util.traceSection import com.android.systemui.util.traceSection
import dagger.assisted.Assisted import dagger.assisted.Assisted

View File

@@ -30,13 +30,13 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.SectionHeaderVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider; import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider; import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import org.junit.Before; import org.junit.Before;

View File

@@ -31,6 +31,7 @@ import static org.mockito.Mockito.when;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import android.os.Handler;
import android.os.RemoteException; import android.os.RemoteException;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
@@ -42,7 +43,6 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.RankingBuilder;
import com.android.systemui.statusbar.notification.SectionClassifier;
import com.android.systemui.statusbar.notification.collection.GroupEntry; import com.android.systemui.statusbar.notification.collection.GroupEntry;
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder; import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder;
import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.ListEntry;
@@ -57,8 +57,10 @@ import com.android.systemui.statusbar.notification.collection.listbuilder.OnBefo
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider;
import com.android.systemui.statusbar.notification.collection.render.NotifViewBarn; import com.android.systemui.statusbar.notification.collection.render.NotifViewBarn;
import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager; import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager;
import com.android.systemui.util.settings.SecureSettings;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -97,8 +99,10 @@ public class PreparationCoordinatorTest extends SysuiTestCase {
@Mock private IStatusBarService mService; @Mock private IStatusBarService mService;
@Mock private BindEventManagerImpl mBindEventManagerImpl; @Mock private BindEventManagerImpl mBindEventManagerImpl;
@Mock private NotificationLockscreenUserManager mLockscreenUserManager; @Mock private NotificationLockscreenUserManager mLockscreenUserManager;
@Mock private Handler mHandler;
@Mock private SecureSettings mSecureSettings;
@Spy private FakeNotifInflater mNotifInflater = new FakeNotifInflater(); @Spy private FakeNotifInflater mNotifInflater = new FakeNotifInflater();
private final SectionClassifier mSectionClassifier = new SectionClassifier(); private final SectionStyleProvider mSectionStyleProvider = new SectionStyleProvider();
private NotifUiAdjustmentProvider mAdjustmentProvider; private NotifUiAdjustmentProvider mAdjustmentProvider;
@@ -110,8 +114,11 @@ public class PreparationCoordinatorTest extends SysuiTestCase {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mAdjustmentProvider = mAdjustmentProvider = new NotifUiAdjustmentProvider(
new NotifUiAdjustmentProvider(mLockscreenUserManager, mSectionClassifier); mHandler,
mSecureSettings,
mLockscreenUserManager,
mSectionStyleProvider);
mEntry = getNotificationEntryBuilder().setParent(ROOT_ENTRY).build(); mEntry = getNotificationEntryBuilder().setParent(ROOT_ENTRY).build();
mInflationError = new Exception(TEST_MESSAGE); mInflationError = new Exception(TEST_MESSAGE);
mErrorManager = new NotifInflationErrorManager(); mErrorManager = new NotifInflationErrorManager();
@@ -495,7 +502,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase {
private static final int TEST_MAX_GROUP_DELAY = 100; private static final int TEST_MAX_GROUP_DELAY = 100;
private void setSectionIsLowPriority(boolean minimized) { private void setSectionIsLowPriority(boolean minimized) {
mSectionClassifier.setMinimizedSections(minimized mSectionStyleProvider.setMinimizedSections(minimized
? Collections.singleton(mNotifSection.getSectioner()) ? Collections.singleton(mNotifSection.getSectioner())
: Collections.emptyList()); : Collections.emptyList());
} }

View File

@@ -42,7 +42,6 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.RankingBuilder;
import com.android.systemui.statusbar.SbnBuilder; import com.android.systemui.statusbar.SbnBuilder;
import com.android.systemui.statusbar.notification.SectionClassifier;
import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.ListEntry;
import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -50,6 +49,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntryB
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner;
import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider; import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider;
import com.android.systemui.statusbar.notification.collection.render.NodeController; import com.android.systemui.statusbar.notification.collection.render.NodeController;
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController; import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
@@ -70,7 +70,7 @@ public class RankingCoordinatorTest extends SysuiTestCase {
@Mock private StatusBarStateController mStatusBarStateController; @Mock private StatusBarStateController mStatusBarStateController;
@Mock private HighPriorityProvider mHighPriorityProvider; @Mock private HighPriorityProvider mHighPriorityProvider;
@Mock private SectionClassifier mSectionClassifier; @Mock private SectionStyleProvider mSectionStyleProvider;
@Mock private NotifPipeline mNotifPipeline; @Mock private NotifPipeline mNotifPipeline;
@Mock private NodeController mAlertingHeaderController; @Mock private NodeController mAlertingHeaderController;
@Mock private NodeController mSilentNodeController; @Mock private NodeController mSilentNodeController;
@@ -94,7 +94,7 @@ public class RankingCoordinatorTest extends SysuiTestCase {
mRankingCoordinator = new RankingCoordinator( mRankingCoordinator = new RankingCoordinator(
mStatusBarStateController, mStatusBarStateController,
mHighPriorityProvider, mHighPriorityProvider,
mSectionClassifier, mSectionStyleProvider,
mAlertingHeaderController, mAlertingHeaderController,
mSilentHeaderController, mSilentHeaderController,
mSilentNodeController); mSilentNodeController);
@@ -102,7 +102,7 @@ public class RankingCoordinatorTest extends SysuiTestCase {
mEntry.setRanking(getRankingForUnfilteredNotif().build()); mEntry.setRanking(getRankingForUnfilteredNotif().build());
mRankingCoordinator.attach(mNotifPipeline); mRankingCoordinator.attach(mNotifPipeline);
verify(mSectionClassifier).setMinimizedSections(any()); verify(mSectionStyleProvider).setMinimizedSections(any());
verify(mNotifPipeline, times(2)).addPreGroupFilter(mNotifFilterCaptor.capture()); verify(mNotifPipeline, times(2)).addPreGroupFilter(mNotifFilterCaptor.capture());
mCapturedSuspendedFilter = mNotifFilterCaptor.getAllValues().get(0); mCapturedSuspendedFilter = mNotifFilterCaptor.getAllValues().get(0);
mCapturedDozingFilter = mNotifFilterCaptor.getAllValues().get(1); mCapturedDozingFilter = mNotifFilterCaptor.getAllValues().get(1);

View File

@@ -21,13 +21,13 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.notification.AssistantFeedbackController import com.android.systemui.statusbar.notification.AssistantFeedbackController
import com.android.systemui.statusbar.notification.FeedbackIcon import com.android.systemui.statusbar.notification.FeedbackIcon
import com.android.systemui.statusbar.notification.SectionClassifier
import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderEntryListener import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderEntryListener
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
import com.android.systemui.statusbar.notification.collection.render.NotifRowController import com.android.systemui.statusbar.notification.collection.render.NotifRowController
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.eq
@@ -53,7 +53,7 @@ class RowAppearanceCoordinatorTest : SysuiTestCase() {
@Mock private lateinit var pipeline: NotifPipeline @Mock private lateinit var pipeline: NotifPipeline
@Mock private lateinit var assistantFeedbackController: AssistantFeedbackController @Mock private lateinit var assistantFeedbackController: AssistantFeedbackController
@Mock private lateinit var sectionClassifier: SectionClassifier @Mock private lateinit var sectionStyleProvider: SectionStyleProvider
@Mock private lateinit var section1: NotifSection @Mock private lateinit var section1: NotifSection
@Mock private lateinit var section2: NotifSection @Mock private lateinit var section2: NotifSection
@@ -66,7 +66,7 @@ class RowAppearanceCoordinatorTest : SysuiTestCase() {
coordinator = RowAppearanceCoordinator( coordinator = RowAppearanceCoordinator(
mContext, mContext,
assistantFeedbackController, assistantFeedbackController,
sectionClassifier sectionStyleProvider
) )
coordinator.attach(pipeline) coordinator.attach(pipeline)
beforeRenderListListener = withArgCaptor { beforeRenderListListener = withArgCaptor {
@@ -82,8 +82,8 @@ class RowAppearanceCoordinatorTest : SysuiTestCase() {
@Test @Test
fun testSetSystemExpandedOnlyOnFirst() { fun testSetSystemExpandedOnlyOnFirst() {
whenever(sectionClassifier.isMinimizedSection(eq(section1))).thenReturn(false) whenever(sectionStyleProvider.isMinimizedSection(eq(section1))).thenReturn(false)
whenever(sectionClassifier.isMinimizedSection(eq(section1))).thenReturn(false) whenever(sectionStyleProvider.isMinimizedSection(eq(section1))).thenReturn(false)
beforeRenderListListener.onBeforeRenderList(listOf(entry1, entry2)) beforeRenderListListener.onBeforeRenderList(listOf(entry1, entry2))
afterRenderEntryListener.onAfterRenderEntry(entry1, controller1) afterRenderEntryListener.onAfterRenderEntry(entry1, controller1)
verify(controller1).setSystemExpanded(eq(true)) verify(controller1).setSystemExpanded(eq(true))
@@ -93,8 +93,8 @@ class RowAppearanceCoordinatorTest : SysuiTestCase() {
@Test @Test
fun testSetSystemExpandedNeverIfMinimized() { fun testSetSystemExpandedNeverIfMinimized() {
whenever(sectionClassifier.isMinimizedSection(eq(section1))).thenReturn(true) whenever(sectionStyleProvider.isMinimizedSection(eq(section1))).thenReturn(true)
whenever(sectionClassifier.isMinimizedSection(eq(section1))).thenReturn(true) whenever(sectionStyleProvider.isMinimizedSection(eq(section1))).thenReturn(true)
beforeRenderListListener.onBeforeRenderList(listOf(entry1, entry2)) beforeRenderListListener.onBeforeRenderList(listOf(entry1, entry2))
afterRenderEntryListener.onAfterRenderEntry(entry1, controller1) afterRenderEntryListener.onAfterRenderEntry(entry1, controller1)
verify(controller1).setSystemExpanded(eq(false)) verify(controller1).setSystemExpanded(eq(false))

View File

@@ -1,29 +1,87 @@
/*
* 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.inflation package com.android.systemui.statusbar.notification.collection.inflation
import android.database.ContentObserver
import android.os.Handler
import android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper import android.testing.TestableLooper.RunWithLooper
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.notification.SectionClassifier import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.withArgCaptor import com.android.systemui.util.mockito.withArgCaptor
import com.android.systemui.util.settings.FakeSettings
import com.android.systemui.util.settings.SecureSettings
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.inOrder
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when` as whenever
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner::class) @RunWith(AndroidTestingRunner::class)
@RunWithLooper @RunWithLooper
class NotifUiAdjustmentProviderTest : SysuiTestCase() { class NotifUiAdjustmentProviderTest : SysuiTestCase() {
private val lockscreenUserManager: NotificationLockscreenUserManager = mock() private val lockscreenUserManager: NotificationLockscreenUserManager = mock()
private val sectionClassifier: SectionClassifier = mock() private val sectionStyleProvider: SectionStyleProvider = mock()
private val handler: Handler = mock()
private val secureSettings: SecureSettings = mock()
private val uri = FakeSettings().getUriFor(SHOW_NOTIFICATION_SNOOZE)
private val dirtyListener: Runnable = mock()
private val section = NotifSection(mock(), 0)
private val entry = NotificationEntryBuilder()
.setSection(section)
.setParent(GroupEntry.ROOT_ENTRY)
.build()
private lateinit var contentObserver: ContentObserver
private val adjustmentProvider = NotifUiAdjustmentProvider( private val adjustmentProvider = NotifUiAdjustmentProvider(
handler,
secureSettings,
lockscreenUserManager, lockscreenUserManager,
sectionClassifier, sectionStyleProvider,
) )
@Before
fun setup() {
verifyNoMoreInteractions(secureSettings)
adjustmentProvider.addDirtyListener(dirtyListener)
verify(secureSettings).getInt(eq(SHOW_NOTIFICATION_SNOOZE), any())
contentObserver = withArgCaptor {
verify(secureSettings).registerContentObserverForUser(
eq(SHOW_NOTIFICATION_SNOOZE), capture(), any()
)
}
verifyNoMoreInteractions(secureSettings, dirtyListener)
}
@Test @Test
fun notifLockscreenStateChangeWillNotifDirty() { fun notifLockscreenStateChangeWillNotifDirty() {
val dirtyListener = mock<Runnable>() val dirtyListener = mock<Runnable>()
@@ -33,6 +91,35 @@ class NotifUiAdjustmentProviderTest : SysuiTestCase() {
verify(lockscreenUserManager).addNotificationStateChangedListener(capture()) verify(lockscreenUserManager).addNotificationStateChangedListener(capture())
} }
notifLocksreenStateChangeListener.onNotificationStateChanged() notifLocksreenStateChangeListener.onNotificationStateChanged()
verify(dirtyListener).run(); verify(dirtyListener).run()
}
@Test
fun additionalAddDoesNotRegisterAgain() {
clearInvocations(secureSettings)
adjustmentProvider.addDirtyListener(mock())
verifyNoMoreInteractions(secureSettings)
}
@Test
fun onChangeWillQueryThenNotifyDirty() {
contentObserver.onChange(false, listOf(uri), 0, 0)
with(inOrder(secureSettings, dirtyListener)) {
verify(secureSettings).getInt(eq(SHOW_NOTIFICATION_SNOOZE), any())
verify(dirtyListener).run()
}
}
@Test
fun changingSnoozeChangesProvidedAdjustment() {
whenever(secureSettings.getInt(eq(SHOW_NOTIFICATION_SNOOZE), any())).thenReturn(0)
val original = adjustmentProvider.calculateAdjustment(entry)
assertThat(original.isSnoozeEnabled).isFalse()
whenever(secureSettings.getInt(eq(SHOW_NOTIFICATION_SNOOZE), any())).thenReturn(1)
contentObserver.onChange(false, listOf(uri), 0, 0)
val withSnoozing = adjustmentProvider.calculateAdjustment(entry)
assertThat(withSnoozing.isSnoozeEnabled).isTrue()
assertThat(withSnoozing).isNotEqualTo(original)
} }
} }

View File

@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.collection.render
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
import com.android.systemui.statusbar.notification.SectionHeaderVisibilityProvider
import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder
import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.ListEntry
@@ -28,6 +27,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntryB
import com.android.systemui.statusbar.notification.collection.getAttachState import com.android.systemui.statusbar.notification.collection.getAttachState
import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider
import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING
import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE
import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT