1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.shade
18 
19 import androidx.test.filters.SmallTest
20 import com.android.systemui.SysuiTestCase
21 import com.google.common.truth.Truth.assertThat
22 import org.junit.Before
23 import org.junit.Test
24 
25 @SmallTest
26 class ShadeExpansionStateManagerTest : SysuiTestCase() {
27 
28     private lateinit var shadeExpansionStateManager: ShadeExpansionStateManager
29 
30     @Before
31     fun setUp() {
32         shadeExpansionStateManager = ShadeExpansionStateManager()
33     }
34 
35     @Test
36     fun onPanelExpansionChanged_listenerNotified() {
37         val listener = TestShadeExpansionListener()
38         val currentState = shadeExpansionStateManager.addExpansionListener(listener)
39         listener.onPanelExpansionChanged(currentState)
40         val fraction = 0.6f
41         val expanded = true
42         val tracking = true
43         val dragDownAmount = 1234f
44 
45         shadeExpansionStateManager.onPanelExpansionChanged(
46             fraction,
47             expanded,
48             tracking,
49             dragDownAmount
50         )
51 
52         assertThat(listener.fraction).isEqualTo(fraction)
53         assertThat(listener.expanded).isEqualTo(expanded)
54         assertThat(listener.tracking).isEqualTo(tracking)
55         assertThat(listener.dragDownAmountPx).isEqualTo(dragDownAmount)
56     }
57 
58     @Test
59     fun addExpansionListener_listenerNotifiedOfCurrentValues() {
60         val fraction = 0.6f
61         val expanded = true
62         val tracking = true
63         val dragDownAmount = 1234f
64         shadeExpansionStateManager.onPanelExpansionChanged(
65             fraction,
66             expanded,
67             tracking,
68             dragDownAmount
69         )
70         val listener = TestShadeExpansionListener()
71 
72         val currentState = shadeExpansionStateManager.addExpansionListener(listener)
73         listener.onPanelExpansionChanged(currentState)
74 
75         assertThat(listener.fraction).isEqualTo(fraction)
76         assertThat(listener.expanded).isEqualTo(expanded)
77         assertThat(listener.tracking).isEqualTo(tracking)
78         assertThat(listener.dragDownAmountPx).isEqualTo(dragDownAmount)
79     }
80 
81     @Test
82     fun updateState_listenerNotified() {
83         val listener = TestShadeStateListener()
84         shadeExpansionStateManager.addStateListener(listener)
85 
86         shadeExpansionStateManager.updateState(STATE_OPEN)
87 
88         assertThat(listener.state).isEqualTo(STATE_OPEN)
89     }
90 
91     /* ***** [PanelExpansionStateManager.onPanelExpansionChanged] test cases *******/
92 
93     /* Fraction < 1 test cases */
94 
95     @Test
96     fun onPEC_fractionLessThanOne_expandedTrue_trackingFalse_becomesStateOpening() {
97         val listener = TestShadeStateListener()
98         shadeExpansionStateManager.addStateListener(listener)
99 
100         shadeExpansionStateManager.onPanelExpansionChanged(
101             fraction = 0.5f,
102             expanded = true,
103             tracking = false,
104             dragDownPxAmount = 0f
105         )
106 
107         assertThat(listener.state).isEqualTo(STATE_OPENING)
108     }
109 
110     @Test
111     fun onPEC_fractionLessThanOne_expandedTrue_trackingTrue_becomesStateOpening() {
112         val listener = TestShadeStateListener()
113         shadeExpansionStateManager.addStateListener(listener)
114 
115         shadeExpansionStateManager.onPanelExpansionChanged(
116             fraction = 0.5f,
117             expanded = true,
118             tracking = true,
119             dragDownPxAmount = 0f
120         )
121 
122         assertThat(listener.state).isEqualTo(STATE_OPENING)
123     }
124 
125     @Test
126     fun onPEC_fractionLessThanOne_expandedFalse_trackingFalse_becomesStateClosed() {
127         val listener = TestShadeStateListener()
128         shadeExpansionStateManager.addStateListener(listener)
129         // Start out on a different state
130         shadeExpansionStateManager.updateState(STATE_OPEN)
131 
132         shadeExpansionStateManager.onPanelExpansionChanged(
133             fraction = 0.5f,
134             expanded = false,
135             tracking = false,
136             dragDownPxAmount = 0f
137         )
138 
139         assertThat(listener.state).isEqualTo(STATE_CLOSED)
140     }
141 
142     @Test
143     fun onPEC_fractionLessThanOne_expandedFalse_trackingTrue_doesNotBecomeStateClosed() {
144         val listener = TestShadeStateListener()
145         shadeExpansionStateManager.addStateListener(listener)
146         // Start out on a different state
147         shadeExpansionStateManager.updateState(STATE_OPEN)
148 
149         shadeExpansionStateManager.onPanelExpansionChanged(
150             fraction = 0.5f,
151             expanded = false,
152             tracking = true,
153             dragDownPxAmount = 0f
154         )
155 
156         assertThat(listener.state).isEqualTo(STATE_OPEN)
157     }
158 
159     /* Fraction = 1 test cases */
160 
161     @Test
162     fun onPEC_fractionOne_expandedTrue_trackingFalse_becomesStateOpeningThenStateOpen() {
163         val listener = TestShadeStateListener()
164         shadeExpansionStateManager.addStateListener(listener)
165 
166         shadeExpansionStateManager.onPanelExpansionChanged(
167             fraction = 1f,
168             expanded = true,
169             tracking = false,
170             dragDownPxAmount = 0f
171         )
172 
173         assertThat(listener.previousState).isEqualTo(STATE_OPENING)
174         assertThat(listener.state).isEqualTo(STATE_OPEN)
175     }
176 
177     @Test
178     fun onPEC_fractionOne_expandedTrue_trackingTrue_becomesStateOpening() {
179         val listener = TestShadeStateListener()
180         shadeExpansionStateManager.addStateListener(listener)
181 
182         shadeExpansionStateManager.onPanelExpansionChanged(
183             fraction = 1f,
184             expanded = true,
185             tracking = true,
186             dragDownPxAmount = 0f
187         )
188 
189         assertThat(listener.state).isEqualTo(STATE_OPENING)
190     }
191 
192     @Test
193     fun onPEC_fractionOne_expandedFalse_trackingFalse_becomesStateClosed() {
194         val listener = TestShadeStateListener()
195         shadeExpansionStateManager.addStateListener(listener)
196         // Start out on a different state
197         shadeExpansionStateManager.updateState(STATE_OPEN)
198 
199         shadeExpansionStateManager.onPanelExpansionChanged(
200             fraction = 1f,
201             expanded = false,
202             tracking = false,
203             dragDownPxAmount = 0f
204         )
205 
206         assertThat(listener.state).isEqualTo(STATE_CLOSED)
207     }
208 
209     @Test
210     fun onPEC_fractionOne_expandedFalse_trackingTrue_doesNotBecomeStateClosed() {
211         val listener = TestShadeStateListener()
212         shadeExpansionStateManager.addStateListener(listener)
213         // Start out on a different state
214         shadeExpansionStateManager.updateState(STATE_OPEN)
215 
216         shadeExpansionStateManager.onPanelExpansionChanged(
217             fraction = 1f,
218             expanded = false,
219             tracking = true,
220             dragDownPxAmount = 0f
221         )
222 
223         assertThat(listener.state).isEqualTo(STATE_OPEN)
224     }
225 
226     /* ***** end [PanelExpansionStateManager.onPanelExpansionChanged] test cases ******/
227 
228     class TestShadeExpansionListener : ShadeExpansionListener {
229         var fraction: Float = 0f
230         var expanded: Boolean = false
231         var tracking: Boolean = false
232         var dragDownAmountPx: Float = 0f
233 
234         override fun onPanelExpansionChanged(event: ShadeExpansionChangeEvent) {
235             this.fraction = event.fraction
236             this.expanded = event.expanded
237             this.tracking = event.tracking
238             this.dragDownAmountPx = event.dragDownPxAmount
239         }
240     }
241 
242     class TestShadeStateListener : ShadeStateListener {
243         @PanelState var previousState: Int = STATE_CLOSED
244         @PanelState var state: Int = STATE_CLOSED
245 
246         override fun onPanelStateChanged(state: Int) {
247             this.previousState = this.state
248             this.state = state
249         }
250     }
251 }
252