diff options
3 files changed, 194 insertions, 209 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.java deleted file mode 100644 index 544d20145db3..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (C) 2019 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.coordinator; - -import static android.app.Notification.FLAG_FOREGROUND_SERVICE; -import static android.app.Notification.FLAG_PROMOTED_ONGOING; -import static android.app.NotificationManager.IMPORTANCE_DEFAULT; -import static android.app.NotificationManager.IMPORTANCE_HIGH; -import static android.app.NotificationManager.IMPORTANCE_MIN; - -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -import android.app.Notification; -import android.app.PendingIntent; -import android.app.Person; -import android.content.Intent; -import android.graphics.Color; -import android.os.UserHandle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; -import android.testing.TestableLooper; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; - -import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.notification.collection.NotifPipeline; -import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; -import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter; -import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; -import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -@SmallTest -@RunWith(AndroidJUnit4.class) -@TestableLooper.RunWithLooper -public class ColorizedFgsCoordinatorTest extends SysuiTestCase { - - private static final int NOTIF_USER_ID = 0; - @Mock private NotifPipeline mNotifPipeline; - - private NotificationEntryBuilder mEntryBuilder; - private ColorizedFgsCoordinator mColorizedFgsCoordinator; - private NotifSectioner mFgsSection; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - allowTestableLooperAsMainThread(); - - mColorizedFgsCoordinator = new ColorizedFgsCoordinator(); - - mEntryBuilder = new NotificationEntryBuilder() - .setUser(new UserHandle(NOTIF_USER_ID)); - - mColorizedFgsCoordinator.attach(mNotifPipeline); - - mFgsSection = mColorizedFgsCoordinator.getSectioner(); - } - - @Test - public void testIncludeFGSInSection_importanceDefault() { - // GIVEN the notification represents a colorized foreground service with > min importance - mEntryBuilder - .setFlag(mContext, FLAG_FOREGROUND_SERVICE, true) - .setImportance(IMPORTANCE_DEFAULT) - .modifyNotification(mContext) - .setColorized(true).setColor(Color.WHITE); - - // THEN the entry is in the fgs section - assertTrue(mFgsSection.isInSection(mEntryBuilder.build())); - } - - @Test - public void testDiscludeFGSInSection_importanceMin() { - // GIVEN the notification represents a colorized foreground service with min importance - mEntryBuilder - .setFlag(mContext, FLAG_FOREGROUND_SERVICE, true) - .setImportance(IMPORTANCE_MIN) - .modifyNotification(mContext) - .setColorized(true).setColor(Color.WHITE); - - // THEN the entry is NOT in the fgs section - assertFalse(mFgsSection.isInSection(mEntryBuilder.build())); - } - - @Test - public void testDiscludeNonFGSInSection() { - // GIVEN the notification represents a colorized notification with high importance that - // is NOT a foreground service - mEntryBuilder - .setImportance(IMPORTANCE_HIGH) - .setFlag(mContext, FLAG_FOREGROUND_SERVICE, false) - .modifyNotification(mContext).setColorized(false); - - // THEN the entry is NOT in the fgs section - assertFalse(mFgsSection.isInSection(mEntryBuilder.build())); - } - - @Test - public void testIncludeCallInSection_importanceDefault() { - // GIVEN the notification represents a call with > min importance - mEntryBuilder - .setImportance(IMPORTANCE_DEFAULT) - .modifyNotification(mContext) - .setStyle(makeCallStyle()); - - // THEN the entry is in the fgs section - assertTrue(mFgsSection.isInSection(mEntryBuilder.build())); - } - - @Test - public void testDiscludeCallInSection_importanceMin() { - // GIVEN the notification represents a call with min importance - mEntryBuilder - .setImportance(IMPORTANCE_MIN) - .modifyNotification(mContext) - .setStyle(makeCallStyle()); - - // THEN the entry is NOT in the fgs section - assertFalse(mFgsSection.isInSection(mEntryBuilder.build())); - } - - @Test - @EnableFlags(PromotedNotificationUi.FLAG_NAME) - public void testIncludePromotedOngoingInSection_flagEnabled() { - // GIVEN the notification has FLAG_PROMOTED_ONGOING - mEntryBuilder.setFlag(mContext, FLAG_PROMOTED_ONGOING, true); - - // THEN the entry is in the fgs section - assertTrue(mFgsSection.isInSection(mEntryBuilder.build())); - } - - @Test - @DisableFlags(PromotedNotificationUi.FLAG_NAME) - public void testDiscludePromotedOngoingInSection_flagDisabled() { - // GIVEN the notification has FLAG_PROMOTED_ONGOING - mEntryBuilder.setFlag(mContext, FLAG_PROMOTED_ONGOING, true); - - // THEN the entry is NOT in the fgs section - assertFalse(mFgsSection.isInSection(mEntryBuilder.build())); - } - - @Test - @EnableFlags(PromotedNotificationUi.FLAG_NAME) - public void promoterSelectsPromotedOngoing_flagEnabled() { - ArgumentCaptor<NotifPromoter> captor = ArgumentCaptor.forClass(NotifPromoter.class); - verify(mNotifPipeline).addPromoter(captor.capture()); - NotifPromoter promoter = captor.getValue(); - - // GIVEN the notification has FLAG_PROMOTED_ONGOING - mEntryBuilder.setFlag(mContext, FLAG_PROMOTED_ONGOING, true); - - // THEN the entry is promoted to top level - assertTrue(promoter.shouldPromoteToTopLevel(mEntryBuilder.build())); - } - - @Test - @EnableFlags(PromotedNotificationUi.FLAG_NAME) - public void promoterIgnoresNonPromotedOngoing_flagEnabled() { - ArgumentCaptor<NotifPromoter> captor = ArgumentCaptor.forClass(NotifPromoter.class); - verify(mNotifPipeline).addPromoter(captor.capture()); - NotifPromoter promoter = captor.getValue(); - - // GIVEN the notification does not have FLAG_PROMOTED_ONGOING - mEntryBuilder.setFlag(mContext, FLAG_PROMOTED_ONGOING, false); - - // THEN the entry is NOT promoted to top level - assertFalse(promoter.shouldPromoteToTopLevel(mEntryBuilder.build())); - } - - @Test - @DisableFlags(PromotedNotificationUi.FLAG_NAME) - public void noPromoterAdded_flagDisabled() { - verify(mNotifPipeline, never()).addPromoter(any()); - } - - private Notification.CallStyle makeCallStyle() { - final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, - new Intent("action"), PendingIntent.FLAG_IMMUTABLE); - final Person person = new Person.Builder().setName("person").build(); - return Notification.CallStyle.forIncomingCall(person, pendingIntent, pendingIntent); - } -} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.kt new file mode 100644 index 000000000000..e93c74252251 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.kt @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2019 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.coordinator + +import android.app.Notification +import android.app.NotificationManager +import android.app.PendingIntent +import android.app.Person +import android.content.Intent +import android.graphics.Color +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import android.testing.TestableLooper.RunWithLooper +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.kosmos.useUnconfinedTestDispatcher +import com.android.systemui.statusbar.notification.collection.buildEntry +import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter +import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner +import com.android.systemui.statusbar.notification.collection.notifPipeline +import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi +import com.android.systemui.testKosmos +import com.android.systemui.util.mockito.withArgCaptor +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.never +import org.mockito.kotlin.verify + +@SmallTest +@RunWith(AndroidJUnit4::class) +@RunWithLooper +class ColorizedFgsCoordinatorTest : SysuiTestCase() { + private val kosmos = testKosmos().useUnconfinedTestDispatcher() + private val notifPipeline + get() = kosmos.notifPipeline + + private lateinit var colorizedFgsCoordinator: ColorizedFgsCoordinator + private lateinit var sectioner: NotifSectioner + + @Before + fun setup() { + allowTestableLooperAsMainThread() + + colorizedFgsCoordinator = ColorizedFgsCoordinator() + colorizedFgsCoordinator.attach(notifPipeline) + sectioner = colorizedFgsCoordinator.sectioner + } + + @Test + fun testIncludeFGSInSection_importanceDefault() { + // GIVEN the notification represents a colorized foreground service with > min importance + val entry = buildEntry { + setFlag(mContext, Notification.FLAG_FOREGROUND_SERVICE, true) + setImportance(NotificationManager.IMPORTANCE_DEFAULT) + modifyNotification(mContext).setColorized(true).setColor(Color.WHITE) + } + + // THEN the entry is in the fgs section + assertTrue(sectioner.isInSection(entry)) + } + + @Test + fun testDiscludeFGSInSection_importanceMin() { + // GIVEN the notification represents a colorized foreground service with min importance + val entry = buildEntry { + setFlag(mContext, Notification.FLAG_FOREGROUND_SERVICE, true) + setImportance(NotificationManager.IMPORTANCE_MIN) + modifyNotification(mContext).setColorized(true).setColor(Color.WHITE) + } + + // THEN the entry is NOT in the fgs section + assertFalse(sectioner.isInSection(entry)) + } + + @Test + fun testDiscludeNonFGSInSection() { + // GIVEN the notification represents a colorized notification with high importance that + // is NOT a foreground service + val entry = buildEntry { + setImportance(NotificationManager.IMPORTANCE_HIGH) + setFlag(mContext, Notification.FLAG_FOREGROUND_SERVICE, false) + modifyNotification(mContext).setColorized(false) + } + + // THEN the entry is NOT in the fgs section + assertFalse(sectioner.isInSection(entry)) + } + + @Test + fun testIncludeCallInSection_importanceDefault() { + // GIVEN the notification represents a call with > min importance + val entry = buildEntry { + setImportance(NotificationManager.IMPORTANCE_DEFAULT) + modifyNotification(mContext).setStyle(makeCallStyle()) + } + + // THEN the entry is in the fgs section + assertTrue(sectioner.isInSection(entry)) + } + + @Test + fun testDiscludeCallInSection_importanceMin() { + // GIVEN the notification represents a call with min importance + val entry = buildEntry { + setImportance(NotificationManager.IMPORTANCE_MIN) + modifyNotification(mContext).setStyle(makeCallStyle()) + } + + // THEN the entry is NOT in the fgs section + assertFalse(sectioner.isInSection(entry)) + } + + @Test + @EnableFlags(PromotedNotificationUi.FLAG_NAME) + fun testIncludePromotedOngoingInSection_flagEnabled() { + // GIVEN the notification has FLAG_PROMOTED_ONGOING + val entry = buildEntry { setFlag(mContext, Notification.FLAG_PROMOTED_ONGOING, true) } + + // THEN the entry is in the fgs section + assertTrue(sectioner.isInSection(entry)) + } + + @Test + @DisableFlags(PromotedNotificationUi.FLAG_NAME) + fun testDiscludePromotedOngoingInSection_flagDisabled() { + // GIVEN the notification has FLAG_PROMOTED_ONGOING + val entry = buildEntry { setFlag(mContext, Notification.FLAG_PROMOTED_ONGOING, true) } + + // THEN the entry is NOT in the fgs section + assertFalse(sectioner.isInSection(entry)) + } + + @Test + @EnableFlags(PromotedNotificationUi.FLAG_NAME) + fun promoterSelectsPromotedOngoing_flagEnabled() { + val promoter: NotifPromoter = withArgCaptor { verify(notifPipeline).addPromoter(capture()) } + + // GIVEN the notification has FLAG_PROMOTED_ONGOING + val entry = buildEntry { setFlag(mContext, Notification.FLAG_PROMOTED_ONGOING, true) } + + // THEN the entry is promoted to top level + assertTrue(promoter.shouldPromoteToTopLevel(entry)) + } + + @Test + @EnableFlags(PromotedNotificationUi.FLAG_NAME) + fun promoterIgnoresNonPromotedOngoing_flagEnabled() { + val promoter: NotifPromoter = withArgCaptor { verify(notifPipeline).addPromoter(capture()) } + + // GIVEN the notification does not have FLAG_PROMOTED_ONGOING + val entry = buildEntry { setFlag(mContext, Notification.FLAG_PROMOTED_ONGOING, false) } + + // THEN the entry is NOT promoted to top level + assertFalse(promoter.shouldPromoteToTopLevel(entry)) + } + + @Test + @DisableFlags(PromotedNotificationUi.FLAG_NAME) + fun noPromoterAdded_flagDisabled() { + verify(notifPipeline, never()).addPromoter(any()) + } + + private fun makeCallStyle(): Notification.CallStyle { + val pendingIntent = + PendingIntent.getBroadcast(mContext, 0, Intent("action"), PendingIntent.FLAG_IMMUTABLE) + val person = Person.Builder().setName("person").build() + return Notification.CallStyle.forOngoingCall(person, pendingIntent) + } + + companion object { + private const val NOTIF_USER_ID = 0 + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/EntryUtil.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/EntryUtil.kt index 8b4de2bcc26f..05f1c0bac982 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/EntryUtil.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/EntryUtil.kt @@ -33,3 +33,6 @@ inline fun NotificationEntry.modifyEntry( fun getAttachState(entry: ListEntry): ListAttachState { return entry.attachState } + +fun buildEntry(block: NotificationEntryBuilder.() -> Unit) = + NotificationEntryBuilder().apply(block).build() |