Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationListInteractor.kt +17 −15 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.notification.domain.interactor import android.graphics.drawable.Icon import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel Loading Loading @@ -44,28 +45,29 @@ constructor( */ fun setRenderedList(entries: List<ListEntry>) { repository.activeNotifications.update { existingModels -> entries.associateBy( entries .asSequence() .mapNotNull { it.representativeEntry } .associateBy( keySelector = { it.key }, valueTransform = { it.toModel(existingModels) }, ) } } private fun ListEntry.toModel( existingModels: ModelStore, ): ActiveNotificationModel = private fun NotificationEntry.toModel(existingModels: ModelStore): ActiveNotificationModel = existingModels.createOrReuse( key = key, groupKey = representativeEntry?.sbn?.groupKey, groupKey = sbn.groupKey, isAmbient = sectionStyleProvider.isMinimized(this), isRowDismissed = representativeEntry?.isRowDismissed == true, isRowDismissed = isRowDismissed, isSilent = sectionStyleProvider.isSilent(this), isLastMessageFromReply = representativeEntry?.isLastMessageFromReply == true, isSuppressedFromStatusBar = representativeEntry?.shouldSuppressStatusBar() == true, isPulsing = representativeEntry?.showingPulsing() == true, aodIcon = representativeEntry?.icons?.aodIcon?.sourceIcon, shelfIcon = representativeEntry?.icons?.shelfIcon?.sourceIcon, statusBarIcon = representativeEntry?.icons?.statusBarIcon?.sourceIcon, isLastMessageFromReply = isLastMessageFromReply, isSuppressedFromStatusBar = shouldSuppressStatusBar(), isPulsing = showingPulsing(), aodIcon = icons.aodIcon?.sourceIcon, shelfIcon = icons.shelfIcon?.sourceIcon, statusBarIcon = icons.statusBarIcon?.sourceIcon, ) private fun ModelStore.createOrReuse( Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationsListInteractorTest.kt +12 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository import com.android.systemui.statusbar.notification.shared.byKey import com.android.systemui.util.mockito.mock Loading @@ -42,7 +43,17 @@ class RenderNotificationsListInteractorTest : SysuiTestCase() { fun setRenderedList_preservesOrdering() = runTest { val notifs by collectLastValue(notifsInteractor.notifications) val keys = (1..50).shuffled().map { "$it" } val entries = keys.map { mock<ListEntry> { whenever(key).thenReturn(it) } } val entries = keys.map { mock<ListEntry> { val mockRep = mock<NotificationEntry> { whenever(key).thenReturn(it) whenever(sbn).thenReturn(mock()) whenever(icons).thenReturn(mock()) } whenever(representativeEntry).thenReturn(mockRep) } } underTest.setRenderedList(entries) assertThat(notifs).comparingElementsUsing(byKey).containsExactlyElementsIn(keys).inOrder() } Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationListInteractor.kt +17 −15 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.notification.domain.interactor import android.graphics.drawable.Icon import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel Loading Loading @@ -44,28 +45,29 @@ constructor( */ fun setRenderedList(entries: List<ListEntry>) { repository.activeNotifications.update { existingModels -> entries.associateBy( entries .asSequence() .mapNotNull { it.representativeEntry } .associateBy( keySelector = { it.key }, valueTransform = { it.toModel(existingModels) }, ) } } private fun ListEntry.toModel( existingModels: ModelStore, ): ActiveNotificationModel = private fun NotificationEntry.toModel(existingModels: ModelStore): ActiveNotificationModel = existingModels.createOrReuse( key = key, groupKey = representativeEntry?.sbn?.groupKey, groupKey = sbn.groupKey, isAmbient = sectionStyleProvider.isMinimized(this), isRowDismissed = representativeEntry?.isRowDismissed == true, isRowDismissed = isRowDismissed, isSilent = sectionStyleProvider.isSilent(this), isLastMessageFromReply = representativeEntry?.isLastMessageFromReply == true, isSuppressedFromStatusBar = representativeEntry?.shouldSuppressStatusBar() == true, isPulsing = representativeEntry?.showingPulsing() == true, aodIcon = representativeEntry?.icons?.aodIcon?.sourceIcon, shelfIcon = representativeEntry?.icons?.shelfIcon?.sourceIcon, statusBarIcon = representativeEntry?.icons?.statusBarIcon?.sourceIcon, isLastMessageFromReply = isLastMessageFromReply, isSuppressedFromStatusBar = shouldSuppressStatusBar(), isPulsing = showingPulsing(), aodIcon = icons.aodIcon?.sourceIcon, shelfIcon = icons.shelfIcon?.sourceIcon, statusBarIcon = icons.statusBarIcon?.sourceIcon, ) private fun ModelStore.createOrReuse( Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationsListInteractorTest.kt +12 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository import com.android.systemui.statusbar.notification.shared.byKey import com.android.systemui.util.mockito.mock Loading @@ -42,7 +43,17 @@ class RenderNotificationsListInteractorTest : SysuiTestCase() { fun setRenderedList_preservesOrdering() = runTest { val notifs by collectLastValue(notifsInteractor.notifications) val keys = (1..50).shuffled().map { "$it" } val entries = keys.map { mock<ListEntry> { whenever(key).thenReturn(it) } } val entries = keys.map { mock<ListEntry> { val mockRep = mock<NotificationEntry> { whenever(key).thenReturn(it) whenever(sbn).thenReturn(mock()) whenever(icons).thenReturn(mock()) } whenever(representativeEntry).thenReturn(mockRep) } } underTest.setRenderedList(entries) assertThat(notifs).comparingElementsUsing(byKey).containsExactlyElementsIn(keys).inOrder() } Loading