diff options
8 files changed, 171 insertions, 1 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index 7c30c7eb7f50..67755744209e 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -67,6 +67,7 @@ import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel import com.android.systemui.settings.FakeDisplayTracker 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 @@ -267,6 +268,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { windowController = mock(), deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor, centralSurfaces = mock(), + headsUpInteractor = kosmos.headsUpNotificationInteractor, ) startable.start() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt index ffea84b70d07..f49b4777cf14 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt @@ -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 @@ -120,6 +122,7 @@ class SceneContainerStartableTest : SysuiTestCase() { windowController = windowController, deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor, centralSurfaces = centralSurfaces, + headsUpInteractor = kosmos.headsUpNotificationInteractor, ) } @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt index 605a5d9b6772..b642d38289fe 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt @@ -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 @@ -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() { @@ -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") diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationDataLayerModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationDataLayerModule.kt index b187cf15cccd..e5e5292d9a94 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationDataLayerModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationDataLayerModule.kt @@ -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( @@ -23,4 +26,9 @@ import dagger.Module NotificationSettingsRepositoryModule::class, ] ) -interface NotificationDataLayerModule +interface NotificationDataLayerModule { + @Binds + fun bindHeadsUpNotificationRepository( + impl: HeadsUpNotificationRepositoryImpl + ): HeadsUpNotificationRepository +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/repository/HeadsUpNotificationRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/repository/HeadsUpNotificationRepository.kt new file mode 100644 index 000000000000..d60ee9896758 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/repository/HeadsUpNotificationRepository.kt @@ -0,0 +1,59 @@ +/* + * 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> +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt new file mode 100644 index 000000000000..5c8f354de485 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt @@ -0,0 +1,27 @@ +/* + * 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.domain.interactor + +import com.android.systemui.statusbar.notification.data.repository.HeadsUpNotificationRepository +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow + +class HeadsUpNotificationInteractor @Inject constructor(repository: HeadsUpNotificationRepository) { + val isHeadsUpOrAnimatingAway: Flow<Boolean> = + // TODO(b/296118689): Needs to include the animating away state. + repository.hasPinnedHeadsUp +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/HeadsUpNotificationRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/HeadsUpNotificationRepositoryKosmos.kt new file mode 100644 index 000000000000..25864aee2136 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/HeadsUpNotificationRepositoryKosmos.kt @@ -0,0 +1,28 @@ +/* + * 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.stack.data.repository + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.statusbar.notification.data.repository.HeadsUpNotificationRepository +import kotlinx.coroutines.flow.MutableStateFlow + +val Kosmos.headsUpNotificationRepository by Fixture { FakeHeadsUpNotificationRepository() } + +class FakeHeadsUpNotificationRepository : HeadsUpNotificationRepository { + override val hasPinnedHeadsUp = MutableStateFlow(false) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/HeadsUpNotificationInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/HeadsUpNotificationInteractorKosmos.kt new file mode 100644 index 000000000000..d3451075c51b --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/HeadsUpNotificationInteractorKosmos.kt @@ -0,0 +1,26 @@ +/* + * 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.stack.domain.interactor + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor +import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository + +val Kosmos.headsUpNotificationInteractor by Fixture { + HeadsUpNotificationInteractor(headsUpNotificationRepository) +} |