1 package com.android.systemui.statusbar.phone
2 
3 import android.graphics.Point
4 import android.view.Display
5 import android.view.Surface
6 import android.view.View
7 import android.view.WindowManager
8 import androidx.test.filters.SmallTest
9 import com.android.systemui.SysuiTestCase
10 import com.android.systemui.unfold.TestUnfoldTransitionProvider
11 import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
12 import com.google.common.truth.Truth.assertThat
13 import org.junit.Before
14 import org.junit.Test
15 import org.mockito.ArgumentMatchers.any
16 import org.mockito.Mock
17 import org.mockito.Mockito.`when`
18 import org.mockito.MockitoAnnotations
19 
20 @SmallTest
21 class StatusBarMoveFromCenterAnimationControllerTest : SysuiTestCase() {
22 
23     @Mock
24     private lateinit var windowManager: WindowManager
25 
26     @Mock
27     private lateinit var display: Display
28 
29     private val view: View = View(context)
30     private val progressProvider = TestUnfoldTransitionProvider()
31     private val scopedProvider = ScopedUnfoldTransitionProgressProvider(progressProvider)
32 
33     private lateinit var controller: StatusBarMoveFromCenterAnimationController
34 
35     @Before
36     fun setUp() {
37         MockitoAnnotations.initMocks(this)
38 
39         `when`(windowManager.defaultDisplay).thenReturn(display)
40         `when`(display.rotation).thenReturn(Surface.ROTATION_0)
41         `when`(display.getSize(any())).thenAnswer {
42             val point = it.arguments[0] as Point
43             point.x = 100
44             point.y = 100
45             Unit
46         }
47 
48         scopedProvider.setReadyToHandleTransition(true)
49 
50         controller = StatusBarMoveFromCenterAnimationController(scopedProvider, windowManager)
51     }
52 
53     @Test
54     fun onTransitionProgressAndFinished_resetsTranslations() {
55         controller.onViewsReady(arrayOf(view))
56 
57         progressProvider.onTransitionProgress(0.5f)
58         progressProvider.onTransitionFinished()
59 
60         assertThat(view.translationX).isZero()
61     }
62 
63     @Test
64     fun onTransitionProgress_updatesTranslations() {
65         controller.onViewsReady(arrayOf(view))
66 
67         progressProvider.onTransitionProgress(0.5f)
68 
69         assertThat(view.translationX).isNonZero()
70     }
71 
72     @Test
73     fun onTransitionProgress_whenDetached_doesNotUpdateTranslations() {
74         controller.onViewsReady(arrayOf(view))
75         controller.onViewDetached()
76 
77         progressProvider.onTransitionProgress(0.5f)
78 
79         assertThat(view.translationX).isZero()
80     }
81 
82     @Test
83     fun detachedAfterProgress_resetsTranslations() {
84         controller.onViewsReady(arrayOf(view))
85         progressProvider.onTransitionProgress(0.5f)
86 
87         controller.onViewDetached()
88 
89         assertThat(view.translationX).isZero()
90     }
91 
92     @Test
93     fun transitionFinished_viewReAttached_noChangesToTranslation() {
94         controller.onViewsReady(arrayOf(view))
95         progressProvider.onTransitionProgress(0.5f)
96         progressProvider.onTransitionFinished()
97         controller.onViewDetached()
98 
99         controller.onViewsReady(arrayOf(view))
100         controller.onStatusBarWidthChanged()
101 
102         assertThat(view.translationX).isZero()
103     }
104 }
105