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

Commit b680365e authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato
Browse files

Replace aborted with half_open in FoldStateProvider

All FOLD_UPDATE_ABORTED emissions were due to device stuck in half opened state.

This will allow us to log FULL_OPEN, HALF_OPEN and FULL_CLOSED states easily.

+ Removed some unused states.
+ DeviceFoldStateProviderTest.kt formatted with ktfmt

Bug: 198305865
Test: atest DeviceFoldStateProviderTest
Change-Id: Iadbe4bdc4cbdf2720efb46fbd69cfadf0b8357a8
parent e62cb766
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
import com.android.systemui.unfold.UnfoldTransitionProgressProvider
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
import com.android.systemui.unfold.updates.FOLD_UPDATE_ABORTED
import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_HALF_OPEN
import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED
import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING
import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN
@@ -89,7 +89,7 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider(
                    cancelTransition(endValue = 1f, animate = true)
                }
            }
            FOLD_UPDATE_FINISH_FULL_OPEN, FOLD_UPDATE_ABORTED -> {
            FOLD_UPDATE_FINISH_FULL_OPEN, FOLD_UPDATE_FINISH_HALF_OPEN -> {
                // Do not cancel if we haven't started the transition yet.
                // This could happen when we fully unfolded the device before the screen
                // became available. In this case we start and immediately cancel the animation
+5 −9
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ class DeviceFoldStateProvider(
        if (isTransitionInProgess) {
            cancelTimeout()
        }
        handler.postDelayed(timeoutRunnable, ABORT_CLOSING_MILLIS)
        handler.postDelayed(timeoutRunnable, HALF_OPENED_TIMEOUT_MILLIS)
    }

    private fun cancelTimeout() {
@@ -163,16 +163,14 @@ class DeviceFoldStateProvider(
    }

    private inner class HingeAngleListener : Consumer<Float> {

        override fun accept(angle: Float) {
            onHingeAngle(angle)
        }
    }

    private inner class TimeoutRunnable : Runnable {

        override fun run() {
            notifyFoldUpdate(FOLD_UPDATE_ABORTED)
            notifyFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN)
        }
    }
}
@@ -180,9 +178,7 @@ class DeviceFoldStateProvider(
private fun stateToString(@FoldUpdate update: Int): String {
    return when (update) {
        FOLD_UPDATE_START_OPENING -> "START_OPENING"
        FOLD_UPDATE_HALF_OPEN -> "HALF_OPEN"
        FOLD_UPDATE_START_CLOSING -> "START_CLOSING"
        FOLD_UPDATE_ABORTED -> "ABORTED"
        FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> "UNFOLDED_SCREEN_AVAILABLE"
        FOLD_UPDATE_FINISH_HALF_OPEN -> "FINISH_HALF_OPEN"
        FOLD_UPDATE_FINISH_FULL_OPEN -> "FINISH_FULL_OPEN"
@@ -195,11 +191,11 @@ private const val TAG = "DeviceFoldProvider"
private const val DEBUG = false

/**
 * Time after which [FOLD_UPDATE_ABORTED] is emitted following a [FOLD_UPDATE_START_CLOSING] or
 * [FOLD_UPDATE_START_OPENING] event, if an end state is not reached.
 * Time after which [FOLD_UPDATE_FINISH_HALF_OPEN] is emitted following a
 * [FOLD_UPDATE_START_CLOSING] or [FOLD_UPDATE_START_OPENING] event, if an end state is not reached.
 */
@VisibleForTesting
const val ABORT_CLOSING_MILLIS = 1000L
const val HALF_OPENED_TIMEOUT_MILLIS = 1000L

/** Threshold after which we consider the device fully unfolded. */
@VisibleForTesting
+5 −9
Original line number Diff line number Diff line
@@ -37,9 +37,7 @@ interface FoldStateProvider : CallbackController<FoldUpdatesListener> {

    @IntDef(prefix = ["FOLD_UPDATE_"], value = [
        FOLD_UPDATE_START_OPENING,
        FOLD_UPDATE_HALF_OPEN,
        FOLD_UPDATE_START_CLOSING,
        FOLD_UPDATE_ABORTED,
        FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE,
        FOLD_UPDATE_FINISH_HALF_OPEN,
        FOLD_UPDATE_FINISH_FULL_OPEN,
@@ -50,10 +48,8 @@ interface FoldStateProvider : CallbackController<FoldUpdatesListener> {
}

const val FOLD_UPDATE_START_OPENING = 0
const val FOLD_UPDATE_HALF_OPEN = 1
const val FOLD_UPDATE_START_CLOSING = 2
const val FOLD_UPDATE_ABORTED = 3
const val FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE = 4
const val FOLD_UPDATE_FINISH_HALF_OPEN = 5
const val FOLD_UPDATE_FINISH_FULL_OPEN = 6
const val FOLD_UPDATE_FINISH_CLOSED = 7
const val FOLD_UPDATE_START_CLOSING = 1
const val FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE = 2
const val FOLD_UPDATE_FINISH_HALF_OPEN = 3
const val FOLD_UPDATE_FINISH_FULL_OPEN = 4
const val FOLD_UPDATE_FINISH_CLOSED = 5
+38 −41
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import com.android.systemui.unfold.util.FoldableDeviceStates
import com.android.systemui.unfold.util.FoldableTestUtils
import com.android.systemui.util.mockito.any
import com.google.common.truth.Truth.assertThat
import java.lang.Exception
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -39,32 +40,24 @@ import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import java.lang.Exception

@RunWith(AndroidTestingRunner::class)
@SmallTest
class DeviceFoldStateProviderTest : SysuiTestCase() {

    @Mock
    private lateinit var hingeAngleProvider: HingeAngleProvider
    @Mock private lateinit var hingeAngleProvider: HingeAngleProvider

    @Mock
    private lateinit var screenStatusProvider: ScreenStatusProvider
    @Mock private lateinit var screenStatusProvider: ScreenStatusProvider

    @Mock
    private lateinit var deviceStateManager: DeviceStateManager
    @Mock private lateinit var deviceStateManager: DeviceStateManager

    @Mock
    private lateinit var handler: Handler
    @Mock private lateinit var handler: Handler

    @Captor
    private lateinit var foldStateListenerCaptor: ArgumentCaptor<FoldStateListener>
    @Captor private lateinit var foldStateListenerCaptor: ArgumentCaptor<FoldStateListener>

    @Captor
    private lateinit var screenOnListenerCaptor: ArgumentCaptor<ScreenListener>
    @Captor private lateinit var screenOnListenerCaptor: ArgumentCaptor<ScreenListener>

    @Captor
    private lateinit var hingeAngleCaptor: ArgumentCaptor<Consumer<Float>>
    @Captor private lateinit var hingeAngleCaptor: ArgumentCaptor<Consumer<Float>>

    private lateinit var foldStateProvider: DeviceFoldStateProvider

@@ -81,16 +74,17 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
        MockitoAnnotations.initMocks(this)
        deviceStates = FoldableTestUtils.findDeviceStates(context)

        foldStateProvider = DeviceFoldStateProvider(
        foldStateProvider =
            DeviceFoldStateProvider(
                context,
                hingeAngleProvider,
                screenStatusProvider,
                deviceStateManager,
                context.mainExecutor,
            handler
        )
                handler)

        foldStateProvider.addCallback(object : FoldStateProvider.FoldUpdatesListener {
        foldStateProvider.addCallback(
            object : FoldStateProvider.FoldUpdatesListener {
                override fun onHingeAngleUpdate(angle: Float) {
                    hingeAngleUpdates.add(angle)
                }
@@ -200,9 +194,10 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
        sendHingeAngleEvent(90)
        sendHingeAngleEvent(80)

        simulateTimeout(ABORT_CLOSING_MILLIS)
        simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS)

        assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING, FOLD_UPDATE_ABORTED)
        assertThat(foldUpdates)
            .containsExactly(FOLD_UPDATE_START_CLOSING, FOLD_UPDATE_FINISH_HALF_OPEN)
    }

    @Test
@@ -210,7 +205,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
        sendHingeAngleEvent(90)
        sendHingeAngleEvent(80)

        simulateTimeout(ABORT_CLOSING_MILLIS - 1)
        simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1)

        assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING)
    }
@@ -220,7 +215,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
        sendHingeAngleEvent(180)
        sendHingeAngleEvent(90)

        simulateTimeout(ABORT_CLOSING_MILLIS - 1)
        simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1)
        sendHingeAngleEvent(80)

        assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING)
@@ -231,11 +226,13 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
        sendHingeAngleEvent(180)
        sendHingeAngleEvent(90)

        simulateTimeout(ABORT_CLOSING_MILLIS - 1) // The timeout should not trigger here.
        // The timeout should not trigger here.
        simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1)
        sendHingeAngleEvent(80)
        simulateTimeout(ABORT_CLOSING_MILLIS) // The timeout should trigger here.
        simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS) // The timeout should trigger here.

        assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING, FOLD_UPDATE_ABORTED)
        assertThat(foldUpdates)
            .containsExactly(FOLD_UPDATE_START_CLOSING, FOLD_UPDATE_FINISH_HALF_OPEN)
    }

    @Test
@@ -261,7 +258,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
        }
    }

    private fun simulateTimeout(waitTime: Long = ABORT_CLOSING_MILLIS) {
    private fun simulateTimeout(waitTime: Long = HALF_OPENED_TIMEOUT_MILLIS) {
        val runnableDelay = scheduledRunnableDelay ?: throw Exception("No runnable scheduled.")
        if (waitTime >= runnableDelay) {
            scheduledRunnable?.run()