Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a793774a authored by András Kurucz's avatar András Kurucz Committed by Android (Google) Code Review
Browse files

Merge "Show SceneContainer when a HUN is active" into main

parents fd2b976f f9a0186a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
@@ -268,6 +269,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {
                windowController = mock(),
                deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor,
                centralSurfaces = mock(),
                headsUpInteractor = kosmos.headsUpNotificationInteractor,
            )
        startable.start()

+9 −0
Original line number Diff line number Diff line
@@ -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
+11 −0
Original line number Diff line number Diff line
@@ -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")
+9 −1
Original line number Diff line number Diff line
@@ -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
}
+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