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
This commit is contained in:
Nicolo' Mazzucato
2022-01-27 15:37:14 +01:00
parent d42a4f09c6
commit 8188445d32
3 changed files with 66 additions and 33 deletions

View File

@@ -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
*/

View File

@@ -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)
if (moveFromCenterAnimationController == null) return
val viewsToAnimate = arrayOf(
statusBarLeftSide,
systemIconArea
)
val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side)
val systemIconArea: ViewGroup = mView.findViewById(R.id.system_icon_area)
mView.viewTreeObserver.addOnPreDrawListener(object :
ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
animationController.onViewsReady(viewsToAnimate)
mView.viewTreeObserver.removeOnPreDrawListener(this)
return true
}
})
val viewsToAnimate = arrayOf(
statusBarLeftSide,
systemIconArea
)
mView.addOnLayoutChangeListener { _, left, _, right, _, oldLeft, _, oldRight, _ ->
val widthChanged = right - left != oldRight - oldLeft
if (widthChanged) {
moveFromCenterAnimationController.onStatusBarWidthChanged()
}
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()
}
}
@@ -162,9 +162,7 @@ class PhoneStatusBarViewController private constructor(
PhoneStatusBarViewController(
view,
progressProvider.getOrNull(),
unfoldComponent.map {
it.getStatusBarMoveFromCenterAnimationController()
}.getOrNull(),
unfoldComponent.getOrNull()?.getStatusBarMoveFromCenterAnimationController(),
touchEventHandler,
configurationController
)

View File

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