diff options
15 files changed, 171 insertions, 47 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java index ff1c70ca740b..05e8ec563f20 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java @@ -19,13 +19,13 @@ package com.android.systemui.statusbar.notification.collection.coordinator; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.plugins.statusbar.StatusBarStateController; 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.NotificationEntry; 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.provider.HighPriorityProvider; import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider; +import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider; import javax.inject.Inject; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java index 57fd1975e13a..5ac481341d43 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; 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.NotifPipeline; 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.NotifSectioner; 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.SectionHeaderController; 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; private final StatusBarStateController mStatusBarStateController; private final HighPriorityProvider mHighPriorityProvider; - private final SectionClassifier mSectionClassifier; + private final SectionStyleProvider mSectionStyleProvider; private final NodeController mSilentNodeController; private final SectionHeaderController mSilentHeaderController; private final NodeController mAlertingHeaderController; @@ -62,13 +62,13 @@ public class RankingCoordinator implements Coordinator { public RankingCoordinator( StatusBarStateController statusBarStateController, HighPriorityProvider highPriorityProvider, - SectionClassifier sectionClassifier, + SectionStyleProvider sectionStyleProvider, @AlertingHeader NodeController alertingHeaderController, @SilentHeader SectionHeaderController silentHeaderController, @SilentHeader NodeController silentNodeController) { mStatusBarStateController = statusBarStateController; mHighPriorityProvider = highPriorityProvider; - mSectionClassifier = sectionClassifier; + mSectionStyleProvider = sectionStyleProvider; mAlertingHeaderController = alertingHeaderController; mSilentNodeController = silentNodeController; mSilentHeaderController = silentHeaderController; @@ -77,7 +77,7 @@ public class RankingCoordinator implements Coordinator { @Override public void attach(NotifPipeline pipeline) { mStatusBarStateController.addCallback(mStatusBarStateCallback); - mSectionClassifier.setMinimizedSections(Collections.singleton(mMinimizedNotifSectioner)); + mSectionStyleProvider.setMinimizedSections(Collections.singleton(mMinimizedNotifSectioner)); pipeline.addPreGroupFilter(mSuspendedFilter); pipeline.addPreGroupFilter(mDndVisualEffectsFilter); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinator.kt index 4e9d3ac07a96..9e8b35af1bce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinator.kt @@ -19,11 +19,11 @@ package com.android.systemui.statusbar.notification.collection.coordinator import android.content.Context import com.android.systemui.R 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.NotifPipeline 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.provider.SectionStyleProvider import com.android.systemui.statusbar.notification.collection.render.NotifRowController import javax.inject.Inject @@ -35,7 +35,7 @@ import javax.inject.Inject class RowAppearanceCoordinator @Inject internal constructor( context: Context, private var mAssistantFeedbackController: AssistantFeedbackController, - private var mSectionClassifier: SectionClassifier + private var mSectionStyleProvider: SectionStyleProvider ) : Coordinator { private var entryToExpand: NotificationEntry? = null @@ -55,7 +55,7 @@ class RowAppearanceCoordinator @Inject internal constructor( private fun onBeforeRenderList(list: List<ListEntry>) { entryToExpand = list.firstOrNull()?.representativeEntry?.takeIf { entry -> - !mSectionClassifier.isMinimizedSection(entry.section!!) + !mSectionStyleProvider.isMinimizedSection(entry.section!!) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustment.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustment.kt index 3475fcf7c12f..ee0b00807e27 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustment.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustment.kt @@ -31,6 +31,7 @@ class NotifUiAdjustment internal constructor( val smartActions: List<Notification.Action>, val smartReplies: List<CharSequence>, val isConversation: Boolean, + val isSnoozeEnabled: Boolean, val isMinimized: Boolean, val needsRedaction: Boolean, ) { @@ -42,6 +43,7 @@ class NotifUiAdjustment internal constructor( ): Boolean = when { oldAdjustment === newAdjustment -> false oldAdjustment.isConversation != newAdjustment.isConversation -> true + oldAdjustment.isSnoozeEnabled != newAdjustment.isSnoozeEnabled -> true oldAdjustment.isMinimized != newAdjustment.isMinimized -> true oldAdjustment.needsRedaction != newAdjustment.needsRedaction -> true areDifferent(oldAdjustment.smartActions, newAdjustment.smartActions) -> true @@ -57,9 +59,9 @@ class NotifUiAdjustment internal constructor( first.size != second.size -> true else -> first.asSequence().zip(second.asSequence()).any { (!TextUtils.equals(it.first.title, it.second.title)) || - (areDifferent(it.first.getIcon(), it.second.getIcon())) || - (it.first.actionIntent != it.second.actionIntent) || - (areDifferent(it.first.remoteInputs, it.second.remoteInputs)) + (areDifferent(it.first.getIcon(), it.second.getIcon())) || + (it.first.actionIntent != it.second.actionIntent) || + (areDifferent(it.first.remoteInputs, it.second.remoteInputs)) } } @@ -78,7 +80,7 @@ class NotifUiAdjustment internal constructor( first.size != second.size -> true else -> first.asSequence().zip(second.asSequence()).any { (!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( } } } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt index f7b6376c717c..745d6fe1d624 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt @@ -16,12 +16,18 @@ 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.qualifiers.Main 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.NotificationEntry +import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider import com.android.systemui.util.ListenerSet +import com.android.systemui.util.settings.SecureSettings import javax.inject.Inject /** @@ -30,14 +36,23 @@ import javax.inject.Inject */ @SysUISingleton class NotifUiAdjustmentProvider @Inject constructor( + @Main private val handler: Handler, + private val secureSettings: SecureSettings, private val lockscreenUserManager: NotificationLockscreenUserManager, - private val sectionClassifier: SectionClassifier, + private val sectionStyleProvider: SectionStyleProvider ) { private val dirtyListeners = ListenerSet<Runnable>() + private var isSnoozeEnabled = false fun addDirtyListener(listener: Runnable) { if (dirtyListeners.isEmpty()) { lockscreenUserManager.addNotificationStateChangedListener(notifStateChangedListener) + updateSnoozeEnabled() + secureSettings.registerContentObserverForUser( + SHOW_NOTIFICATION_SNOOZE, + settingsObserver, + UserHandle.USER_ALL + ) } dirtyListeners.addIfAbsent(listener) } @@ -46,6 +61,7 @@ class NotifUiAdjustmentProvider @Inject constructor( dirtyListeners.remove(listener) if (dirtyListeners.isEmpty()) { lockscreenUserManager.removeNotificationStateChangedListener(notifStateChangedListener) + secureSettings.unregisterContentObserver(settingsObserver) } } @@ -54,10 +70,21 @@ class NotifUiAdjustmentProvider @Inject constructor( 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 { 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 isMinimizedSection = sectionClassifier.isMinimizedSection(section) + val isMinimizedSection = sectionStyleProvider.isMinimizedSection(section) val isTopLevelEntry = parent == GroupEntry.ROOT_ENTRY val isGroupSummary = parent.summary == entry return isMinimizedSection && (isTopLevelEntry || isGroupSummary) @@ -73,7 +100,8 @@ class NotifUiAdjustmentProvider @Inject constructor( smartActions = entry.ranking.smartActions, smartReplies = entry.ranking.smartReplies, isConversation = entry.ranking.isConversation, + isSnoozeEnabled = isSnoozeEnabled, isMinimized = isEntryMinimized(entry), needsRedaction = lockscreenUserManager.needsRedaction(entry), ) -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/SectionHeaderVisibilityProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionHeaderVisibilityProvider.kt index 68bdd18c9881..2148d3bb336a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/SectionHeaderVisibilityProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionHeaderVisibilityProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.statusbar.notification +package com.android.systemui.statusbar.notification.collection.provider import android.content.Context import com.android.systemui.dagger.SysUISingleton @@ -34,7 +34,7 @@ import javax.inject.Inject class SectionHeaderVisibilityProvider @Inject constructor( context: Context ) { - var neverShowSectionHeaders = context.resources.getBoolean(R.bool.config_notification_never_show_section_headers) - private set + val neverShowSectionHeaders = + context.resources.getBoolean(R.bool.config_notification_never_show_section_headers) var sectionHeadersVisible = true } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/SectionClassifier.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt index 1f2d0fe6c46e..50e7d1ce4ba0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/SectionClassifier.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt @@ -14,7 +14,7 @@ * 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.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 */ @SysUISingleton -class SectionClassifier @Inject constructor() { +class SectionStyleProvider @Inject constructor() { private lateinit var lowPrioritySections: Set<NotifSectioner> /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilder.kt index 8be710c8842c..34d25cf9c3be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilder.kt @@ -16,12 +16,12 @@ 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.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry 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.traceSection diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt index 6ed81078c3a4..51dc72848d9e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt @@ -19,10 +19,10 @@ package com.android.systemui.statusbar.notification.collection.render import android.content.Context import android.view.View 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.ListEntry 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.util.traceSection import dagger.assisted.Assisted diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.java index d082d74078db..193d76dccf0c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.java @@ -30,13 +30,13 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; 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.NotificationEntry; 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.provider.HighPriorityProvider; 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 org.junit.Before; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java index 72d8ff3f35f5..a6d3719de5cc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java @@ -31,6 +31,7 @@ import static org.mockito.Mockito.when; import static java.util.Objects.requireNonNull; +import android.os.Handler; import android.os.RemoteException; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -42,7 +43,6 @@ import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationLockscreenUserManager; 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.GroupEntryBuilder; 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.NotifSectioner; 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.row.NotifInflationErrorManager; +import com.android.systemui.util.settings.SecureSettings; import org.junit.Before; import org.junit.Test; @@ -97,8 +99,10 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Mock private IStatusBarService mService; @Mock private BindEventManagerImpl mBindEventManagerImpl; @Mock private NotificationLockscreenUserManager mLockscreenUserManager; + @Mock private Handler mHandler; + @Mock private SecureSettings mSecureSettings; @Spy private FakeNotifInflater mNotifInflater = new FakeNotifInflater(); - private final SectionClassifier mSectionClassifier = new SectionClassifier(); + private final SectionStyleProvider mSectionStyleProvider = new SectionStyleProvider(); private NotifUiAdjustmentProvider mAdjustmentProvider; @@ -110,8 +114,11 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mAdjustmentProvider = - new NotifUiAdjustmentProvider(mLockscreenUserManager, mSectionClassifier); + mAdjustmentProvider = new NotifUiAdjustmentProvider( + mHandler, + mSecureSettings, + mLockscreenUserManager, + mSectionStyleProvider); mEntry = getNotificationEntryBuilder().setParent(ROOT_ENTRY).build(); mInflationError = new Exception(TEST_MESSAGE); mErrorManager = new NotifInflationErrorManager(); @@ -495,7 +502,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { private static final int TEST_MAX_GROUP_DELAY = 100; private void setSectionIsLowPriority(boolean minimized) { - mSectionClassifier.setMinimizedSections(minimized + mSectionStyleProvider.setMinimizedSections(minimized ? Collections.singleton(mNotifSection.getSectioner()) : Collections.emptyList()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java index 15c1cb7b123a..50b3fc7e1c42 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java @@ -42,7 +42,6 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.RankingBuilder; 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.NotifPipeline; 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.NotifSectioner; 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.SectionHeaderController; @@ -70,7 +70,7 @@ public class RankingCoordinatorTest extends SysuiTestCase { @Mock private StatusBarStateController mStatusBarStateController; @Mock private HighPriorityProvider mHighPriorityProvider; - @Mock private SectionClassifier mSectionClassifier; + @Mock private SectionStyleProvider mSectionStyleProvider; @Mock private NotifPipeline mNotifPipeline; @Mock private NodeController mAlertingHeaderController; @Mock private NodeController mSilentNodeController; @@ -94,7 +94,7 @@ public class RankingCoordinatorTest extends SysuiTestCase { mRankingCoordinator = new RankingCoordinator( mStatusBarStateController, mHighPriorityProvider, - mSectionClassifier, + mSectionStyleProvider, mAlertingHeaderController, mSilentHeaderController, mSilentNodeController); @@ -102,7 +102,7 @@ public class RankingCoordinatorTest extends SysuiTestCase { mEntry.setRanking(getRankingForUnfilteredNotif().build()); mRankingCoordinator.attach(mNotifPipeline); - verify(mSectionClassifier).setMinimizedSections(any()); + verify(mSectionStyleProvider).setMinimizedSections(any()); verify(mNotifPipeline, times(2)).addPreGroupFilter(mNotifFilterCaptor.capture()); mCapturedSuspendedFilter = mNotifFilterCaptor.getAllValues().get(0); mCapturedDozingFilter = mNotifFilterCaptor.getAllValues().get(1); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinatorTest.kt index 447ba1510e13..40859d0e6304 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinatorTest.kt @@ -21,13 +21,13 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.statusbar.notification.AssistantFeedbackController 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.NotificationEntry 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.OnAfterRenderEntryListener 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.util.mockito.any import com.android.systemui.util.mockito.eq @@ -53,7 +53,7 @@ class RowAppearanceCoordinatorTest : SysuiTestCase() { @Mock private lateinit var pipeline: NotifPipeline @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 section2: NotifSection @@ -66,7 +66,7 @@ class RowAppearanceCoordinatorTest : SysuiTestCase() { coordinator = RowAppearanceCoordinator( mContext, assistantFeedbackController, - sectionClassifier + sectionStyleProvider ) coordinator.attach(pipeline) beforeRenderListListener = withArgCaptor { @@ -82,8 +82,8 @@ class RowAppearanceCoordinatorTest : SysuiTestCase() { @Test fun testSetSystemExpandedOnlyOnFirst() { - whenever(sectionClassifier.isMinimizedSection(eq(section1))).thenReturn(false) - whenever(sectionClassifier.isMinimizedSection(eq(section1))).thenReturn(false) + whenever(sectionStyleProvider.isMinimizedSection(eq(section1))).thenReturn(false) + whenever(sectionStyleProvider.isMinimizedSection(eq(section1))).thenReturn(false) beforeRenderListListener.onBeforeRenderList(listOf(entry1, entry2)) afterRenderEntryListener.onAfterRenderEntry(entry1, controller1) verify(controller1).setSystemExpanded(eq(true)) @@ -93,8 +93,8 @@ class RowAppearanceCoordinatorTest : SysuiTestCase() { @Test fun testSetSystemExpandedNeverIfMinimized() { - whenever(sectionClassifier.isMinimizedSection(eq(section1))).thenReturn(true) - whenever(sectionClassifier.isMinimizedSection(eq(section1))).thenReturn(true) + whenever(sectionStyleProvider.isMinimizedSection(eq(section1))).thenReturn(true) + whenever(sectionStyleProvider.isMinimizedSection(eq(section1))).thenReturn(true) beforeRenderListListener.onBeforeRenderList(listOf(entry1, entry2)) afterRenderEntryListener.onAfterRenderEntry(entry1, controller1) verify(controller1).setSystemExpanded(eq(false)) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt index dd15caebf9e6..246943e3088e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt @@ -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 +import android.database.ContentObserver +import android.os.Handler +import android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase 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.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.runner.RunWith +import org.mockito.Mockito.clearInvocations +import org.mockito.Mockito.inOrder import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.Mockito.`when` as whenever @SmallTest @RunWith(AndroidTestingRunner::class) @RunWithLooper class NotifUiAdjustmentProviderTest : SysuiTestCase() { 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( + handler, + secureSettings, 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 fun notifLockscreenStateChangeWillNotifDirty() { val dirtyListener = mock<Runnable>() @@ -33,6 +91,35 @@ class NotifUiAdjustmentProviderTest : SysuiTestCase() { verify(lockscreenUserManager).addNotificationStateChangedListener(capture()) } 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) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderTest.kt index 0e1865861cae..ff601938d544 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderTest.kt @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.collection.render import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase 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.GroupEntryBuilder 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.listbuilder.NotifSection 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_PEOPLE import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT |