Loading packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionProgressProvider.kt +3 −1 Original line number Original line Diff line number Diff line Loading @@ -16,12 +16,14 @@ package com.android.systemui.unfold package com.android.systemui.unfold import android.annotation.FloatRange import android.annotation.FloatRange import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener /** /** * Interface that allows to receive unfold transition progress updates. * Interface that allows to receive unfold transition progress updates. * * It can be used to update view properties based on the current animation progress. * It can be used to update view properties based on the current animation progress. * * onTransitionProgress callback could be called on each frame. * onTransitionProgress callback could be called on each frame. * * * Use [createUnfoldTransitionProgressProvider] to create instances of this interface * Use [createUnfoldTransitionProgressProvider] to create instances of this interface Loading packages/SystemUI/shared/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt +13 −11 Original line number Original line Diff line number Diff line Loading @@ -18,9 +18,8 @@ package com.android.systemui.unfold.config import android.content.Context import android.content.Context import android.os.SystemProperties import android.os.SystemProperties internal class ResourceUnfoldTransitionConfig( internal class ResourceUnfoldTransitionConfig(private val context: Context) : private val context: Context UnfoldTransitionConfig { ) : UnfoldTransitionConfig { override val isEnabled: Boolean override val isEnabled: Boolean get() = readIsEnabledResource() && isPropertyEnabled get() = readIsEnabledResource() && isPropertyEnabled Loading @@ -29,19 +28,22 @@ internal class ResourceUnfoldTransitionConfig( get() = readIsHingeAngleEnabled() get() = readIsHingeAngleEnabled() private val isPropertyEnabled: Boolean private val isPropertyEnabled: Boolean get() = SystemProperties.getInt(UNFOLD_TRANSITION_MODE_PROPERTY_NAME, get() = UNFOLD_TRANSITION_PROPERTY_ENABLED) == UNFOLD_TRANSITION_PROPERTY_ENABLED SystemProperties.getInt( UNFOLD_TRANSITION_MODE_PROPERTY_NAME, UNFOLD_TRANSITION_PROPERTY_ENABLED) == UNFOLD_TRANSITION_PROPERTY_ENABLED private fun readIsEnabledResource(): Boolean = context.resources private fun readIsEnabledResource(): Boolean = .getBoolean(com.android.internal.R.bool.config_unfoldTransitionEnabled) context.resources.getBoolean(com.android.internal.R.bool.config_unfoldTransitionEnabled) private fun readIsHingeAngleEnabled(): Boolean = context.resources private fun readIsHingeAngleEnabled(): Boolean = .getBoolean(com.android.internal.R.bool.config_unfoldTransitionHingeAngle) context.resources.getBoolean(com.android.internal.R.bool.config_unfoldTransitionHingeAngle) } } /** /** * Temporary persistent property to control unfold transition mode * Temporary persistent property to control unfold transition mode. * See [com.android.unfold.config.AnimationMode] * * See [com.android.unfold.config.AnimationMode]. */ */ private const val UNFOLD_TRANSITION_MODE_PROPERTY_NAME = "persist.unfold.transition_enabled" private const val UNFOLD_TRANSITION_MODE_PROPERTY_NAME = "persist.unfold.transition_enabled" private const val UNFOLD_TRANSITION_PROPERTY_ENABLED = 1 private const val UNFOLD_TRANSITION_PROPERTY_ENABLED = 1 packages/SystemUI/shared/src/com/android/systemui/unfold/progress/FixedTimingTransitionProgressProvider.kt +11 −23 Original line number Original line Diff line number Diff line Loading @@ -25,22 +25,18 @@ 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 import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate /** /** Emits animation progress with fixed timing after unfolding */ * Emits animation progress with fixed timing after unfolding */ internal class FixedTimingTransitionProgressProvider( internal class FixedTimingTransitionProgressProvider( private val foldStateProvider: FoldStateProvider private val foldStateProvider: FoldStateProvider ) : UnfoldTransitionProgressProvider, FoldStateProvider.FoldUpdatesListener { ) : UnfoldTransitionProgressProvider, FoldStateProvider.FoldUpdatesListener { private val animatorListener = AnimatorListener() private val animatorListener = AnimatorListener() private val animator = private val animator = ObjectAnimator.ofFloat(this, AnimationProgressProperty, 0f, 1f) ObjectAnimator.ofFloat(this, AnimationProgressProperty, 0f, 1f).apply { .apply { duration = TRANSITION_TIME_MILLIS duration = TRANSITION_TIME_MILLIS addListener(animatorListener) addListener(animatorListener) } } private var transitionProgress: Float = 0.0f private var transitionProgress: Float = 0.0f set(value) { set(value) { listeners.forEach { it.onTransitionProgress(value) } listeners.forEach { it.onTransitionProgress(value) } Loading @@ -62,10 +58,8 @@ internal class FixedTimingTransitionProgressProvider( override fun onFoldUpdate(@FoldUpdate update: Int) { override fun onFoldUpdate(@FoldUpdate update: Int) { when (update) { when (update) { FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> animator.start() animator.start() FOLD_UPDATE_FINISH_CLOSED -> animator.cancel() FOLD_UPDATE_FINISH_CLOSED -> animator.cancel() } } } } Loading @@ -77,16 +71,12 @@ internal class FixedTimingTransitionProgressProvider( listeners.remove(listener) listeners.remove(listener) } } override fun onHingeAngleUpdate(angle: Float) { override fun onHingeAngleUpdate(angle: Float) {} } private object AnimationProgressProperty : private object AnimationProgressProperty : FloatProperty<FixedTimingTransitionProgressProvider>("animation_progress") { FloatProperty<FixedTimingTransitionProgressProvider>("animation_progress") { override fun setValue( override fun setValue(provider: FixedTimingTransitionProgressProvider, value: Float) { provider: FixedTimingTransitionProgressProvider, value: Float ) { provider.transitionProgress = value provider.transitionProgress = value } } Loading @@ -104,11 +94,9 @@ internal class FixedTimingTransitionProgressProvider( listeners.forEach { it.onTransitionFinished() } listeners.forEach { it.onTransitionFinished() } } } override fun onAnimationRepeat(animator: Animator) { override fun onAnimationRepeat(animator: Animator) {} } override fun onAnimationCancel(animator: Animator) { override fun onAnimationCancel(animator: Animator) {} } } } private companion object { private companion object { Loading packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +13 −19 Original line number Original line Diff line number Diff line Loading @@ -23,10 +23,10 @@ import androidx.dynamicanimation.animation.SpringAnimation import androidx.dynamicanimation.animation.SpringForce import androidx.dynamicanimation.animation.SpringForce import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener 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_FINISH_CLOSED import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN 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_UNFOLDED_SCREEN_AVAILABLE 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 import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate Loading @@ -35,13 +35,10 @@ import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdatesListener /** Maps fold updates to unfold transition progress using DynamicAnimation. */ /** Maps fold updates to unfold transition progress using DynamicAnimation. */ internal class PhysicsBasedUnfoldTransitionProgressProvider( internal class PhysicsBasedUnfoldTransitionProgressProvider( private val foldStateProvider: FoldStateProvider private val foldStateProvider: FoldStateProvider ) : ) : UnfoldTransitionProgressProvider, FoldUpdatesListener, DynamicAnimation.OnAnimationEndListener { UnfoldTransitionProgressProvider, FoldUpdatesListener, DynamicAnimation.OnAnimationEndListener { private val springAnimation = SpringAnimation(this, AnimationProgressProperty) private val springAnimation = .apply { SpringAnimation(this, AnimationProgressProperty).apply { addEndListener(this@PhysicsBasedUnfoldTransitionProgressProvider) addEndListener(this@PhysicsBasedUnfoldTransitionProgressProvider) } } Loading Loading @@ -121,9 +118,7 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( isTransitionRunning = false isTransitionRunning = false springAnimation.cancel() springAnimation.cancel() listeners.forEach { listeners.forEach { it.onTransitionFinished() } it.onTransitionFinished() } if (DEBUG) { if (DEBUG) { Log.d(TAG, "onTransitionFinished") Log.d(TAG, "onTransitionFinished") Loading @@ -143,9 +138,7 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( } } private fun onStartTransition() { private fun onStartTransition() { listeners.forEach { listeners.forEach { it.onTransitionStarted() } it.onTransitionStarted() } isTransitionRunning = true isTransitionRunning = true if (DEBUG) { if (DEBUG) { Loading @@ -157,7 +150,8 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( if (!isTransitionRunning) onStartTransition() if (!isTransitionRunning) onStartTransition() springAnimation.apply { springAnimation.apply { spring = SpringForce().apply { spring = SpringForce().apply { finalPosition = startValue finalPosition = startValue dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY stiffness = SPRING_STIFFNESS stiffness = SPRING_STIFFNESS Loading packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +31 −32 Original line number Original line Diff line number Diff line Loading @@ -45,11 +45,9 @@ constructor( private val outputListeners: MutableList<FoldUpdatesListener> = mutableListOf() private val outputListeners: MutableList<FoldUpdatesListener> = mutableListOf() @FoldUpdate @FoldUpdate private var lastFoldUpdate: Int? = null private var lastFoldUpdate: Int? = null @FloatRange(from = 0.0, to = 180.0) @FloatRange(from = 0.0, to = 180.0) private var lastHingeAngle: Float = 0f private var lastHingeAngle: Float = 0f private val hingeAngleListener = HingeAngleListener() private val hingeAngleListener = HingeAngleListener() private val screenListener = ScreenStatusListener() private val screenListener = ScreenStatusListener() Loading @@ -60,10 +58,7 @@ constructor( private var isUnfoldHandled = true private var isUnfoldHandled = true override fun start() { override fun start() { deviceStateManager.registerCallback( deviceStateManager.registerCallback(mainExecutor, foldStateListener) mainExecutor, foldStateListener ) screenStatusProvider.addCallback(screenListener) screenStatusProvider.addCallback(screenListener) hingeAngleProvider.addCallback(hingeAngleListener) hingeAngleProvider.addCallback(hingeAngleListener) } } Loading @@ -87,11 +82,14 @@ constructor( get() = !isFolded && lastFoldUpdate == FOLD_UPDATE_FINISH_FULL_OPEN get() = !isFolded && lastFoldUpdate == FOLD_UPDATE_FINISH_FULL_OPEN private val isTransitionInProgess: Boolean private val isTransitionInProgess: Boolean get() = lastFoldUpdate == FOLD_UPDATE_START_OPENING || get() = lastFoldUpdate == FOLD_UPDATE_START_OPENING || lastFoldUpdate == FOLD_UPDATE_START_CLOSING lastFoldUpdate == FOLD_UPDATE_START_CLOSING private fun onHingeAngle(angle: Float) { private fun onHingeAngle(angle: Float) { if (DEBUG) { Log.d(TAG, "Hinge angle: $angle, lastHingeAngle: $lastHingeAngle") } if (DEBUG) { Log.d(TAG, "Hinge angle: $angle, lastHingeAngle: $lastHingeAngle") } val isClosing = angle < lastHingeAngle val isClosing = angle < lastHingeAngle val isFullyOpened = FULLY_OPEN_DEGREES - angle < FULLY_OPEN_THRESHOLD_DEGREES val isFullyOpened = FULLY_OPEN_DEGREES - angle < FULLY_OPEN_THRESHOLD_DEGREES Loading @@ -116,7 +114,9 @@ constructor( } } private inner class FoldStateListener(context: Context) : private inner class FoldStateListener(context: Context) : DeviceStateManager.FoldStateListener(context, { folded: Boolean -> DeviceStateManager.FoldStateListener( context, { folded: Boolean -> isFolded = folded isFolded = folded lastHingeAngle = FULLY_CLOSED_DEGREES lastHingeAngle = FULLY_CLOSED_DEGREES Loading @@ -133,7 +133,9 @@ constructor( }) }) private fun notifyFoldUpdate(@FoldUpdate update: Int) { private fun notifyFoldUpdate(@FoldUpdate update: Int) { if (DEBUG) { Log.d(TAG, stateToString(update)) } if (DEBUG) { Log.d(TAG, stateToString(update)) } outputListeners.forEach { it.onFoldUpdate(update) } outputListeners.forEach { it.onFoldUpdate(update) } lastFoldUpdate = update lastFoldUpdate = update } } Loading @@ -149,8 +151,7 @@ constructor( handler.removeCallbacks(timeoutRunnable) handler.removeCallbacks(timeoutRunnable) } } private inner class ScreenStatusListener : private inner class ScreenStatusListener : ScreenStatusProvider.ScreenListener { ScreenStatusProvider.ScreenListener { override fun onScreenTurnedOn() { override fun onScreenTurnedOn() { // Trigger this event only if we are unfolded and this is the first screen // Trigger this event only if we are unfolded and this is the first screen Loading Loading @@ -198,9 +199,7 @@ private const val DEBUG = false * Time after which [FOLD_UPDATE_FINISH_HALF_OPEN] is emitted following a * 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. * [FOLD_UPDATE_START_CLOSING] or [FOLD_UPDATE_START_OPENING] event, if an end state is not reached. */ */ @VisibleForTesting @VisibleForTesting const val HALF_OPENED_TIMEOUT_MILLIS = 1000L const val HALF_OPENED_TIMEOUT_MILLIS = 1000L /** Threshold after which we consider the device fully unfolded. */ /** Threshold after which we consider the device fully unfolded. */ @VisibleForTesting @VisibleForTesting const val FULLY_OPEN_THRESHOLD_DEGREES = 15f const val FULLY_OPEN_THRESHOLD_DEGREES = 15f No newline at end of file Loading
packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionProgressProvider.kt +3 −1 Original line number Original line Diff line number Diff line Loading @@ -16,12 +16,14 @@ package com.android.systemui.unfold package com.android.systemui.unfold import android.annotation.FloatRange import android.annotation.FloatRange import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener /** /** * Interface that allows to receive unfold transition progress updates. * Interface that allows to receive unfold transition progress updates. * * It can be used to update view properties based on the current animation progress. * It can be used to update view properties based on the current animation progress. * * onTransitionProgress callback could be called on each frame. * onTransitionProgress callback could be called on each frame. * * * Use [createUnfoldTransitionProgressProvider] to create instances of this interface * Use [createUnfoldTransitionProgressProvider] to create instances of this interface Loading
packages/SystemUI/shared/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt +13 −11 Original line number Original line Diff line number Diff line Loading @@ -18,9 +18,8 @@ package com.android.systemui.unfold.config import android.content.Context import android.content.Context import android.os.SystemProperties import android.os.SystemProperties internal class ResourceUnfoldTransitionConfig( internal class ResourceUnfoldTransitionConfig(private val context: Context) : private val context: Context UnfoldTransitionConfig { ) : UnfoldTransitionConfig { override val isEnabled: Boolean override val isEnabled: Boolean get() = readIsEnabledResource() && isPropertyEnabled get() = readIsEnabledResource() && isPropertyEnabled Loading @@ -29,19 +28,22 @@ internal class ResourceUnfoldTransitionConfig( get() = readIsHingeAngleEnabled() get() = readIsHingeAngleEnabled() private val isPropertyEnabled: Boolean private val isPropertyEnabled: Boolean get() = SystemProperties.getInt(UNFOLD_TRANSITION_MODE_PROPERTY_NAME, get() = UNFOLD_TRANSITION_PROPERTY_ENABLED) == UNFOLD_TRANSITION_PROPERTY_ENABLED SystemProperties.getInt( UNFOLD_TRANSITION_MODE_PROPERTY_NAME, UNFOLD_TRANSITION_PROPERTY_ENABLED) == UNFOLD_TRANSITION_PROPERTY_ENABLED private fun readIsEnabledResource(): Boolean = context.resources private fun readIsEnabledResource(): Boolean = .getBoolean(com.android.internal.R.bool.config_unfoldTransitionEnabled) context.resources.getBoolean(com.android.internal.R.bool.config_unfoldTransitionEnabled) private fun readIsHingeAngleEnabled(): Boolean = context.resources private fun readIsHingeAngleEnabled(): Boolean = .getBoolean(com.android.internal.R.bool.config_unfoldTransitionHingeAngle) context.resources.getBoolean(com.android.internal.R.bool.config_unfoldTransitionHingeAngle) } } /** /** * Temporary persistent property to control unfold transition mode * Temporary persistent property to control unfold transition mode. * See [com.android.unfold.config.AnimationMode] * * See [com.android.unfold.config.AnimationMode]. */ */ private const val UNFOLD_TRANSITION_MODE_PROPERTY_NAME = "persist.unfold.transition_enabled" private const val UNFOLD_TRANSITION_MODE_PROPERTY_NAME = "persist.unfold.transition_enabled" private const val UNFOLD_TRANSITION_PROPERTY_ENABLED = 1 private const val UNFOLD_TRANSITION_PROPERTY_ENABLED = 1
packages/SystemUI/shared/src/com/android/systemui/unfold/progress/FixedTimingTransitionProgressProvider.kt +11 −23 Original line number Original line Diff line number Diff line Loading @@ -25,22 +25,18 @@ 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 import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate /** /** Emits animation progress with fixed timing after unfolding */ * Emits animation progress with fixed timing after unfolding */ internal class FixedTimingTransitionProgressProvider( internal class FixedTimingTransitionProgressProvider( private val foldStateProvider: FoldStateProvider private val foldStateProvider: FoldStateProvider ) : UnfoldTransitionProgressProvider, FoldStateProvider.FoldUpdatesListener { ) : UnfoldTransitionProgressProvider, FoldStateProvider.FoldUpdatesListener { private val animatorListener = AnimatorListener() private val animatorListener = AnimatorListener() private val animator = private val animator = ObjectAnimator.ofFloat(this, AnimationProgressProperty, 0f, 1f) ObjectAnimator.ofFloat(this, AnimationProgressProperty, 0f, 1f).apply { .apply { duration = TRANSITION_TIME_MILLIS duration = TRANSITION_TIME_MILLIS addListener(animatorListener) addListener(animatorListener) } } private var transitionProgress: Float = 0.0f private var transitionProgress: Float = 0.0f set(value) { set(value) { listeners.forEach { it.onTransitionProgress(value) } listeners.forEach { it.onTransitionProgress(value) } Loading @@ -62,10 +58,8 @@ internal class FixedTimingTransitionProgressProvider( override fun onFoldUpdate(@FoldUpdate update: Int) { override fun onFoldUpdate(@FoldUpdate update: Int) { when (update) { when (update) { FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> animator.start() animator.start() FOLD_UPDATE_FINISH_CLOSED -> animator.cancel() FOLD_UPDATE_FINISH_CLOSED -> animator.cancel() } } } } Loading @@ -77,16 +71,12 @@ internal class FixedTimingTransitionProgressProvider( listeners.remove(listener) listeners.remove(listener) } } override fun onHingeAngleUpdate(angle: Float) { override fun onHingeAngleUpdate(angle: Float) {} } private object AnimationProgressProperty : private object AnimationProgressProperty : FloatProperty<FixedTimingTransitionProgressProvider>("animation_progress") { FloatProperty<FixedTimingTransitionProgressProvider>("animation_progress") { override fun setValue( override fun setValue(provider: FixedTimingTransitionProgressProvider, value: Float) { provider: FixedTimingTransitionProgressProvider, value: Float ) { provider.transitionProgress = value provider.transitionProgress = value } } Loading @@ -104,11 +94,9 @@ internal class FixedTimingTransitionProgressProvider( listeners.forEach { it.onTransitionFinished() } listeners.forEach { it.onTransitionFinished() } } } override fun onAnimationRepeat(animator: Animator) { override fun onAnimationRepeat(animator: Animator) {} } override fun onAnimationCancel(animator: Animator) { override fun onAnimationCancel(animator: Animator) {} } } } private companion object { private companion object { Loading
packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +13 −19 Original line number Original line Diff line number Diff line Loading @@ -23,10 +23,10 @@ import androidx.dynamicanimation.animation.SpringAnimation import androidx.dynamicanimation.animation.SpringForce import androidx.dynamicanimation.animation.SpringForce import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener 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_FINISH_CLOSED import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN 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_UNFOLDED_SCREEN_AVAILABLE 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 import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate Loading @@ -35,13 +35,10 @@ import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdatesListener /** Maps fold updates to unfold transition progress using DynamicAnimation. */ /** Maps fold updates to unfold transition progress using DynamicAnimation. */ internal class PhysicsBasedUnfoldTransitionProgressProvider( internal class PhysicsBasedUnfoldTransitionProgressProvider( private val foldStateProvider: FoldStateProvider private val foldStateProvider: FoldStateProvider ) : ) : UnfoldTransitionProgressProvider, FoldUpdatesListener, DynamicAnimation.OnAnimationEndListener { UnfoldTransitionProgressProvider, FoldUpdatesListener, DynamicAnimation.OnAnimationEndListener { private val springAnimation = SpringAnimation(this, AnimationProgressProperty) private val springAnimation = .apply { SpringAnimation(this, AnimationProgressProperty).apply { addEndListener(this@PhysicsBasedUnfoldTransitionProgressProvider) addEndListener(this@PhysicsBasedUnfoldTransitionProgressProvider) } } Loading Loading @@ -121,9 +118,7 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( isTransitionRunning = false isTransitionRunning = false springAnimation.cancel() springAnimation.cancel() listeners.forEach { listeners.forEach { it.onTransitionFinished() } it.onTransitionFinished() } if (DEBUG) { if (DEBUG) { Log.d(TAG, "onTransitionFinished") Log.d(TAG, "onTransitionFinished") Loading @@ -143,9 +138,7 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( } } private fun onStartTransition() { private fun onStartTransition() { listeners.forEach { listeners.forEach { it.onTransitionStarted() } it.onTransitionStarted() } isTransitionRunning = true isTransitionRunning = true if (DEBUG) { if (DEBUG) { Loading @@ -157,7 +150,8 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( if (!isTransitionRunning) onStartTransition() if (!isTransitionRunning) onStartTransition() springAnimation.apply { springAnimation.apply { spring = SpringForce().apply { spring = SpringForce().apply { finalPosition = startValue finalPosition = startValue dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY stiffness = SPRING_STIFFNESS stiffness = SPRING_STIFFNESS Loading
packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +31 −32 Original line number Original line Diff line number Diff line Loading @@ -45,11 +45,9 @@ constructor( private val outputListeners: MutableList<FoldUpdatesListener> = mutableListOf() private val outputListeners: MutableList<FoldUpdatesListener> = mutableListOf() @FoldUpdate @FoldUpdate private var lastFoldUpdate: Int? = null private var lastFoldUpdate: Int? = null @FloatRange(from = 0.0, to = 180.0) @FloatRange(from = 0.0, to = 180.0) private var lastHingeAngle: Float = 0f private var lastHingeAngle: Float = 0f private val hingeAngleListener = HingeAngleListener() private val hingeAngleListener = HingeAngleListener() private val screenListener = ScreenStatusListener() private val screenListener = ScreenStatusListener() Loading @@ -60,10 +58,7 @@ constructor( private var isUnfoldHandled = true private var isUnfoldHandled = true override fun start() { override fun start() { deviceStateManager.registerCallback( deviceStateManager.registerCallback(mainExecutor, foldStateListener) mainExecutor, foldStateListener ) screenStatusProvider.addCallback(screenListener) screenStatusProvider.addCallback(screenListener) hingeAngleProvider.addCallback(hingeAngleListener) hingeAngleProvider.addCallback(hingeAngleListener) } } Loading @@ -87,11 +82,14 @@ constructor( get() = !isFolded && lastFoldUpdate == FOLD_UPDATE_FINISH_FULL_OPEN get() = !isFolded && lastFoldUpdate == FOLD_UPDATE_FINISH_FULL_OPEN private val isTransitionInProgess: Boolean private val isTransitionInProgess: Boolean get() = lastFoldUpdate == FOLD_UPDATE_START_OPENING || get() = lastFoldUpdate == FOLD_UPDATE_START_OPENING || lastFoldUpdate == FOLD_UPDATE_START_CLOSING lastFoldUpdate == FOLD_UPDATE_START_CLOSING private fun onHingeAngle(angle: Float) { private fun onHingeAngle(angle: Float) { if (DEBUG) { Log.d(TAG, "Hinge angle: $angle, lastHingeAngle: $lastHingeAngle") } if (DEBUG) { Log.d(TAG, "Hinge angle: $angle, lastHingeAngle: $lastHingeAngle") } val isClosing = angle < lastHingeAngle val isClosing = angle < lastHingeAngle val isFullyOpened = FULLY_OPEN_DEGREES - angle < FULLY_OPEN_THRESHOLD_DEGREES val isFullyOpened = FULLY_OPEN_DEGREES - angle < FULLY_OPEN_THRESHOLD_DEGREES Loading @@ -116,7 +114,9 @@ constructor( } } private inner class FoldStateListener(context: Context) : private inner class FoldStateListener(context: Context) : DeviceStateManager.FoldStateListener(context, { folded: Boolean -> DeviceStateManager.FoldStateListener( context, { folded: Boolean -> isFolded = folded isFolded = folded lastHingeAngle = FULLY_CLOSED_DEGREES lastHingeAngle = FULLY_CLOSED_DEGREES Loading @@ -133,7 +133,9 @@ constructor( }) }) private fun notifyFoldUpdate(@FoldUpdate update: Int) { private fun notifyFoldUpdate(@FoldUpdate update: Int) { if (DEBUG) { Log.d(TAG, stateToString(update)) } if (DEBUG) { Log.d(TAG, stateToString(update)) } outputListeners.forEach { it.onFoldUpdate(update) } outputListeners.forEach { it.onFoldUpdate(update) } lastFoldUpdate = update lastFoldUpdate = update } } Loading @@ -149,8 +151,7 @@ constructor( handler.removeCallbacks(timeoutRunnable) handler.removeCallbacks(timeoutRunnable) } } private inner class ScreenStatusListener : private inner class ScreenStatusListener : ScreenStatusProvider.ScreenListener { ScreenStatusProvider.ScreenListener { override fun onScreenTurnedOn() { override fun onScreenTurnedOn() { // Trigger this event only if we are unfolded and this is the first screen // Trigger this event only if we are unfolded and this is the first screen Loading Loading @@ -198,9 +199,7 @@ private const val DEBUG = false * Time after which [FOLD_UPDATE_FINISH_HALF_OPEN] is emitted following a * 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. * [FOLD_UPDATE_START_CLOSING] or [FOLD_UPDATE_START_OPENING] event, if an end state is not reached. */ */ @VisibleForTesting @VisibleForTesting const val HALF_OPENED_TIMEOUT_MILLIS = 1000L const val HALF_OPENED_TIMEOUT_MILLIS = 1000L /** Threshold after which we consider the device fully unfolded. */ /** Threshold after which we consider the device fully unfolded. */ @VisibleForTesting @VisibleForTesting const val FULLY_OPEN_THRESHOLD_DEGREES = 15f const val FULLY_OPEN_THRESHOLD_DEGREES = 15f No newline at end of file