Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd355c09 authored by Nick Chameyev's avatar Nick Chameyev
Browse files

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
parent e1edc97d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)
                }
            }
+7 −5
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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)
+37 −0
Original line number Diff line number Diff line
@@ -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)
+6 −5
Original line number Diff line number Diff line
@@ -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) }
    }