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

Commit 8188445d authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato
Browse files

Apply alpha to status bar during unfold

Status bar icons are displayed only in the last 25% of the unfold progress. Otherwise, during unfold to app scenario, they were going outside the app window.

+ Minor kotlin fixes.

Test: Unfold while app opened
Bug: 210997078
Change-Id: I26ab9cb28ce4d894ad33b6b26e11ae59e28234bd
parent d42a4f09
Loading
Loading
Loading
Loading
+27 −8
Original line number Diff line number Diff line
@@ -42,7 +42,9 @@ class UnfoldMoveFromCenterAnimator @JvmOverloads constructor(
     * are different than actual bounds (e.g. view container may
     * have larger width than width of the items in the container)
     */
    private val viewCenterProvider: ViewCenterProvider = object : ViewCenterProvider {}
    private val viewCenterProvider: ViewCenterProvider = object : ViewCenterProvider {},
    /** Allows to set the alpha based on the progress. */
    private val alphaProvider: AlphaProvider? = null
) : UnfoldTransitionProgressProvider.TransitionProgressListener {

    private val screenSize = Point()
@@ -99,15 +101,25 @@ class UnfoldMoveFromCenterAnimator @JvmOverloads constructor(

    override fun onTransitionProgress(progress: Float) {
        animatedViews.forEach {
            it.view.get()?.let { view ->
            it.applyTransition(progress)
            it.applyAlpha(progress)
        }
        lastAnimationProgress = progress
    }

    private fun AnimatedView.applyTransition(progress: Float) {
        view.get()?.let { view ->
            translationApplier.apply(
                view = view,
                    x = it.startTranslationX * (1 - progress),
                    y = it.startTranslationY * (1 - progress)
                x = startTranslationX * (1 - progress),
                y = startTranslationY * (1 - progress)
            )
        }
    }
        lastAnimationProgress = progress

    private fun AnimatedView.applyAlpha(progress: Float) {
        if (alphaProvider == null) return
        view.get()?.alpha = alphaProvider.getAlpha(progress)
    }

    private fun createAnimatedView(view: View): AnimatedView =
@@ -146,6 +158,13 @@ class UnfoldMoveFromCenterAnimator @JvmOverloads constructor(
        }
    }

    /** Allows to set a custom alpha based on the progress. */
    interface AlphaProvider {

        /** Returns the alpha views should have at a given progress. */
        fun getAlpha(progress: Float): Float
    }

    /**
     * Interface that allows to use custom logic to get the center of the view
     */
+23 −25
Original line number Diff line number Diff line
@@ -49,7 +49,8 @@ class PhoneStatusBarViewController private constructor(
    }

    override fun onViewAttached() {
        moveFromCenterAnimationController?.let { animationController ->
        if (moveFromCenterAnimationController == null) return

        val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side)
        val systemIconArea: ViewGroup = mView.findViewById(R.id.system_icon_area)

@@ -61,7 +62,7 @@ class PhoneStatusBarViewController private constructor(
        mView.viewTreeObserver.addOnPreDrawListener(object :
            ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                    animationController.onViewsReady(viewsToAnimate)
                moveFromCenterAnimationController.onViewsReady(viewsToAnimate)
                mView.viewTreeObserver.removeOnPreDrawListener(this)
                return true
            }
@@ -73,7 +74,6 @@ class PhoneStatusBarViewController private constructor(
                moveFromCenterAnimationController.onStatusBarWidthChanged()
            }
        }
        }

        progressProvider?.setReadyToHandleTransition(true)
        configurationController.addCallback(configurationListener)
@@ -162,9 +162,7 @@ class PhoneStatusBarViewController private constructor(
            PhoneStatusBarViewController(
                view,
                progressProvider.getOrNull(),
                unfoldComponent.map {
                    it.getStatusBarMoveFromCenterAnimationController()
                }.getOrNull(),
                unfoldComponent.getOrNull()?.getStatusBarMoveFromCenterAnimationController(),
                touchEventHandler,
                configurationController
            )
+18 −2
Original line number Diff line number Diff line
@@ -18,11 +18,13 @@ package com.android.systemui.statusbar.phone
import android.view.View
import android.view.WindowManager
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator.AlphaProvider
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController.StatusBarViewsCenterProvider
import com.android.systemui.unfold.SysUIUnfoldScope
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
import javax.inject.Inject
import kotlin.math.max

@SysUIUnfoldScope
class StatusBarMoveFromCenterAnimationController @Inject constructor(
@@ -31,8 +33,11 @@ class StatusBarMoveFromCenterAnimationController @Inject constructor(
) {

    private val transitionListener = TransitionListener()
    private val moveFromCenterAnimator = UnfoldMoveFromCenterAnimator(windowManager,
        viewCenterProvider = StatusBarViewsCenterProvider())
    private val moveFromCenterAnimator = UnfoldMoveFromCenterAnimator(
        windowManager,
        viewCenterProvider = StatusBarViewsCenterProvider(),
        alphaProvider = StatusBarIconsAlphaProvider()
    )

    fun onViewsReady(viewsToAnimate: Array<View>) {
        moveFromCenterAnimator.updateDisplayProperties()
@@ -65,4 +70,15 @@ class StatusBarMoveFromCenterAnimationController @Inject constructor(
            moveFromCenterAnimator.onTransitionProgress(1f)
        }
    }

    private class StatusBarIconsAlphaProvider : AlphaProvider {
        override fun getAlpha(progress: Float): Float {
            return max(
                0f,
                (progress - ICONS_START_APPEARING_PROGRESS) / (1 - ICONS_START_APPEARING_PROGRESS)
            )
        }
    }
}

private const val ICONS_START_APPEARING_PROGRESS = 0.75F