Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0e9d4ef authored by Nicolò Mazzucato's avatar Nicolò Mazzucato Committed by Android (Google) Code Review
Browse files

Merge "Reformat unfold lib with ktfmt"

parents ce65b04d ff4060f5
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -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
+13 −11
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
+11 −23
Original line number Original line Diff line number Diff line
@@ -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) }
@@ -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()
        }
        }
    }
    }


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


@@ -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 {
+13 −19
Original line number Original line Diff line number Diff line
@@ -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
@@ -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)
        }
        }


@@ -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")
@@ -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) {
@@ -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
+31 −32
Original line number Original line Diff line number Diff line
@@ -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()
@@ -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)
    }
    }
@@ -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
@@ -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


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