From fd355c0945a0524307c9d3d2e30fe7ae4330e029 Mon Sep 17 00:00:00 2001 From: Nick Chameyev Date: Thu, 14 Apr 2022 14:59:11 +0100 Subject: [PATCH] Finish unfold transition when screen turns on after half-folded When screen turns on after we received half-folded event the transition started and didn't end. We had the same issue when the fully unfolded event was received before screen turned on. In this case now we forcefully finish the transition. I added the same behaviour for half-folded case as well. Bug: 222705041 Test: quick folding/unfolding with only 0/10 degrees hinge angle sensor Test: atest com.android.systemui.unfold.updates.DeviceFoldStateProviderTest Change-Id: I964217acaaba77926c43796d16ad00a4ca15203e --- ...csBasedUnfoldTransitionProgressProvider.kt | 2 +- .../unfold/updates/DeviceFoldStateProvider.kt | 12 +++--- .../unfold/updates/FoldStateProvider.kt | 2 +- .../updates/DeviceFoldStateProviderTest.kt | 37 +++++++++++++++++++ .../unfold/util/TestFoldStateProvider.kt | 11 +++--- 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt index 3daae75aaed7d..04d920cb15d5f 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt @@ -77,7 +77,7 @@ class PhysicsBasedUnfoldTransitionProgressProvider( // Stop the animation if the device has already opened by the time when // the display is available as we won't receive the full open event anymore - if (foldStateProvider.isFullyOpened) { + if (foldStateProvider.isFinishedOpening) { cancelTransition(endValue = 1f, animate = true) } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt index ed973d6a68544..959c97ba6ee46 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt @@ -81,10 +81,12 @@ constructor( outputListeners.remove(listener) } - override val isFullyOpened: Boolean - get() = !isFolded && lastFoldUpdate == FOLD_UPDATE_FINISH_FULL_OPEN + override val isFinishedOpening: Boolean + get() = !isFolded && + (lastFoldUpdate == FOLD_UPDATE_FINISH_FULL_OPEN || + lastFoldUpdate == FOLD_UPDATE_FINISH_HALF_OPEN) - private val isTransitionInProgess: Boolean + private val isTransitionInProgress: Boolean get() = lastFoldUpdate == FOLD_UPDATE_START_OPENING || lastFoldUpdate == FOLD_UPDATE_START_CLOSING @@ -104,7 +106,7 @@ constructor( notifyFoldUpdate(FOLD_UPDATE_START_CLOSING) } - if (isTransitionInProgess) { + if (isTransitionInProgress) { if (isFullyOpened) { notifyFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) cancelTimeout() @@ -168,7 +170,7 @@ constructor( } private fun rescheduleAbortAnimationTimeout() { - if (isTransitionInProgess) { + if (isTransitionInProgress) { cancelTimeout() } handler.postDelayed(timeoutRunnable, HALF_OPENED_TIMEOUT_MILLIS) diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt index 5495316cd5b22..14a3a70fc6b0d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt @@ -28,7 +28,7 @@ interface FoldStateProvider : CallbackController { fun start() fun stop() - val isFullyOpened: Boolean + val isFinishedOpening: Boolean interface FoldUpdatesListener { fun onHingeAngleUpdate(@FloatRange(from = 0.0, to = 180.0) angle: Float) diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt index 7ac243452222c..f2ec3acbc765b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt @@ -199,6 +199,43 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { assertThat(foldUpdates).isEmpty() } + @Test + fun testUnfoldedOpenedHingeAngleEmitted_isFinishedOpeningIsFalse() { + setFoldState(folded = false) + + sendHingeAngleEvent(10) + + assertThat(foldStateProvider.isFinishedOpening).isFalse() + } + + @Test + fun testFoldedHalfOpenHingeAngleEmitted_isFinishedOpeningIsFalse() { + setFoldState(folded = true) + + sendHingeAngleEvent(10) + + assertThat(foldStateProvider.isFinishedOpening).isFalse() + } + + @Test + fun testFoldedFullyOpenHingeAngleEmitted_isFinishedOpeningIsTrue() { + setFoldState(folded = false) + + sendHingeAngleEvent(180) + + assertThat(foldStateProvider.isFinishedOpening).isTrue() + } + + @Test + fun testUnfoldedHalfOpenOpened_afterTimeout_isFinishedOpeningIsTrue() { + setFoldState(folded = false) + + sendHingeAngleEvent(10) + simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS) + + assertThat(foldStateProvider.isFinishedOpening).isTrue() + } + @Test fun startClosingEvent_afterTimeout_abortEmitted() { sendHingeAngleEvent(90) diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt index dd307b4b21e99..8f851ec60981a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt @@ -16,6 +16,7 @@ package com.android.systemui.unfold.util import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN +import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_HALF_OPEN import com.android.systemui.unfold.updates.FoldStateProvider import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdatesListener @@ -31,10 +32,10 @@ class TestFoldStateProvider : FoldStateProvider { listeners.clear() } - private var _isFullyOpened: Boolean = false + private var _isFinishedOpening: Boolean = false - override val isFullyOpened: Boolean - get() = _isFullyOpened + override val isFinishedOpening: Boolean + get() = _isFinishedOpening override fun addCallback(listener: FoldUpdatesListener) { listeners += listener @@ -45,8 +46,8 @@ class TestFoldStateProvider : FoldStateProvider { } fun sendFoldUpdate(@FoldUpdate update: Int) { - if (update == FOLD_UPDATE_FINISH_FULL_OPEN) { - _isFullyOpened = true + if (update == FOLD_UPDATE_FINISH_FULL_OPEN || update == FOLD_UPDATE_FINISH_HALF_OPEN) { + _isFinishedOpening = true } listeners.forEach { it.onFoldUpdate(update) } }