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

Commit 7974f606 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Hide ambient cue on shade or keyguard

Bug: 424063731
Bug: 424063255
Fixes: 424063731
Fixes: 424063255
Test: atest AmbientCueViewModelTest AmbientCueInteractorTest
Flag: com.android.systemui.enable_underlay
Change-Id: I21a27d6a6a3025070ef201195cc9c94eae5bd8d1
parent c4a91c99
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ import com.android.systemui.ambientcue.data.repository.ambientCueRepository
import com.android.systemui.ambientcue.data.repository.fake
import com.android.systemui.ambientcue.shared.model.ActionModel
import com.android.systemui.ambientcue.shared.model.IconModel
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.res.R
@@ -125,4 +127,30 @@ class AmbientCueInteractorTest : SysuiTestCase() {
            ambientCueRepository.fake.setTaskBarVisible(false)
            assertThat(isTaskBarVisible).isFalse()
        }

    @Test
    fun isOccludedBySystemUi_collapsedShade_noKeyguard_false() =
        kosmos.runTest {
            val isOccludedBySystemUi by collectLastValue(ambientCueInteractor.isOccludedBySystemUi)
            fakeKeyguardRepository.setKeyguardShowing(false)
            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
            assertThat(isOccludedBySystemUi).isFalse()
        }

    @Test
    fun isOccludedBySystemUi_whenKeyguardVisible_true() =
        kosmos.runTest {
            val isOccludedBySystemUi by collectLastValue(ambientCueInteractor.isOccludedBySystemUi)
            fakeKeyguardRepository.setKeyguardShowing(true)
            assertThat(isOccludedBySystemUi).isTrue()
        }

    @Test
    fun isOccludedBySystemUi_whenExpandedShade_true() =
        kosmos.runTest {
            val isOccludedBySystemUi by collectLastValue(ambientCueInteractor.isOccludedBySystemUi)
            // SHADE_LOCKED forces the expansion to 1f in ShadeInteractor
            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED)
            assertThat(isOccludedBySystemUi).isTrue()
        }
}
+25 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.systemui.ambientcue.data.repository.fake
import com.android.systemui.ambientcue.domain.interactor.ambientCueInteractor
import com.android.systemui.ambientcue.shared.model.ActionModel
import com.android.systemui.ambientcue.shared.model.IconModel
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.advanceTimeBy
import com.android.systemui.kosmos.runCurrent
@@ -95,6 +96,30 @@ class AmbientCueViewModelTest : SysuiTestCase() {
            assertThat(viewModel.isVisible).isFalse()
        }

    @Test
    fun isVisible_isOccludedBySystemUi_true() =
        kosmos.runTest {
            initializeIsVisible()
            assertThat(viewModel.isVisible).isTrue()

            fakeKeyguardRepository.setKeyguardShowing(false)
            runCurrent()

            assertThat(viewModel.isVisible).isTrue()
        }

    @Test
    fun isVisible_isOccludedBySystemUi_false() =
        kosmos.runTest {
            initializeIsVisible()
            assertThat(viewModel.isVisible).isTrue()

            fakeKeyguardRepository.setKeyguardShowing(true)
            runCurrent()

            assertThat(viewModel.isVisible).isFalse()
        }

    @Test
    fun onClick_collapses() =
        kosmos.runTest {
+17 −1
Original line number Diff line number Diff line
@@ -19,14 +19,30 @@ package com.android.systemui.ambientcue.domain.interactor
import android.graphics.Rect
import com.android.systemui.ambientcue.data.repository.AmbientCueRepository
import com.android.systemui.ambientcue.shared.model.ActionModel
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.update

class AmbientCueInteractor @Inject constructor(private val repository: AmbientCueRepository) {
class AmbientCueInteractor
@Inject
constructor(
    private val repository: AmbientCueRepository,
    shadeInteractor: ShadeInteractor,
    keyguardInteractor: KeyguardInteractor,
) {
    val isRootViewAttached: StateFlow<Boolean> = repository.isRootViewAttached
    val actions: StateFlow<List<ActionModel>> = repository.actions
    val isImeVisible: StateFlow<Boolean> = repository.isImeVisible
    val isOccludedBySystemUi: Flow<Boolean> =
        combine(shadeInteractor.isShadeFullyCollapsed, keyguardInteractor.isKeyguardVisible) {
            isShadeFullyCollapsed,
            isKeyguardVisible ->
            !isShadeFullyCollapsed || isKeyguardVisible
        }
    val isGestureNav: StateFlow<Boolean> = repository.isGestureNav
    val recentsButtonPosition: StateFlow<Rect?> = repository.recentsButtonPosition
    val isTaskBarVisible: StateFlow<Boolean> = repository.isTaskBarVisible
+8 −1
Original line number Diff line number Diff line
@@ -64,8 +64,15 @@ constructor(
            source = ambientCueInteractor.isImeVisible,
        )

    private val isOccludedBySystemUi: Boolean by
        hydrator.hydratedStateOf(
            traceName = "isOccludedBySystemUi",
            initialValue = false,
            source = ambientCueInteractor.isOccludedBySystemUi,
        )

    val isVisible: Boolean
        get() = isRootViewAttached && !isImeVisible
        get() = isRootViewAttached && !isImeVisible && !isOccludedBySystemUi

    var isExpanded: Boolean by mutableStateOf(false)
        private set
+5 −1
Original line number Diff line number Diff line
@@ -17,7 +17,11 @@
package com.android.systemui.ambientcue.domain.interactor

import com.android.systemui.ambientcue.data.repository.ambientCueRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.shade.domain.interactor.shadeInteractor

val Kosmos.ambientCueInteractor by Fixture { AmbientCueInteractor(ambientCueRepository) }
val Kosmos.ambientCueInteractor by Fixture {
    AmbientCueInteractor(ambientCueRepository, shadeInteractor, keyguardInteractor)
}