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
This commit is contained in:
Nick Chameyev
2022-04-14 14:59:11 +01:00
parent e1edc97d38
commit fd355c0945
5 changed files with 52 additions and 12 deletions

View File

@@ -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)
}
}

View File

@@ -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)

View File

@@ -28,7 +28,7 @@ interface FoldStateProvider : CallbackController<FoldUpdatesListener> {
fun start()
fun stop()
val isFullyOpened: Boolean
val isFinishedOpening: Boolean
interface FoldUpdatesListener {
fun onHingeAngleUpdate(@FloatRange(from = 0.0, to = 180.0) angle: Float)

View File

@@ -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)

View File

@@ -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) }
}