Merge "Replace aborted with half_open in FoldStateProvider"

This commit is contained in:
TreeHugger Robot
2022-01-06 18:27:27 +00:00
committed by Android (Google) Code Review
4 changed files with 48 additions and 59 deletions

View File

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

View File

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

View File

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

View File

@@ -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,24 +74,25 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
MockitoAnnotations.initMocks(this)
deviceStates = FoldableTestUtils.findDeviceStates(context)
foldStateProvider = DeviceFoldStateProvider(
context,
hingeAngleProvider,
screenStatusProvider,
deviceStateManager,
context.mainExecutor,
handler
)
foldStateProvider =
DeviceFoldStateProvider(
context,
hingeAngleProvider,
screenStatusProvider,
deviceStateManager,
context.mainExecutor,
handler)
foldStateProvider.addCallback(object : FoldStateProvider.FoldUpdatesListener {
override fun onHingeAngleUpdate(angle: Float) {
hingeAngleUpdates.add(angle)
}
foldStateProvider.addCallback(
object : FoldStateProvider.FoldUpdatesListener {
override fun onHingeAngleUpdate(angle: Float) {
hingeAngleUpdates.add(angle)
}
override fun onFoldUpdate(update: Int) {
foldUpdates.add(update)
}
})
override fun onFoldUpdate(update: Int) {
foldUpdates.add(update)
}
})
foldStateProvider.start()
verify(deviceStateManager).registerCallback(any(), foldStateListenerCaptor.capture())
@@ -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()