Merge "Replace aborted with half_open in FoldStateProvider"
This commit is contained in:
committed by
Android (Google) Code Review
commit
5223943b0e
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user