diff options
3 files changed, 68 insertions, 35 deletions
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/animation/UnfoldMoveFromCenterAnimator.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/animation/UnfoldMoveFromCenterAnimator.kt index 9010d5154156..fc6bb500562e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/animation/UnfoldMoveFromCenterAnimator.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/animation/UnfoldMoveFromCenterAnimator.kt @@ -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,17 +101,27 @@ class UnfoldMoveFromCenterAnimator @JvmOverloads constructor( override fun onTransitionProgress(progress: Float) { animatedViews.forEach { - it.view.get()?.let { view -> - translationApplier.apply( - view = view, - x = it.startTranslationX * (1 - progress), - y = it.startTranslationY * (1 - progress) - ) - } + it.applyTransition(progress) + it.applyAlpha(progress) } lastAnimationProgress = progress } + private fun AnimatedView.applyTransition(progress: Float) { + view.get()?.let { view -> + translationApplier.apply( + view = view, + x = startTranslationX * (1 - progress), + y = startTranslationY * (1 - progress) + ) + } + } + + private fun AnimatedView.applyAlpha(progress: Float) { + if (alphaProvider == null) return + view.get()?.alpha = alphaProvider.getAlpha(progress) + } + private fun createAnimatedView(view: View): AnimatedView = AnimatedView(view = WeakReference(view)).updateAnimatedView(view) @@ -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 */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt index 1cb19ab727aa..d6bf5f21c834 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt @@ -49,29 +49,29 @@ class PhoneStatusBarViewController private constructor( } override fun onViewAttached() { - moveFromCenterAnimationController?.let { animationController -> - val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side) - val systemIconArea: ViewGroup = mView.findViewById(R.id.system_icon_area) - - val viewsToAnimate = arrayOf( - statusBarLeftSide, - systemIconArea - ) - - mView.viewTreeObserver.addOnPreDrawListener(object : - ViewTreeObserver.OnPreDrawListener { - override fun onPreDraw(): Boolean { - animationController.onViewsReady(viewsToAnimate) - mView.viewTreeObserver.removeOnPreDrawListener(this) - return true - } - }) + 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) + + val viewsToAnimate = arrayOf( + statusBarLeftSide, + systemIconArea + ) + + mView.viewTreeObserver.addOnPreDrawListener(object : + ViewTreeObserver.OnPreDrawListener { + override fun onPreDraw(): Boolean { + moveFromCenterAnimationController.onViewsReady(viewsToAnimate) + mView.viewTreeObserver.removeOnPreDrawListener(this) + return true + } + }) - mView.addOnLayoutChangeListener { _, left, _, right, _, oldLeft, _, oldRight, _ -> - val widthChanged = right - left != oldRight - oldLeft - if (widthChanged) { - moveFromCenterAnimationController.onStatusBarWidthChanged() - } + mView.addOnLayoutChangeListener { _, left, _, right, _, oldLeft, _, oldRight, _ -> + val widthChanged = right - left != oldRight - oldLeft + if (widthChanged) { + moveFromCenterAnimationController.onStatusBarWidthChanged() } } @@ -162,9 +162,7 @@ class PhoneStatusBarViewController private constructor( PhoneStatusBarViewController( view, progressProvider.getOrNull(), - unfoldComponent.map { - it.getStatusBarMoveFromCenterAnimationController() - }.getOrNull(), + unfoldComponent.getOrNull()?.getStatusBarMoveFromCenterAnimationController(), touchEventHandler, configurationController ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationController.kt index 6d033477e3c9..79c0984d9bf7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationController.kt @@ -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 |