Loading packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt +4 −2 Original line number Diff line number Diff line Loading @@ -61,8 +61,6 @@ class FoldStateLoggingProviderImpl( foldStateProvider.stop() } override fun onHingeAngleUpdate(angle: Float) {} override fun onFoldUpdate(@FoldUpdate update: Int) { val now = clock.elapsedRealtime() when (update) { Loading @@ -77,6 +75,10 @@ class FoldStateLoggingProviderImpl( } } override fun onUnfoldedScreenAvailable() { Log.d(TAG, "Unfolded screen available") } private fun dispatchState(@LoggedFoldedStates current: Int) { val now = clock.elapsedRealtime() val previous = lastState Loading packages/SystemUI/tests/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProviderTest.kt +5 −6 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ 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.FOLD_UPDATE_START_CLOSING import com.android.systemui.unfold.updates.FOLD_UPDATE_START_OPENING import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.util.TestFoldStateProvider import org.junit.Before import org.junit.Test Loading @@ -50,7 +49,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, Loading @@ -67,7 +66,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, Loading @@ -84,7 +83,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, ) with(listener.ensureTransitionFinished()) { Loading Loading @@ -113,7 +112,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { fun testUnfoldAndStopUnfolding_finishesTheUnfoldTransition() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN) }, Loading @@ -129,7 +128,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { fun testFoldImmediatelyAfterUnfold_runsFoldAnimation() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { Loading packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +94 −30 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.system.ActivityManagerActivityTypeProvider import com.android.systemui.unfold.updates.FoldProvider.FoldCallback import com.android.systemui.unfold.updates.RotationChangeProvider.RotationListener import com.android.systemui.unfold.updates.hinge.FULLY_OPEN_DEGREES import com.android.systemui.unfold.updates.hinge.HingeAngleProvider import com.android.systemui.unfold.updates.screen.ScreenStatusProvider import com.android.systemui.unfold.updates.screen.ScreenStatusProvider.ScreenListener Loading Loading @@ -71,6 +72,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { private val foldUpdates: MutableList<Int> = arrayListOf() private val hingeAngleUpdates: MutableList<Float> = arrayListOf() private val unfoldedScreenAvailabilityUpdates: MutableList<Unit> = arrayListOf() private var scheduledRunnable: Runnable? = null private var scheduledRunnableDelay: Long? = null Loading Loading @@ -106,6 +108,10 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { override fun onFoldUpdate(update: Int) { foldUpdates.add(update) } override fun onUnfoldedScreenAvailable() { unfoldedScreenAvailabilityUpdates.add(Unit) } }) foldStateProvider.start() Loading Loading @@ -156,8 +162,8 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { sendHingeAngleEvent(10) screenOnStatusProvider.notifyScreenTurnedOn() assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING) assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test Loading @@ -174,8 +180,9 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { sendHingeAngleEvent(40) sendHingeAngleEvent(10) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE, FOLD_UPDATE_START_CLOSING) assertThat(foldUpdates) .containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_START_CLOSING) assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test Loading Loading @@ -223,7 +230,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { fireScreenOnEvent() assertThat(foldUpdates).containsExactly(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test Loading Loading @@ -277,7 +284,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_afterTimeout_finishHalfOpenEventEmitted() { sendHingeAngleEvent(90) setInitialHingeAngle(90) sendHingeAngleEvent(80) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS) Loading @@ -288,7 +295,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_beforeTimeout_abortNotEmitted() { sendHingeAngleEvent(90) setInitialHingeAngle(90) sendHingeAngleEvent(80) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1) Loading @@ -298,7 +305,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_eventBeforeTimeout_oneEventEmitted() { sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(90) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1) Loading @@ -309,7 +316,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_timeoutAfterTimeoutRescheduled_finishHalfOpenStateEmitted() { sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(90) // The timeout should not trigger here. Loading @@ -323,7 +330,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_shortTimeBetween_emitsOnlyOneEvents() { sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(90) sendHingeAngleEvent(80) Loading @@ -334,20 +341,19 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileClosing_emittedDespiteInitialAngle() { val maxAngle = 180 - FULLY_OPEN_THRESHOLD_DEGREES.toInt() for (i in 1..maxAngle) { foldUpdates.clear() simulateFolding(startAngle = i) val minAngle = Math.ceil(HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toDouble()).toInt() + 1 for (startAngle in minAngle..maxAngle) { setInitialHingeAngle(startAngle) sendHingeAngleEvent(startAngle - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) simulateTimeout() // Timeout to set the state to aborted. } } @Test fun startClosingEvent_whileNotOnLauncher_doesNotTriggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = false) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -357,7 +363,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileActivityTypeNotAvailable_triggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = null) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -367,7 +373,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileOnLauncher_doesTriggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = true) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -377,9 +383,11 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileNotOnLauncher_triggersAfterThreshold() { setupForegroundActivityType(isHomeActivity = false) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) setInitialHingeAngle(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES - 1) sendHingeAngleEvent( START_CLOSING_ON_APPS_THRESHOLD_DEGREES - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } Loading @@ -388,7 +396,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { fun startClosingEvent_whileNotOnKeyguardAndNotOnLauncher_doesNotTriggerBeforeThreshold() { setKeyguardVisibility(visible = false) setupForegroundActivityType(isHomeActivity = false) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -398,7 +406,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileKeyguardStateNotAvailable_triggerBeforeThreshold() { setKeyguardVisibility(visible = null) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -408,7 +416,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileonKeyguard_doesTriggerBeforeThreshold() { setKeyguardVisibility(visible = true) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -418,9 +426,59 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileNotOnKeyguard_triggersAfterThreshold() { setKeyguardVisibility(visible = false) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) setInitialHingeAngle(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) sendHingeAngleEvent( START_CLOSING_ON_APPS_THRESHOLD_DEGREES - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } @Test fun startClosingEvent_doesNotTriggerBelowThreshold() { val thresholdAngle = (FULLY_OPEN_DEGREES - FULLY_OPEN_THRESHOLD_DEGREES).toInt() setInitialHingeAngle(180) sendHingeAngleEvent(thresholdAngle + 1) assertThat(foldUpdates).isEmpty() } @Test fun startClosingEvent_triggersAfterThreshold() { val thresholdAngle = (FULLY_OPEN_DEGREES - FULLY_OPEN_THRESHOLD_DEGREES).toInt() setInitialHingeAngle(180) sendHingeAngleEvent(thresholdAngle + 1) sendHingeAngleEvent(thresholdAngle - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } @Test fun startClosingEvent_triggersAfterThreshold_fromHalfOpen() { setInitialHingeAngle(120) sendHingeAngleEvent((120 - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES + 1).toInt()) assertThat(foldUpdates).isEmpty() sendHingeAngleEvent((120 - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES - 1).toInt()) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } @Test fun startOpeningAndClosingEvents_triggerWithOpenAndClose() { setInitialHingeAngle(120) sendHingeAngleEvent(130) sendHingeAngleEvent(120) assertThat(foldUpdates) .containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_START_CLOSING) } sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES - 1) @Test fun startClosingEvent_notInterrupted_whenAngleIsSlightlyIncreased() { setInitialHingeAngle(120) sendHingeAngleEvent(110) sendHingeAngleEvent(111) sendHingeAngleEvent(100) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } Loading Loading @@ -504,11 +562,6 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { } } private fun simulateFolding(startAngle: Int) { sendHingeAngleEvent(startAngle) sendHingeAngleEvent(startAngle - 1) } private fun setFoldState(folded: Boolean) { foldProvider.notifyFolded(folded) } Loading @@ -521,6 +574,17 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { testHingeAngleProvider.notifyAngle(angle.toFloat()) } private fun setInitialHingeAngle(angle: Int) { setFoldState(angle == 0) sendHingeAngleEvent(angle) if (scheduledRunnableDelay != null) { simulateTimeout() } hingeAngleUpdates.clear() foldUpdates.clear() unfoldedScreenAvailabilityUpdates.clear() } private class TestFoldProvider : FoldProvider { private val callbacks = arrayListOf<FoldCallback>() Loading packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt +4 −0 Original line number Diff line number Diff line Loading @@ -57,4 +57,8 @@ class TestFoldStateProvider : FoldStateProvider { fun sendHingeAngleUpdate(angle: Float) { listeners.forEach { it.onHingeAngleUpdate(angle) } } fun sendUnfoldedScreenAvailable() { listeners.forEach { it.onUnfoldedScreenAvailable() } } } packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/FixedTimingTransitionProgressProvider.kt +6 −6 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.util.FloatProperty import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.updates.FoldStateProvider import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import javax.inject.Inject Loading Loading @@ -59,10 +58,13 @@ constructor(private val foldStateProvider: FoldStateProvider) : } override fun onFoldUpdate(@FoldUpdate update: Int) { when (update) { FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> animator.start() FOLD_UPDATE_FINISH_CLOSED -> animator.cancel() if (update == FOLD_UPDATE_FINISH_CLOSED) { animator.cancel() } } override fun onUnfoldedScreenAvailable() { animator.start() } override fun addCallback(listener: TransitionProgressListener) { Loading @@ -73,8 +75,6 @@ constructor(private val foldStateProvider: FoldStateProvider) : listeners.remove(listener) } override fun onHingeAngleUpdate(angle: Float) {} private object AnimationProgressProperty : FloatProperty<FixedTimingTransitionProgressProvider>("animation_progress") { Loading Loading
packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt +4 −2 Original line number Diff line number Diff line Loading @@ -61,8 +61,6 @@ class FoldStateLoggingProviderImpl( foldStateProvider.stop() } override fun onHingeAngleUpdate(angle: Float) {} override fun onFoldUpdate(@FoldUpdate update: Int) { val now = clock.elapsedRealtime() when (update) { Loading @@ -77,6 +75,10 @@ class FoldStateLoggingProviderImpl( } } override fun onUnfoldedScreenAvailable() { Log.d(TAG, "Unfolded screen available") } private fun dispatchState(@LoggedFoldedStates current: Int) { val now = clock.elapsedRealtime() val previous = lastState Loading
packages/SystemUI/tests/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProviderTest.kt +5 −6 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ 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.FOLD_UPDATE_START_CLOSING import com.android.systemui.unfold.updates.FOLD_UPDATE_START_OPENING import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.util.TestFoldStateProvider import org.junit.Before import org.junit.Test Loading @@ -50,7 +49,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, Loading @@ -67,7 +66,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, Loading @@ -84,7 +83,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, ) with(listener.ensureTransitionFinished()) { Loading Loading @@ -113,7 +112,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { fun testUnfoldAndStopUnfolding_finishesTheUnfoldTransition() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN) }, Loading @@ -129,7 +128,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { fun testFoldImmediatelyAfterUnfold_runsFoldAnimation() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { Loading
packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +94 −30 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.system.ActivityManagerActivityTypeProvider import com.android.systemui.unfold.updates.FoldProvider.FoldCallback import com.android.systemui.unfold.updates.RotationChangeProvider.RotationListener import com.android.systemui.unfold.updates.hinge.FULLY_OPEN_DEGREES import com.android.systemui.unfold.updates.hinge.HingeAngleProvider import com.android.systemui.unfold.updates.screen.ScreenStatusProvider import com.android.systemui.unfold.updates.screen.ScreenStatusProvider.ScreenListener Loading Loading @@ -71,6 +72,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { private val foldUpdates: MutableList<Int> = arrayListOf() private val hingeAngleUpdates: MutableList<Float> = arrayListOf() private val unfoldedScreenAvailabilityUpdates: MutableList<Unit> = arrayListOf() private var scheduledRunnable: Runnable? = null private var scheduledRunnableDelay: Long? = null Loading Loading @@ -106,6 +108,10 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { override fun onFoldUpdate(update: Int) { foldUpdates.add(update) } override fun onUnfoldedScreenAvailable() { unfoldedScreenAvailabilityUpdates.add(Unit) } }) foldStateProvider.start() Loading Loading @@ -156,8 +162,8 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { sendHingeAngleEvent(10) screenOnStatusProvider.notifyScreenTurnedOn() assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING) assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test Loading @@ -174,8 +180,9 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { sendHingeAngleEvent(40) sendHingeAngleEvent(10) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE, FOLD_UPDATE_START_CLOSING) assertThat(foldUpdates) .containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_START_CLOSING) assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test Loading Loading @@ -223,7 +230,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { fireScreenOnEvent() assertThat(foldUpdates).containsExactly(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test Loading Loading @@ -277,7 +284,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_afterTimeout_finishHalfOpenEventEmitted() { sendHingeAngleEvent(90) setInitialHingeAngle(90) sendHingeAngleEvent(80) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS) Loading @@ -288,7 +295,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_beforeTimeout_abortNotEmitted() { sendHingeAngleEvent(90) setInitialHingeAngle(90) sendHingeAngleEvent(80) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1) Loading @@ -298,7 +305,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_eventBeforeTimeout_oneEventEmitted() { sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(90) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1) Loading @@ -309,7 +316,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_timeoutAfterTimeoutRescheduled_finishHalfOpenStateEmitted() { sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(90) // The timeout should not trigger here. Loading @@ -323,7 +330,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_shortTimeBetween_emitsOnlyOneEvents() { sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(90) sendHingeAngleEvent(80) Loading @@ -334,20 +341,19 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileClosing_emittedDespiteInitialAngle() { val maxAngle = 180 - FULLY_OPEN_THRESHOLD_DEGREES.toInt() for (i in 1..maxAngle) { foldUpdates.clear() simulateFolding(startAngle = i) val minAngle = Math.ceil(HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toDouble()).toInt() + 1 for (startAngle in minAngle..maxAngle) { setInitialHingeAngle(startAngle) sendHingeAngleEvent(startAngle - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) simulateTimeout() // Timeout to set the state to aborted. } } @Test fun startClosingEvent_whileNotOnLauncher_doesNotTriggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = false) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -357,7 +363,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileActivityTypeNotAvailable_triggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = null) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -367,7 +373,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileOnLauncher_doesTriggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = true) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -377,9 +383,11 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileNotOnLauncher_triggersAfterThreshold() { setupForegroundActivityType(isHomeActivity = false) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) setInitialHingeAngle(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES - 1) sendHingeAngleEvent( START_CLOSING_ON_APPS_THRESHOLD_DEGREES - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } Loading @@ -388,7 +396,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { fun startClosingEvent_whileNotOnKeyguardAndNotOnLauncher_doesNotTriggerBeforeThreshold() { setKeyguardVisibility(visible = false) setupForegroundActivityType(isHomeActivity = false) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -398,7 +406,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileKeyguardStateNotAvailable_triggerBeforeThreshold() { setKeyguardVisibility(visible = null) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -408,7 +416,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileonKeyguard_doesTriggerBeforeThreshold() { setKeyguardVisibility(visible = true) sendHingeAngleEvent(180) setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) Loading @@ -418,9 +426,59 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileNotOnKeyguard_triggersAfterThreshold() { setKeyguardVisibility(visible = false) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) setInitialHingeAngle(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) sendHingeAngleEvent( START_CLOSING_ON_APPS_THRESHOLD_DEGREES - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } @Test fun startClosingEvent_doesNotTriggerBelowThreshold() { val thresholdAngle = (FULLY_OPEN_DEGREES - FULLY_OPEN_THRESHOLD_DEGREES).toInt() setInitialHingeAngle(180) sendHingeAngleEvent(thresholdAngle + 1) assertThat(foldUpdates).isEmpty() } @Test fun startClosingEvent_triggersAfterThreshold() { val thresholdAngle = (FULLY_OPEN_DEGREES - FULLY_OPEN_THRESHOLD_DEGREES).toInt() setInitialHingeAngle(180) sendHingeAngleEvent(thresholdAngle + 1) sendHingeAngleEvent(thresholdAngle - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } @Test fun startClosingEvent_triggersAfterThreshold_fromHalfOpen() { setInitialHingeAngle(120) sendHingeAngleEvent((120 - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES + 1).toInt()) assertThat(foldUpdates).isEmpty() sendHingeAngleEvent((120 - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES - 1).toInt()) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } @Test fun startOpeningAndClosingEvents_triggerWithOpenAndClose() { setInitialHingeAngle(120) sendHingeAngleEvent(130) sendHingeAngleEvent(120) assertThat(foldUpdates) .containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_START_CLOSING) } sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES - 1) @Test fun startClosingEvent_notInterrupted_whenAngleIsSlightlyIncreased() { setInitialHingeAngle(120) sendHingeAngleEvent(110) sendHingeAngleEvent(111) sendHingeAngleEvent(100) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } Loading Loading @@ -504,11 +562,6 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { } } private fun simulateFolding(startAngle: Int) { sendHingeAngleEvent(startAngle) sendHingeAngleEvent(startAngle - 1) } private fun setFoldState(folded: Boolean) { foldProvider.notifyFolded(folded) } Loading @@ -521,6 +574,17 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { testHingeAngleProvider.notifyAngle(angle.toFloat()) } private fun setInitialHingeAngle(angle: Int) { setFoldState(angle == 0) sendHingeAngleEvent(angle) if (scheduledRunnableDelay != null) { simulateTimeout() } hingeAngleUpdates.clear() foldUpdates.clear() unfoldedScreenAvailabilityUpdates.clear() } private class TestFoldProvider : FoldProvider { private val callbacks = arrayListOf<FoldCallback>() Loading
packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt +4 −0 Original line number Diff line number Diff line Loading @@ -57,4 +57,8 @@ class TestFoldStateProvider : FoldStateProvider { fun sendHingeAngleUpdate(angle: Float) { listeners.forEach { it.onHingeAngleUpdate(angle) } } fun sendUnfoldedScreenAvailable() { listeners.forEach { it.onUnfoldedScreenAvailable() } } }
packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/FixedTimingTransitionProgressProvider.kt +6 −6 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.util.FloatProperty import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.updates.FoldStateProvider import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import javax.inject.Inject Loading Loading @@ -59,10 +58,13 @@ constructor(private val foldStateProvider: FoldStateProvider) : } override fun onFoldUpdate(@FoldUpdate update: Int) { when (update) { FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> animator.start() FOLD_UPDATE_FINISH_CLOSED -> animator.cancel() if (update == FOLD_UPDATE_FINISH_CLOSED) { animator.cancel() } } override fun onUnfoldedScreenAvailable() { animator.start() } override fun addCallback(listener: TransitionProgressListener) { Loading @@ -73,8 +75,6 @@ constructor(private val foldStateProvider: FoldStateProvider) : listeners.remove(listener) } override fun onHingeAngleUpdate(angle: Float) {} private object AnimationProgressProperty : FloatProperty<FixedTimingTransitionProgressProvider>("animation_progress") { Loading