Loading packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt +24 −7 Original line number Diff line number Diff line Loading @@ -47,19 +47,36 @@ constructor( viewsIdToTranslate = setOf( ViewIdToTranslate(R.id.quick_settings_panel, START, filterShade), ViewIdToTranslate(R.id.notification_stack_scroller, END, filterShade), ViewIdToTranslate(R.id.notification_stack_scroller, END, filterShade)), progressProvider = progressProvider) } private val translateAnimatorStatusBar by lazy { UnfoldConstantTranslateAnimator( viewsIdToTranslate = setOf( ViewIdToTranslate(R.id.statusIcons, END, filterShade), ViewIdToTranslate(R.id.privacy_container, END, filterShade), ViewIdToTranslate(R.id.batteryRemainingIcon, END, filterShade), ViewIdToTranslate(R.id.carrier_group, END, filterShade), ViewIdToTranslate(R.id.clock, START, filterShade), ViewIdToTranslate(R.id.date, START, filterShade)), progressProvider = progressProvider) ViewIdToTranslate(R.id.date, START, filterShade) ), progressProvider = progressProvider ) } fun setup(root: ViewGroup) { val translationMax = context.resources.getDimensionPixelSize(R.dimen.notification_side_paddings).toFloat() translateAnimator.init(root, translationMax) val splitShadeStatusBarViewGroup: ViewGroup? = root.findViewById(R.id.split_shade_status_bar) if (splitShadeStatusBarViewGroup != null) { translateAnimatorStatusBar.init( splitShadeStatusBarViewGroup, translationMax ) } } } packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationControllerTest.kt +93 −15 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.atLeastOnce import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations Loading @@ -54,10 +55,12 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { @Mock private lateinit var parent: ViewGroup @Mock private lateinit var splitShadeStatusBar: ViewGroup @Mock private lateinit var statusBarStateController: StatusBarStateController private lateinit var underTest: NotificationPanelUnfoldAnimationController private lateinit var progressListener: TransitionProgressListener private lateinit var progressListeners: List<TransitionProgressListener> private var xTranslationMax = 0f @Before Loading @@ -73,10 +76,13 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { statusBarStateController, progressProvider ) whenever(parent.findViewById<ViewGroup>(R.id.split_shade_status_bar)).thenReturn( splitShadeStatusBar ) underTest.setup(parent) verify(progressProvider).addCallback(capture(progressListenerCaptor)) progressListener = progressListenerCaptor.value verify(progressProvider, atLeastOnce()).addCallback(capture(progressListenerCaptor)) progressListeners = progressListenerCaptor.allValues } @Test Loading @@ -86,16 +92,16 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { val view = View(context) whenever(parent.findViewById<View>(R.id.quick_settings_panel)).thenReturn(view) progressListener.onTransitionStarted() onTransitionStarted() assertThat(view.translationX).isZero() progressListener.onTransitionProgress(0f) onTransitionProgress(0f) assertThat(view.translationX).isZero() progressListener.onTransitionProgress(0.5f) onTransitionProgress(0.5f) assertThat(view.translationX).isZero() progressListener.onTransitionFinished() onTransitionFinished() assertThat(view.translationX).isZero() } Loading @@ -106,16 +112,16 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { val view = View(context) whenever(parent.findViewById<View>(R.id.quick_settings_panel)).thenReturn(view) progressListener.onTransitionStarted() onTransitionStarted() assertThat(view.translationX).isZero() progressListener.onTransitionProgress(0f) onTransitionProgress(0f) assertThat(view.translationX).isEqualTo(xTranslationMax) progressListener.onTransitionProgress(0.5f) onTransitionProgress(0.5f) assertThat(view.translationX).isEqualTo(0.5f * xTranslationMax) progressListener.onTransitionFinished() onTransitionFinished() assertThat(view.translationX).isZero() } Loading @@ -126,16 +132,88 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { val view = View(context) whenever(parent.findViewById<View>(R.id.quick_settings_panel)).thenReturn(view) progressListener.onTransitionStarted() onTransitionStarted() assertThat(view.translationX).isZero() onTransitionProgress(0f) assertThat(view.translationX).isEqualTo(xTranslationMax) onTransitionProgress(0.5f) assertThat(view.translationX).isEqualTo(0.5f * xTranslationMax) onTransitionFinished() assertThat(view.translationX).isZero() } @Test fun whenInKeyguardState_statusBarViewDoesNotMove() { whenever(statusBarStateController.getState()).thenReturn(KEYGUARD) val view = View(context) whenever(splitShadeStatusBar.findViewById<View>(R.id.date)).thenReturn(view) onTransitionStarted() assertThat(view.translationX).isZero() onTransitionProgress(0f) assertThat(view.translationX).isZero() onTransitionProgress(0.5f) assertThat(view.translationX).isZero() onTransitionFinished() assertThat(view.translationX).isZero() } @Test fun whenInShadeState_statusBarViewDoesMove() { whenever(statusBarStateController.getState()).thenReturn(SHADE) val view = View(context) whenever(splitShadeStatusBar.findViewById<View>(R.id.date)).thenReturn(view) onTransitionStarted() assertThat(view.translationX).isZero() progressListener.onTransitionProgress(0f) onTransitionProgress(0f) assertThat(view.translationX).isEqualTo(xTranslationMax) progressListener.onTransitionProgress(0.5f) onTransitionProgress(0.5f) assertThat(view.translationX).isEqualTo(0.5f * xTranslationMax) progressListener.onTransitionFinished() onTransitionFinished() assertThat(view.translationX).isZero() } @Test fun whenInShadeLockedState_statusBarViewDoesMove() { whenever(statusBarStateController.getState()).thenReturn(SHADE_LOCKED) val view = View(context) whenever(splitShadeStatusBar.findViewById<View>(R.id.date)).thenReturn(view) onTransitionStarted() assertThat(view.translationX).isZero() onTransitionProgress(0f) assertThat(view.translationX).isEqualTo(xTranslationMax) onTransitionProgress(0.5f) assertThat(view.translationX).isEqualTo(0.5f * xTranslationMax) onTransitionFinished() assertThat(view.translationX).isZero() } private fun onTransitionStarted() { progressListeners.forEach { it.onTransitionStarted() } } private fun onTransitionProgress(progress: Float) { progressListeners.forEach { it.onTransitionProgress(progress) } } private fun onTransitionFinished() { progressListeners.forEach { it.onTransitionFinished() } } } Loading
packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt +24 −7 Original line number Diff line number Diff line Loading @@ -47,19 +47,36 @@ constructor( viewsIdToTranslate = setOf( ViewIdToTranslate(R.id.quick_settings_panel, START, filterShade), ViewIdToTranslate(R.id.notification_stack_scroller, END, filterShade), ViewIdToTranslate(R.id.notification_stack_scroller, END, filterShade)), progressProvider = progressProvider) } private val translateAnimatorStatusBar by lazy { UnfoldConstantTranslateAnimator( viewsIdToTranslate = setOf( ViewIdToTranslate(R.id.statusIcons, END, filterShade), ViewIdToTranslate(R.id.privacy_container, END, filterShade), ViewIdToTranslate(R.id.batteryRemainingIcon, END, filterShade), ViewIdToTranslate(R.id.carrier_group, END, filterShade), ViewIdToTranslate(R.id.clock, START, filterShade), ViewIdToTranslate(R.id.date, START, filterShade)), progressProvider = progressProvider) ViewIdToTranslate(R.id.date, START, filterShade) ), progressProvider = progressProvider ) } fun setup(root: ViewGroup) { val translationMax = context.resources.getDimensionPixelSize(R.dimen.notification_side_paddings).toFloat() translateAnimator.init(root, translationMax) val splitShadeStatusBarViewGroup: ViewGroup? = root.findViewById(R.id.split_shade_status_bar) if (splitShadeStatusBarViewGroup != null) { translateAnimatorStatusBar.init( splitShadeStatusBarViewGroup, translationMax ) } } }
packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationControllerTest.kt +93 −15 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.atLeastOnce import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations Loading @@ -54,10 +55,12 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { @Mock private lateinit var parent: ViewGroup @Mock private lateinit var splitShadeStatusBar: ViewGroup @Mock private lateinit var statusBarStateController: StatusBarStateController private lateinit var underTest: NotificationPanelUnfoldAnimationController private lateinit var progressListener: TransitionProgressListener private lateinit var progressListeners: List<TransitionProgressListener> private var xTranslationMax = 0f @Before Loading @@ -73,10 +76,13 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { statusBarStateController, progressProvider ) whenever(parent.findViewById<ViewGroup>(R.id.split_shade_status_bar)).thenReturn( splitShadeStatusBar ) underTest.setup(parent) verify(progressProvider).addCallback(capture(progressListenerCaptor)) progressListener = progressListenerCaptor.value verify(progressProvider, atLeastOnce()).addCallback(capture(progressListenerCaptor)) progressListeners = progressListenerCaptor.allValues } @Test Loading @@ -86,16 +92,16 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { val view = View(context) whenever(parent.findViewById<View>(R.id.quick_settings_panel)).thenReturn(view) progressListener.onTransitionStarted() onTransitionStarted() assertThat(view.translationX).isZero() progressListener.onTransitionProgress(0f) onTransitionProgress(0f) assertThat(view.translationX).isZero() progressListener.onTransitionProgress(0.5f) onTransitionProgress(0.5f) assertThat(view.translationX).isZero() progressListener.onTransitionFinished() onTransitionFinished() assertThat(view.translationX).isZero() } Loading @@ -106,16 +112,16 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { val view = View(context) whenever(parent.findViewById<View>(R.id.quick_settings_panel)).thenReturn(view) progressListener.onTransitionStarted() onTransitionStarted() assertThat(view.translationX).isZero() progressListener.onTransitionProgress(0f) onTransitionProgress(0f) assertThat(view.translationX).isEqualTo(xTranslationMax) progressListener.onTransitionProgress(0.5f) onTransitionProgress(0.5f) assertThat(view.translationX).isEqualTo(0.5f * xTranslationMax) progressListener.onTransitionFinished() onTransitionFinished() assertThat(view.translationX).isZero() } Loading @@ -126,16 +132,88 @@ class NotificationPanelUnfoldAnimationControllerTest : SysuiTestCase() { val view = View(context) whenever(parent.findViewById<View>(R.id.quick_settings_panel)).thenReturn(view) progressListener.onTransitionStarted() onTransitionStarted() assertThat(view.translationX).isZero() onTransitionProgress(0f) assertThat(view.translationX).isEqualTo(xTranslationMax) onTransitionProgress(0.5f) assertThat(view.translationX).isEqualTo(0.5f * xTranslationMax) onTransitionFinished() assertThat(view.translationX).isZero() } @Test fun whenInKeyguardState_statusBarViewDoesNotMove() { whenever(statusBarStateController.getState()).thenReturn(KEYGUARD) val view = View(context) whenever(splitShadeStatusBar.findViewById<View>(R.id.date)).thenReturn(view) onTransitionStarted() assertThat(view.translationX).isZero() onTransitionProgress(0f) assertThat(view.translationX).isZero() onTransitionProgress(0.5f) assertThat(view.translationX).isZero() onTransitionFinished() assertThat(view.translationX).isZero() } @Test fun whenInShadeState_statusBarViewDoesMove() { whenever(statusBarStateController.getState()).thenReturn(SHADE) val view = View(context) whenever(splitShadeStatusBar.findViewById<View>(R.id.date)).thenReturn(view) onTransitionStarted() assertThat(view.translationX).isZero() progressListener.onTransitionProgress(0f) onTransitionProgress(0f) assertThat(view.translationX).isEqualTo(xTranslationMax) progressListener.onTransitionProgress(0.5f) onTransitionProgress(0.5f) assertThat(view.translationX).isEqualTo(0.5f * xTranslationMax) progressListener.onTransitionFinished() onTransitionFinished() assertThat(view.translationX).isZero() } @Test fun whenInShadeLockedState_statusBarViewDoesMove() { whenever(statusBarStateController.getState()).thenReturn(SHADE_LOCKED) val view = View(context) whenever(splitShadeStatusBar.findViewById<View>(R.id.date)).thenReturn(view) onTransitionStarted() assertThat(view.translationX).isZero() onTransitionProgress(0f) assertThat(view.translationX).isEqualTo(xTranslationMax) onTransitionProgress(0.5f) assertThat(view.translationX).isEqualTo(0.5f * xTranslationMax) onTransitionFinished() assertThat(view.translationX).isZero() } private fun onTransitionStarted() { progressListeners.forEach { it.onTransitionStarted() } } private fun onTransitionProgress(progress: Float) { progressListeners.forEach { it.onTransitionProgress(progress) } } private fun onTransitionFinished() { progressListeners.forEach { it.onTransitionFinished() } } }