Merge "Fix narrow statusbar when folding" into sc-v2-dev

This commit is contained in:
Nick Chameyev
2021-12-02 11:42:12 +00:00
committed by Android (Google) Code Review
4 changed files with 119 additions and 19 deletions

View File

@@ -43,7 +43,6 @@ class PhoneStatusBarViewController private constructor(
val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side)
val systemIconArea: ViewGroup = mView.findViewById(R.id.system_icon_area)
val viewCenterProvider = StatusBarViewsCenterProvider()
val viewsToAnimate = arrayOf(
statusBarLeftSide,
systemIconArea
@@ -52,7 +51,7 @@ class PhoneStatusBarViewController private constructor(
mView.viewTreeObserver.addOnPreDrawListener(object :
ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
animationController.onViewsReady(viewsToAnimate, viewCenterProvider)
animationController.onViewsReady(viewsToAnimate)
mView.viewTreeObserver.removeOnPreDrawListener(this)
return true
}
@@ -82,7 +81,7 @@ class PhoneStatusBarViewController private constructor(
mView.importantForAccessibility = mode
}
private class StatusBarViewsCenterProvider : UnfoldMoveFromCenterAnimator.ViewCenterProvider {
class StatusBarViewsCenterProvider : UnfoldMoveFromCenterAnimator.ViewCenterProvider {
override fun getViewCenter(view: View, outPoint: Point) =
when (view.id) {
R.id.status_bar_left_side -> {

View File

@@ -18,7 +18,7 @@ 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.ViewCenterProvider
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
@@ -27,20 +27,18 @@ import javax.inject.Inject
@SysUIUnfoldScope
class StatusBarMoveFromCenterAnimationController @Inject constructor(
private val progressProvider: ScopedUnfoldTransitionProgressProvider,
private val windowManager: WindowManager
windowManager: WindowManager
) {
private val transitionListener = TransitionListener()
private var moveFromCenterAnimator: UnfoldMoveFromCenterAnimator? = null
private val moveFromCenterAnimator = UnfoldMoveFromCenterAnimator(windowManager,
viewCenterProvider = StatusBarViewsCenterProvider())
fun onViewsReady(viewsToAnimate: Array<View>, viewCenterProvider: ViewCenterProvider) {
moveFromCenterAnimator = UnfoldMoveFromCenterAnimator(windowManager,
viewCenterProvider = viewCenterProvider)
moveFromCenterAnimator?.updateDisplayProperties()
fun onViewsReady(viewsToAnimate: Array<View>) {
moveFromCenterAnimator.updateDisplayProperties()
viewsToAnimate.forEach {
moveFromCenterAnimator?.registerViewForAnimation(it)
moveFromCenterAnimator.registerViewForAnimation(it)
}
progressProvider.addCallback(transitionListener)
@@ -48,24 +46,23 @@ class StatusBarMoveFromCenterAnimationController @Inject constructor(
fun onViewDetached() {
progressProvider.removeCallback(transitionListener)
moveFromCenterAnimator?.clearRegisteredViews()
moveFromCenterAnimator = null
moveFromCenterAnimator.clearRegisteredViews()
}
fun onStatusBarWidthChanged() {
moveFromCenterAnimator?.updateDisplayProperties()
moveFromCenterAnimator?.updateViewPositions()
moveFromCenterAnimator.updateDisplayProperties()
moveFromCenterAnimator.updateViewPositions()
}
private inner class TransitionListener : TransitionProgressListener {
override fun onTransitionProgress(progress: Float) {
moveFromCenterAnimator?.onTransitionProgress(progress)
moveFromCenterAnimator.onTransitionProgress(progress)
}
override fun onTransitionFinished() {
// Reset translations when transition is stopped/cancelled
// (e.g. the transition could be cancelled mid-way when rotating the screen)
moveFromCenterAnimator?.onTransitionProgress(1f)
moveFromCenterAnimator.onTransitionProgress(1f)
}
}
}

View File

@@ -102,7 +102,7 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
verify(view.viewTreeObserver).addOnPreDrawListener(argumentCaptor.capture())
argumentCaptor.value.onPreDraw()
verify(moveFromCenterAnimation).onViewsReady(any(), any())
verify(moveFromCenterAnimation).onViewsReady(any())
}
private fun createViewMock(): PhoneStatusBarView {

View File

@@ -0,0 +1,104 @@
package com.android.systemui.statusbar.phone
import android.graphics.Point
import android.view.Display
import android.view.Surface
import android.view.View
import android.view.WindowManager
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.unfold.TestUnfoldTransitionProvider
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.mockito.ArgumentMatchers.any
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
@SmallTest
class StatusBarMoveFromCenterAnimationControllerTest : SysuiTestCase() {
@Mock
private lateinit var windowManager: WindowManager
@Mock
private lateinit var display: Display
private val view: View = View(context)
private val progressProvider = TestUnfoldTransitionProvider()
private val scopedProvider = ScopedUnfoldTransitionProgressProvider(progressProvider)
private lateinit var controller: StatusBarMoveFromCenterAnimationController
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
`when`(windowManager.defaultDisplay).thenReturn(display)
`when`(display.rotation).thenReturn(Surface.ROTATION_0)
`when`(display.getSize(any())).thenAnswer {
val point = it.arguments[0] as Point
point.x = 100
point.y = 100
Unit
}
scopedProvider.setReadyToHandleTransition(true)
controller = StatusBarMoveFromCenterAnimationController(scopedProvider, windowManager)
}
@Test
fun onTransitionProgressAndFinished_resetsTranslations() {
controller.onViewsReady(arrayOf(view))
progressProvider.onTransitionProgress(0.5f)
progressProvider.onTransitionFinished()
assertThat(view.translationX).isZero()
}
@Test
fun onTransitionProgress_updatesTranslations() {
controller.onViewsReady(arrayOf(view))
progressProvider.onTransitionProgress(0.5f)
assertThat(view.translationX).isNonZero()
}
@Test
fun onTransitionProgress_whenDetached_doesNotUpdateTranslations() {
controller.onViewsReady(arrayOf(view))
controller.onViewDetached()
progressProvider.onTransitionProgress(0.5f)
assertThat(view.translationX).isZero()
}
@Test
fun detachedAfterProgress_resetsTranslations() {
controller.onViewsReady(arrayOf(view))
progressProvider.onTransitionProgress(0.5f)
controller.onViewDetached()
assertThat(view.translationX).isZero()
}
@Test
fun transitionFinished_viewReAttached_noChangesToTranslation() {
controller.onViewsReady(arrayOf(view))
progressProvider.onTransitionProgress(0.5f)
progressProvider.onTransitionFinished()
controller.onViewDetached()
controller.onViewsReady(arrayOf(view))
controller.onStatusBarWidthChanged()
assertThat(view.translationX).isZero()
}
}