diff options
5 files changed, 31 insertions, 12 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt index 8d1d90588fc3..b343adddcbe2 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt @@ -37,17 +37,23 @@ constructor( @MainThread fun enable(onShadeInteraction: Runnable) { - if (shadeExpansionCollectorJob == null) { - shadeExpansionCollectorJob = - scope.launch { - // wait for it to emit true once - shadeInteractorLazy.get().isUserInteracting.first { it } - onShadeInteraction.run() - } - shadeExpansionCollectorJob?.invokeOnCompletion { shadeExpansionCollectorJob = null } - } else { + if (shadeExpansionCollectorJob != null) { Log.e(TAG, "Already enabled") + return } + if (shadeInteractorLazy.get().isUserInteracting.value) { + Log.e(TAG, "isUserInteracting already true, skipping enable") + return + } + shadeExpansionCollectorJob = + scope.launch { + Log.i(TAG, "Enable detector") + // wait for it to emit true once + shadeInteractorLazy.get().isUserInteracting.first { it } + Log.i(TAG, "Detector detected shade interaction") + onShadeInteraction.run() + } + shadeExpansionCollectorJob?.invokeOnCompletion { shadeExpansionCollectorJob = null } } @MainThread diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt index 6a9757f3adfd..31a4de4d630e 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt @@ -39,7 +39,7 @@ interface ShadeInteractor : BaseShadeInteractor { * input (i.e. dragging a pointer). This will be true even if the user's input gesture had ended * but a transition they initiated is still animating. */ - val isUserInteracting: Flow<Boolean> + val isUserInteracting: StateFlow<Boolean> /** Are touches allowed on the notification panel? */ val isShadeTouchable: Flow<Boolean> diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt index d41c5a66ad82..6defbcf29a6c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt @@ -39,7 +39,7 @@ class ShadeInteractorEmptyImpl @Inject constructor() : ShadeInteractor { override val isAnyExpanded: StateFlow<Boolean> = inactiveFlowBoolean override val isUserInteractingWithShade: Flow<Boolean> = inactiveFlowBoolean override val isUserInteractingWithQs: Flow<Boolean> = inactiveFlowBoolean - override val isUserInteracting: Flow<Boolean> = inactiveFlowBoolean + override val isUserInteracting: StateFlow<Boolean> = inactiveFlowBoolean override val isShadeTouchable: Flow<Boolean> = inactiveFlowBoolean override val isExpandToQsEnabled: Flow<Boolean> = inactiveFlowBoolean } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt index 68600e9d6918..7a340d2f0268 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt @@ -65,9 +65,10 @@ constructor( override val isShadeFullyExpanded: Flow<Boolean> = baseShadeInteractor.shadeExpansion.map { it >= 1f }.distinctUntilChanged() - override val isUserInteracting: Flow<Boolean> = + override val isUserInteracting: StateFlow<Boolean> = combine(isUserInteractingWithShade, isUserInteractingWithQs) { shade, qs -> shade || qs } .distinctUntilChanged() + .stateIn(scope, SharingStarted.Eagerly, false) override val isShadeTouchable: Flow<Boolean> = combine( diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt index 993dbac747e8..54d6b53d58f8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt @@ -95,6 +95,18 @@ class AuthDialogPanelInteractionDetectorTest : SysuiTestCase() { } @Test + fun enableDetector_isUserInteractingTrue_shouldNotPostRunnable() = + testComponent.runTest { + // GIVEN isInteracting starts true + shadeRepository.setLegacyShadeTracking(true) + runCurrent() + detector.enable(action) + + // THEN action was not run + verifyZeroInteractions(action) + } + + @Test fun enableDetector_shadeExpandImmediate_shouldNotPostRunnable() = testComponent.runTest { // GIVEN shade is closed and detector is enabled |