summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nick Chameyev <nickchameyev@google.com> 2021-11-24 16:38:17 +0000
committer Nick Chameyev <nickchameyev@google.com> 2021-11-25 11:23:19 +0000
commitd56285edbe61e70c6305f6f8ceeac92c7379f44c (patch)
tree35251feb4b4d08ae2b750d2c34b2084b61817281
parentf322436d6ab31342d311c65b7bfd5557e5b249fc (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
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationController.kt27
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt104
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()
+ }
+}