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.statusbar.window
18 
19 import android.app.StatusBarManager.WindowVisibleState
20 import android.app.StatusBarManager.WINDOW_NAVIGATION_BAR
21 import android.app.StatusBarManager.WINDOW_STATE_HIDDEN
22 import android.app.StatusBarManager.WINDOW_STATE_SHOWING
23 import android.app.StatusBarManager.WINDOW_STATUS_BAR
24 import androidx.test.filters.SmallTest
25 import com.android.systemui.SysuiTestCase
26 import com.android.systemui.statusbar.CommandQueue
27 import com.google.common.truth.Truth.assertThat
28 import org.junit.Before
29 import org.junit.Test
30 import org.mockito.ArgumentCaptor
31 import org.mockito.Mock
32 import org.mockito.Mockito.verify
33 import org.mockito.MockitoAnnotations
34 
35 @SmallTest
36 class StatusBarWindowStateControllerTest : SysuiTestCase() {
37     private lateinit var controller: StatusBarWindowStateController
38     private lateinit var callback: CommandQueue.Callbacks
39 
40     @Mock
41     private lateinit var commandQueue: CommandQueue
42 
43     @Before
44     fun setUp() {
45         MockitoAnnotations.initMocks(this)
46         controller = StatusBarWindowStateController(DISPLAY_ID, commandQueue)
47 
48         val callbackCaptor = ArgumentCaptor.forClass(CommandQueue.Callbacks::class.java)
49         verify(commandQueue).addCallback(callbackCaptor.capture())
50         callback = callbackCaptor.value!!
51     }
52 
53     @Test
54     fun setWindowState_notSameDisplayId_listenersNotNotified() {
55         val listener = TestListener()
56         controller.addListener(listener)
57 
58         callback.setWindowState(DISPLAY_ID + 1, WINDOW_STATUS_BAR, WINDOW_STATE_HIDDEN)
59 
60         assertThat(listener.state).isNull()
61     }
62 
63     @Test
64     fun setWindowState_notStatusBarWindow_listenersNotNotified() {
65         val listener = TestListener()
66         controller.addListener(listener)
67 
68         callback.setWindowState(DISPLAY_ID, WINDOW_NAVIGATION_BAR, WINDOW_STATE_HIDDEN)
69 
70         assertThat(listener.state).isNull()
71     }
72 
73     @Test
74     fun setWindowState_sameState_listenersNotNotified() {
75         val listener = TestListener()
76         controller.addListener(listener)
77 
78         callback.setWindowState(DISPLAY_ID, WINDOW_STATUS_BAR, WINDOW_STATE_SHOWING)
79 
80         assertThat(listener.state).isNull()
81     }
82 
83     @Test
84     fun setWindowState_newState_listenersNotified() {
85         val listener = TestListener()
86         controller.addListener(listener)
87         val newState = WINDOW_STATE_HIDDEN
88 
89         callback.setWindowState(DISPLAY_ID, WINDOW_STATUS_BAR, newState)
90 
91         assertThat(listener.state).isEqualTo(newState)
92     }
93 
94     private class TestListener : StatusBarWindowStateListener {
95         @WindowVisibleState var state: Int? = null
96         override fun onStatusBarWindowStateChanged(@WindowVisibleState state: Int) {
97             this.state = state
98         }
99     }
100 }
101 
102 private const val DISPLAY_ID = 10
103