Loading packages/SystemUI/multivalentTests/src/com/android/systemui/ambientcue/domain/interactor/AmbientCueInteractorTest.kt +28 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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() } } packages/SystemUI/multivalentTests/src/com/android/systemui/ambientcue/ui/viewmodel/AmbientCueViewModelTest.kt +25 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -96,6 +97,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 { Loading packages/SystemUI/src/com/android/systemui/ambientcue/domain/interactor/AmbientCueInteractor.kt +17 −1 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/ambientcue/ui/viewmodel/AmbientCueViewModel.kt +8 −1 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SystemUI/tests/utils/src/com/android/systemui/ambientcue/domain/interactor/AmbientCueInteractorKosmos.kt +5 −1 Original line number Diff line number Diff line Loading @@ -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) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/ambientcue/domain/interactor/AmbientCueInteractorTest.kt +28 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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() } }
packages/SystemUI/multivalentTests/src/com/android/systemui/ambientcue/ui/viewmodel/AmbientCueViewModelTest.kt +25 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -96,6 +97,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 { Loading
packages/SystemUI/src/com/android/systemui/ambientcue/domain/interactor/AmbientCueInteractor.kt +17 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/ambientcue/ui/viewmodel/AmbientCueViewModel.kt +8 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/tests/utils/src/com/android/systemui/ambientcue/domain/interactor/AmbientCueInteractorKosmos.kt +5 −1 Original line number Diff line number Diff line Loading @@ -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) }