diff options
5 files changed, 63 insertions, 1 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImplTest.kt index aef9163a65ab..b917014d4798 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImplTest.kt @@ -124,4 +124,36 @@ class ShadeAnimationInteractorSceneContainerImplTest : SysuiTestCase() { underTest.setIsLaunchingActivity(true) Truth.assertThat(underTest.isLaunchingActivity.value).isEqualTo(true) } + + @Test + fun isAnyFlingAnimationRunning() = + testScope.runTest() { + val actual by collectLastValue(underTest.isAnyFlingAnimationRunning) + + // WHEN transitioning from QS to Gone with user input ongoing + val userInputOngoing = MutableStateFlow(true) + val transitionState = + MutableStateFlow<ObservableTransitionState>( + ObservableTransitionState.Transition( + fromScene = Scenes.QuickSettings, + toScene = Scenes.Gone, + currentScene = flowOf(Scenes.QuickSettings), + progress = MutableStateFlow(.1f), + isInitiatedByUserInput = true, + isUserInputOngoing = userInputOngoing, + ) + ) + sceneInteractor.setTransitionState(transitionState) + runCurrent() + + // THEN qs is not flinging + Truth.assertThat(actual).isFalse() + + // WHEN user input ends + userInputOngoing.value = false + runCurrent() + + // THEN qs is flinging + Truth.assertThat(actual).isTrue() + } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractor.kt index 134c983f7b30..d1a0a6dd2e3c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractor.kt @@ -17,6 +17,7 @@ package com.android.systemui.shade.domain.interactor import com.android.systemui.shade.data.repository.ShadeAnimationRepository +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -38,4 +39,7 @@ abstract class ShadeAnimationInteractor( * that is not considered "closing". */ abstract val isAnyCloseAnimationRunning: StateFlow<Boolean> + + /** Whether a short animation to expand or collapse is running after user input has ended. */ + abstract val isAnyFlingAnimationRunning: Flow<Boolean> } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorEmptyImpl.kt index f364d6ddf939..dbc1b3be4f92 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorEmptyImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorEmptyImpl.kt @@ -20,6 +20,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.shade.data.repository.ShadeAnimationRepository import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.flowOf /** Implementation of ShadeAnimationInteractor for shadeless SysUI variants. */ @SysUISingleton @@ -29,4 +30,5 @@ constructor( shadeAnimationRepository: ShadeAnimationRepository, ) : ShadeAnimationInteractor(shadeAnimationRepository) { override val isAnyCloseAnimationRunning = MutableStateFlow(false) + override val isAnyFlingAnimationRunning = flowOf(false) } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorLegacyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorLegacyImpl.kt index c4f41346eab7..32d8659e9180 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorLegacyImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorLegacyImpl.kt @@ -20,6 +20,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.shade.data.repository.ShadeAnimationRepository import com.android.systemui.shade.data.repository.ShadeRepository import javax.inject.Inject +import kotlinx.coroutines.flow.map /** Implementation of ShadeAnimationInteractor compatible with NPVC. */ @SysUISingleton @@ -30,4 +31,5 @@ constructor( shadeRepository: ShadeRepository, ) : ShadeAnimationInteractor(shadeAnimationRepository) { override val isAnyCloseAnimationRunning = shadeRepository.legacyIsClosing + override val isAnyFlingAnimationRunning = shadeRepository.currentFling.map { it != null } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImpl.kt index d9982e39e958..79a94a51768c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImpl.kt @@ -36,12 +36,12 @@ import kotlinx.coroutines.flow.stateIn @SysUISingleton class ShadeAnimationInteractorSceneContainerImpl @Inject +@OptIn(ExperimentalCoroutinesApi::class) constructor( @Background scope: CoroutineScope, shadeAnimationRepository: ShadeAnimationRepository, sceneInteractor: SceneInteractor, ) : ShadeAnimationInteractor(shadeAnimationRepository) { - @OptIn(ExperimentalCoroutinesApi::class) override val isAnyCloseAnimationRunning = sceneInteractor.transitionState .flatMapLatest { state -> @@ -62,4 +62,26 @@ constructor( } .distinctUntilChanged() .stateIn(scope, SharingStarted.Eagerly, false) + + override val isAnyFlingAnimationRunning = + sceneInteractor.transitionState + .flatMapLatest { state -> + when (state) { + is ObservableTransitionState.Idle -> flowOf(false) + is ObservableTransitionState.Transition -> + if ( + state.isInitiatedByUserInput && + (state.fromScene == Scenes.Shade || + state.toScene == Scenes.Shade || + state.fromScene == Scenes.QuickSettings || + state.toScene == Scenes.QuickSettings) + ) { + state.isUserInputOngoing.map { !it } + } else { + flowOf(false) + } + } + } + .distinctUntilChanged() + .stateIn(scope, SharingStarted.Eagerly, false) } |