diff options
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() + } +} |