Loading packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +36 −2 Original line number Diff line number Diff line Loading @@ -139,6 +139,40 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING) } @Test fun testOnUnfold_hingeAngleDecreasesBeforeInnerScreenAvailable_emitsOnlyStartAndInnerScreenAvailableEvents() { setFoldState(folded = true) foldUpdates.clear() setFoldState(folded = false) screenOnStatusProvider.notifyScreenTurningOn() sendHingeAngleEvent(10) sendHingeAngleEvent(20) sendHingeAngleEvent(10) screenOnStatusProvider.notifyScreenTurnedOn() assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) } @Test fun testOnUnfold_hingeAngleDecreasesAfterInnerScreenAvailable_emitsStartInnerScreenAvailableAndStartClosingEvents() { setFoldState(folded = true) foldUpdates.clear() setFoldState(folded = false) screenOnStatusProvider.notifyScreenTurningOn() sendHingeAngleEvent(10) sendHingeAngleEvent(20) screenOnStatusProvider.notifyScreenTurnedOn() sendHingeAngleEvent(30) sendHingeAngleEvent(40) sendHingeAngleEvent(10) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE, FOLD_UPDATE_START_CLOSING) } @Test fun testOnFolded_stopsHingeAngleProvider() { setFoldState(folded = true) Loading Loading @@ -237,7 +271,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { } @Test fun startClosingEvent_afterTimeout_abortEmitted() { fun startClosingEvent_afterTimeout_finishHalfOpenEventEmitted() { sendHingeAngleEvent(90) sendHingeAngleEvent(80) Loading Loading @@ -269,7 +303,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { } @Test fun startClosingEvent_timeoutAfterTimeoutRescheduled_abortEmitted() { fun startClosingEvent_timeoutAfterTimeoutRescheduled_finishHalfOpenStateEmitted() { sendHingeAngleEvent(180) sendHingeAngleEvent(90) Loading packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +2 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.systemui.unfold.progress import android.os.Trace import android.util.Log import androidx.dynamicanimation.animation.DynamicAnimation import androidx.dynamicanimation.animation.FloatPropertyCompat Loading Loading @@ -117,6 +118,7 @@ class PhysicsBasedUnfoldTransitionProgressProvider( if (DEBUG) { Log.d(TAG, "onFoldUpdate = $update") Trace.traceCounter(Trace.TRACE_TAG_APP, "fold_update", update) } } Loading packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +12 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.unfold.updates import android.os.Handler import android.os.Trace import android.util.Log import androidx.annotation.FloatRange import androidx.annotation.VisibleForTesting Loading Loading @@ -108,6 +109,7 @@ constructor( private fun onHingeAngle(angle: Float) { if (DEBUG) { Log.d(TAG, "Hinge angle: $angle, lastHingeAngle: $lastHingeAngle") Trace.traceCounter(Trace.TRACE_TAG_APP, "hinge_angle", angle.toInt()) } val isClosing = angle < lastHingeAngle Loading @@ -115,8 +117,16 @@ constructor( val closingThresholdMet = closingThreshold == null || angle < closingThreshold val isFullyOpened = FULLY_OPEN_DEGREES - angle < FULLY_OPEN_THRESHOLD_DEGREES val closingEventDispatched = lastFoldUpdate == FOLD_UPDATE_START_CLOSING if (isClosing && closingThresholdMet && !closingEventDispatched && !isFullyOpened) { val screenAvailableEventSent = isUnfoldHandled if (isClosing // hinge angle should be decreasing since last update && closingThresholdMet // hinge angle is below certain threshold && !closingEventDispatched // we haven't sent closing event already && !isFullyOpened // do not send closing event if we are in fully opened hinge // angle range as closing threshold could overlap this range && screenAvailableEventSent // do not send closing event if we are still in // the process of turning on the inner display ) { notifyFoldUpdate(FOLD_UPDATE_START_CLOSING) } Loading Loading
packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +36 −2 Original line number Diff line number Diff line Loading @@ -139,6 +139,40 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING) } @Test fun testOnUnfold_hingeAngleDecreasesBeforeInnerScreenAvailable_emitsOnlyStartAndInnerScreenAvailableEvents() { setFoldState(folded = true) foldUpdates.clear() setFoldState(folded = false) screenOnStatusProvider.notifyScreenTurningOn() sendHingeAngleEvent(10) sendHingeAngleEvent(20) sendHingeAngleEvent(10) screenOnStatusProvider.notifyScreenTurnedOn() assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) } @Test fun testOnUnfold_hingeAngleDecreasesAfterInnerScreenAvailable_emitsStartInnerScreenAvailableAndStartClosingEvents() { setFoldState(folded = true) foldUpdates.clear() setFoldState(folded = false) screenOnStatusProvider.notifyScreenTurningOn() sendHingeAngleEvent(10) sendHingeAngleEvent(20) screenOnStatusProvider.notifyScreenTurnedOn() sendHingeAngleEvent(30) sendHingeAngleEvent(40) sendHingeAngleEvent(10) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE, FOLD_UPDATE_START_CLOSING) } @Test fun testOnFolded_stopsHingeAngleProvider() { setFoldState(folded = true) Loading Loading @@ -237,7 +271,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { } @Test fun startClosingEvent_afterTimeout_abortEmitted() { fun startClosingEvent_afterTimeout_finishHalfOpenEventEmitted() { sendHingeAngleEvent(90) sendHingeAngleEvent(80) Loading Loading @@ -269,7 +303,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { } @Test fun startClosingEvent_timeoutAfterTimeoutRescheduled_abortEmitted() { fun startClosingEvent_timeoutAfterTimeoutRescheduled_finishHalfOpenStateEmitted() { sendHingeAngleEvent(180) sendHingeAngleEvent(90) Loading
packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +2 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.systemui.unfold.progress import android.os.Trace import android.util.Log import androidx.dynamicanimation.animation.DynamicAnimation import androidx.dynamicanimation.animation.FloatPropertyCompat Loading Loading @@ -117,6 +118,7 @@ class PhysicsBasedUnfoldTransitionProgressProvider( if (DEBUG) { Log.d(TAG, "onFoldUpdate = $update") Trace.traceCounter(Trace.TRACE_TAG_APP, "fold_update", update) } } Loading
packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +12 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.unfold.updates import android.os.Handler import android.os.Trace import android.util.Log import androidx.annotation.FloatRange import androidx.annotation.VisibleForTesting Loading Loading @@ -108,6 +109,7 @@ constructor( private fun onHingeAngle(angle: Float) { if (DEBUG) { Log.d(TAG, "Hinge angle: $angle, lastHingeAngle: $lastHingeAngle") Trace.traceCounter(Trace.TRACE_TAG_APP, "hinge_angle", angle.toInt()) } val isClosing = angle < lastHingeAngle Loading @@ -115,8 +117,16 @@ constructor( val closingThresholdMet = closingThreshold == null || angle < closingThreshold val isFullyOpened = FULLY_OPEN_DEGREES - angle < FULLY_OPEN_THRESHOLD_DEGREES val closingEventDispatched = lastFoldUpdate == FOLD_UPDATE_START_CLOSING if (isClosing && closingThresholdMet && !closingEventDispatched && !isFullyOpened) { val screenAvailableEventSent = isUnfoldHandled if (isClosing // hinge angle should be decreasing since last update && closingThresholdMet // hinge angle is below certain threshold && !closingEventDispatched // we haven't sent closing event already && !isFullyOpened // do not send closing event if we are in fully opened hinge // angle range as closing threshold could overlap this range && screenAvailableEventSent // do not send closing event if we are still in // the process of turning on the inner display ) { notifyFoldUpdate(FOLD_UPDATE_START_CLOSING) } Loading