Loading packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -84,7 +84,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 Loading packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +5 −9 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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) } } } Loading @@ -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" Loading @@ -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 Loading packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt +5 −9 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +38 −41 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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) } Loading Loading @@ -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 Loading @@ -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) } Loading @@ -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) Loading @@ -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 Loading @@ -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() Loading Loading
packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -84,7 +84,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 Loading
packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +5 −9 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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) } } } Loading @@ -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" Loading @@ -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 Loading
packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt +5 −9 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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
packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +38 −41 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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) } Loading Loading @@ -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 Loading @@ -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) } Loading @@ -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) Loading @@ -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 Loading @@ -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() Loading