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:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user