1 /*
2  * Copyright (C) 2022 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.settings
18 
19 import android.hardware.display.DisplayManager
20 import android.hardware.display.DisplayManager.PRIVATE_EVENT_FLAG_DISPLAY_BRIGHTNESS
21 import android.hardware.display.DisplayManagerGlobal
22 import android.os.Handler
23 import android.testing.AndroidTestingRunner
24 import android.view.Display
25 import android.view.DisplayAdjustments
26 import android.view.DisplayInfo
27 import androidx.test.filters.SmallTest
28 import com.android.systemui.SysuiTestCase
29 import com.google.common.truth.Truth.assertThat
30 import java.util.concurrent.Executor
31 import org.junit.Before
32 import org.junit.Test
33 import org.junit.runner.RunWith
34 import org.mockito.Mock
35 import org.mockito.Mockito.any
36 import org.mockito.Mockito.eq
37 import org.mockito.Mockito.never
38 import org.mockito.Mockito.verify
39 import org.mockito.Mockito.`when`
40 import org.mockito.MockitoAnnotations
41 
42 @SmallTest
43 @RunWith(AndroidTestingRunner::class)
44 class DisplayTrackerImplTest : SysuiTestCase() {
45     @Mock private lateinit var displayManager: DisplayManager
46     @Mock private lateinit var handler: Handler
47 
48     private val executor = Executor(Runnable::run)
49     private lateinit var mDefaultDisplay: Display
50     private lateinit var mSecondaryDisplay: Display
51     private lateinit var tracker: DisplayTrackerImpl
52 
53     @Before
setUpnull54     fun setUp() {
55         MockitoAnnotations.initMocks(this)
56 
57         mDefaultDisplay =
58             Display(
59                 DisplayManagerGlobal.getInstance(),
60                 Display.DEFAULT_DISPLAY,
61                 DisplayInfo(),
62                 DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS,
63             )
64         mSecondaryDisplay =
65             Display(
66                 DisplayManagerGlobal.getInstance(),
67                 Display.DEFAULT_DISPLAY + 1,
68                 DisplayInfo(),
69                 DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS,
70             )
71 
72         `when`(displayManager.displays).thenReturn(arrayOf(mDefaultDisplay, mSecondaryDisplay))
73 
74         tracker = DisplayTrackerImpl(displayManager, handler)
75     }
76 
77     @Test
testGetDefaultDisplaynull78     fun testGetDefaultDisplay() {
79         assertThat(tracker.defaultDisplayId).isEqualTo(Display.DEFAULT_DISPLAY)
80     }
81 
82     @Test
testGetAllDisplaysnull83     fun testGetAllDisplays() {
84         assertThat(tracker.allDisplays).isEqualTo(arrayOf(mDefaultDisplay, mSecondaryDisplay))
85     }
86 
87     @Test
registerCallback_registersDisplayListenernull88     fun registerCallback_registersDisplayListener() {
89         tracker.addDisplayChangeCallback(TestCallback(), executor)
90         verify(displayManager).registerDisplayListener(any(), any())
91     }
92 
93     @Test
registerBrightnessCallback_registersDisplayListenernull94     fun registerBrightnessCallback_registersDisplayListener() {
95         tracker.addBrightnessChangeCallback(TestCallback(), executor)
96         verify(displayManager)
97             .registerDisplayListener(
98                 any(),
99                 any(),
100                 eq(0L),
101                 eq(PRIVATE_EVENT_FLAG_DISPLAY_BRIGHTNESS),
102             )
103     }
104 
105     @Test
unregisterCallback_displayListenerStillRegisterednull106     fun unregisterCallback_displayListenerStillRegistered() {
107         val callback1 = TestCallback()
108         tracker.addDisplayChangeCallback(callback1, executor)
109         tracker.addDisplayChangeCallback(TestCallback(), executor)
110         tracker.removeCallback(callback1)
111 
112         verify(displayManager, never()).unregisterDisplayListener(any())
113     }
114 
115     @Test
unregisterLastCallback_unregistersDisplayListenernull116     fun unregisterLastCallback_unregistersDisplayListener() {
117         val callback = TestCallback()
118         tracker.addDisplayChangeCallback(callback, executor)
119         tracker.removeCallback(callback)
120 
121         verify(displayManager).unregisterDisplayListener(any())
122     }
123 
124     @Test
callbackCalledOnDisplayAddnull125     fun callbackCalledOnDisplayAdd() {
126         val testDisplay = 2
127         val callback = TestCallback()
128         tracker.addDisplayChangeCallback(callback, executor)
129         tracker.displayChangedListener.onDisplayAdded(testDisplay)
130 
131         assertThat(callback.lastDisplayAdded).isEqualTo(testDisplay)
132     }
133 
134     @Test
callbackCalledOnDisplayRemovednull135     fun callbackCalledOnDisplayRemoved() {
136         val testDisplay = 2
137         val callback = TestCallback()
138         tracker.addDisplayChangeCallback(callback, executor)
139         tracker.displayChangedListener.onDisplayRemoved(testDisplay)
140 
141         assertThat(callback.lastDisplayRemoved).isEqualTo(testDisplay)
142     }
143 
144     @Test
callbackCalledOnDisplayChangednull145     fun callbackCalledOnDisplayChanged() {
146         val testDisplay = 2
147         val callback = TestCallback()
148         tracker.addDisplayChangeCallback(callback, executor)
149         tracker.displayChangedListener.onDisplayChanged(testDisplay)
150 
151         assertThat(callback.lastDisplayChanged).isEqualTo(testDisplay)
152     }
153 
154     @Test
callbackCalledOnBrightnessChangednull155     fun callbackCalledOnBrightnessChanged() {
156         val testDisplay = 2
157         val callback = TestCallback()
158         tracker.addBrightnessChangeCallback(callback, executor)
159         tracker.displayBrightnessChangedListener.onDisplayChanged(testDisplay)
160 
161         assertThat(callback.lastDisplayChanged).isEqualTo(testDisplay)
162     }
163 
164     private class TestCallback : DisplayTracker.Callback {
165         var lastDisplayAdded = -1
166         var lastDisplayRemoved = -1
167         var lastDisplayChanged = -1
168 
onDisplayAddednull169         override fun onDisplayAdded(displayId: Int) {
170             lastDisplayAdded = displayId
171         }
172 
onDisplayRemovednull173         override fun onDisplayRemoved(displayId: Int) {
174             lastDisplayRemoved = displayId
175         }
176 
onDisplayChangednull177         override fun onDisplayChanged(displayId: Int) {
178             lastDisplayChanged = displayId
179         }
180     }
181 }
182