Loading packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +2 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ import com.android.systemui.settings.FakeDisplayTracker import com.android.systemui.shade.domain.interactor.privacyChipInteractor import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor Loading Loading @@ -268,6 +269,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { windowController = mock(), deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor, centralSurfaces = mock(), headsUpInteractor = kosmos.headsUpNotificationInteractor, ) startable.start() Loading packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +9 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.fakeSceneDataSource import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor import com.android.systemui.statusbar.phone.CentralSurfaces import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository import com.android.systemui.statusbar.policy.data.repository.fakeDeviceProvisioningRepository Loading Loading @@ -120,6 +122,7 @@ class SceneContainerStartableTest : SysuiTestCase() { windowController = windowController, deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor, centralSurfaces = centralSurfaces, headsUpInteractor = kosmos.headsUpNotificationInteractor, ) } Loading Loading @@ -168,6 +171,12 @@ class SceneContainerStartableTest : SysuiTestCase() { fakeSceneDataSource.unpause(expectedScene = SceneKey.Gone) transitionStateFlow.value = ObservableTransitionState.Idle(SceneKey.Gone) assertThat(isVisible).isFalse() kosmos.headsUpNotificationRepository.hasPinnedHeadsUp.value = true assertThat(isVisible).isTrue() kosmos.headsUpNotificationRepository.hasPinnedHeadsUp.value = false assertThat(isVisible).isFalse() } @Test Loading packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +11 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.systemui.scene.shared.logger.SceneLogger import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor import com.android.systemui.statusbar.notification.stack.shared.flexiNotifsEnabled import com.android.systemui.statusbar.phone.CentralSurfaces import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor Loading Loading @@ -87,6 +88,7 @@ constructor( private val windowController: NotificationShadeWindowController, private val deviceProvisioningInteractor: DeviceProvisioningInteractor, private val centralSurfaces: CentralSurfaces, private val headsUpInteractor: HeadsUpNotificationInteractor, ) : CoreStartable { override fun start() { Loading Loading @@ -147,6 +149,15 @@ constructor( } } } .combine(headsUpInteractor.isHeadsUpOrAnimatingAway) { visibilityForTransitionState, isHeadsUpOrAnimatingAway -> if (isHeadsUpOrAnimatingAway) { true to "showing a HUN" } else { visibilityForTransitionState } } .distinctUntilChanged() } else { flowOf(false to "Device not provisioned or Factory Reset Protection active") Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationDataLayerModule.kt +9 −1 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ */ package com.android.systemui.statusbar.notification.data import com.android.systemui.statusbar.notification.data.repository.HeadsUpNotificationRepository import com.android.systemui.statusbar.notification.data.repository.HeadsUpNotificationRepositoryImpl import dagger.Binds import dagger.Module @Module( Loading @@ -23,4 +26,9 @@ import dagger.Module NotificationSettingsRepositoryModule::class, ] ) interface NotificationDataLayerModule interface NotificationDataLayerModule { @Binds fun bindHeadsUpNotificationRepository( impl: HeadsUpNotificationRepositoryImpl ): HeadsUpNotificationRepository } packages/SystemUI/src/com/android/systemui/statusbar/notification/data/repository/HeadsUpNotificationRepository.kt 0 → 100644 +59 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.data.repository import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.policy.HeadsUpManager import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow class HeadsUpNotificationRepositoryImpl @Inject constructor( headsUpManager: HeadsUpManager, ) : HeadsUpNotificationRepository { override val hasPinnedHeadsUp: Flow<Boolean> = conflatedCallbackFlow { val listener = object : OnHeadsUpChangedListener { override fun onHeadsUpPinnedModeChanged(inPinnedMode: Boolean) { trySend(headsUpManager.hasPinnedHeadsUp()) } override fun onHeadsUpPinned(entry: NotificationEntry?) { trySend(headsUpManager.hasPinnedHeadsUp()) } override fun onHeadsUpUnPinned(entry: NotificationEntry?) { trySend(headsUpManager.hasPinnedHeadsUp()) } override fun onHeadsUpStateChanged(entry: NotificationEntry, isHeadsUp: Boolean) { trySend(headsUpManager.hasPinnedHeadsUp()) } } trySend(headsUpManager.hasPinnedHeadsUp()) headsUpManager.addListener(listener) awaitClose { headsUpManager.removeListener(listener) } } } interface HeadsUpNotificationRepository { val hasPinnedHeadsUp: Flow<Boolean> } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +2 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ import com.android.systemui.settings.FakeDisplayTracker import com.android.systemui.shade.domain.interactor.privacyChipInteractor import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor Loading Loading @@ -268,6 +269,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { windowController = mock(), deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor, centralSurfaces = mock(), headsUpInteractor = kosmos.headsUpNotificationInteractor, ) startable.start() Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +9 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.fakeSceneDataSource import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor import com.android.systemui.statusbar.phone.CentralSurfaces import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository import com.android.systemui.statusbar.policy.data.repository.fakeDeviceProvisioningRepository Loading Loading @@ -120,6 +122,7 @@ class SceneContainerStartableTest : SysuiTestCase() { windowController = windowController, deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor, centralSurfaces = centralSurfaces, headsUpInteractor = kosmos.headsUpNotificationInteractor, ) } Loading Loading @@ -168,6 +171,12 @@ class SceneContainerStartableTest : SysuiTestCase() { fakeSceneDataSource.unpause(expectedScene = SceneKey.Gone) transitionStateFlow.value = ObservableTransitionState.Idle(SceneKey.Gone) assertThat(isVisible).isFalse() kosmos.headsUpNotificationRepository.hasPinnedHeadsUp.value = true assertThat(isVisible).isTrue() kosmos.headsUpNotificationRepository.hasPinnedHeadsUp.value = false assertThat(isVisible).isFalse() } @Test Loading
packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +11 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.systemui.scene.shared.logger.SceneLogger import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor import com.android.systemui.statusbar.notification.stack.shared.flexiNotifsEnabled import com.android.systemui.statusbar.phone.CentralSurfaces import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor Loading Loading @@ -87,6 +88,7 @@ constructor( private val windowController: NotificationShadeWindowController, private val deviceProvisioningInteractor: DeviceProvisioningInteractor, private val centralSurfaces: CentralSurfaces, private val headsUpInteractor: HeadsUpNotificationInteractor, ) : CoreStartable { override fun start() { Loading Loading @@ -147,6 +149,15 @@ constructor( } } } .combine(headsUpInteractor.isHeadsUpOrAnimatingAway) { visibilityForTransitionState, isHeadsUpOrAnimatingAway -> if (isHeadsUpOrAnimatingAway) { true to "showing a HUN" } else { visibilityForTransitionState } } .distinctUntilChanged() } else { flowOf(false to "Device not provisioned or Factory Reset Protection active") Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationDataLayerModule.kt +9 −1 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ */ package com.android.systemui.statusbar.notification.data import com.android.systemui.statusbar.notification.data.repository.HeadsUpNotificationRepository import com.android.systemui.statusbar.notification.data.repository.HeadsUpNotificationRepositoryImpl import dagger.Binds import dagger.Module @Module( Loading @@ -23,4 +26,9 @@ import dagger.Module NotificationSettingsRepositoryModule::class, ] ) interface NotificationDataLayerModule interface NotificationDataLayerModule { @Binds fun bindHeadsUpNotificationRepository( impl: HeadsUpNotificationRepositoryImpl ): HeadsUpNotificationRepository }
packages/SystemUI/src/com/android/systemui/statusbar/notification/data/repository/HeadsUpNotificationRepository.kt 0 → 100644 +59 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.data.repository import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.policy.HeadsUpManager import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow class HeadsUpNotificationRepositoryImpl @Inject constructor( headsUpManager: HeadsUpManager, ) : HeadsUpNotificationRepository { override val hasPinnedHeadsUp: Flow<Boolean> = conflatedCallbackFlow { val listener = object : OnHeadsUpChangedListener { override fun onHeadsUpPinnedModeChanged(inPinnedMode: Boolean) { trySend(headsUpManager.hasPinnedHeadsUp()) } override fun onHeadsUpPinned(entry: NotificationEntry?) { trySend(headsUpManager.hasPinnedHeadsUp()) } override fun onHeadsUpUnPinned(entry: NotificationEntry?) { trySend(headsUpManager.hasPinnedHeadsUp()) } override fun onHeadsUpStateChanged(entry: NotificationEntry, isHeadsUp: Boolean) { trySend(headsUpManager.hasPinnedHeadsUp()) } } trySend(headsUpManager.hasPinnedHeadsUp()) headsUpManager.addListener(listener) awaitClose { headsUpManager.removeListener(listener) } } } interface HeadsUpNotificationRepository { val hasPinnedHeadsUp: Flow<Boolean> }