diff options
| author | 2021-11-24 16:38:17 +0000 | |
|---|---|---|
| committer | 2021-11-25 11:23:19 +0000 | |
| commit | d56285edbe61e70c6305f6f8ceeac92c7379f44c (patch) | |
| tree | 35251feb4b4d08ae2b750d2c34b2084b61817281 | |
| parent | f322436d6ab31342d311c65b7bfd5557e5b249fc (diff) | |
Fix narrow statusbar when folding
Do not re-create UnfoldMoveFromCenterAnimator
when attaching/detaching status bar view.
UnfoldMoveFromCenterAnimator contains
last transition progress state which is 0f
by default. When transition finishes last state
should be 1f but because animator was re-created
it was reset to 0f which caused applying translations
to the status bar items.
Fixes: 204970935
Test: atest com.android.systemui.statusbar.phone.StatusBarMoveFromCenterAnimationControllerTest
Test: unfold, fold, rotate to landscape =>
statusbar displayed correctly
Change-Id: Id8f6de4c1b6a2fde1ad9f2a0b0b7492aa4e4b2bf
4 files changed, 119 insertions, 19 deletions
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 256b069a0080..ec7e93b444ef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt @@ -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 -> { 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 805ddf5fc180..6d033477e3c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationController.kt @@ -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) } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt index dc320076a668..7d266e96ddb9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt @@ -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 { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt new file mode 100644 index 000000000000..1ce7ff424df1 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt @@ -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() + } +} |