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.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(any(), any(), eq(EVENT_FLAG_DISPLAY_BRIGHTNESS))
98     }
99 
100     @Test
unregisterCallback_displayListenerStillRegisterednull101     fun unregisterCallback_displayListenerStillRegistered() {
102         val callback1 = TestCallback()
103         tracker.addDisplayChangeCallback(callback1, executor)
104         tracker.addDisplayChangeCallback(TestCallback(), executor)
105         tracker.removeCallback(callback1)
106 
107         verify(displayManager, never()).unregisterDisplayListener(any())
108     }
109 
110     @Test
unregisterLastCallback_unregistersDisplayListenernull111     fun unregisterLastCallback_unregistersDisplayListener() {
112         val callback = TestCallback()
113         tracker.addDisplayChangeCallback(callback, executor)
114         tracker.removeCallback(callback)
115 
116         verify(displayManager).unregisterDisplayListener(any())
117     }
118 
119     @Test
callbackCalledOnDisplayAddnull120     fun callbackCalledOnDisplayAdd() {
121         val testDisplay = 2
122         val callback = TestCallback()
123         tracker.addDisplayChangeCallback(callback, executor)
124         tracker.displayChangedListener.onDisplayAdded(testDisplay)
125 
126         assertThat(callback.lastDisplayAdded).isEqualTo(testDisplay)
127     }
128 
129     @Test
callbackCalledOnDisplayRemovednull130     fun callbackCalledOnDisplayRemoved() {
131         val testDisplay = 2
132         val callback = TestCallback()
133         tracker.addDisplayChangeCallback(callback, executor)
134         tracker.displayChangedListener.onDisplayRemoved(testDisplay)
135 
136         assertThat(callback.lastDisplayRemoved).isEqualTo(testDisplay)
137     }
138 
139     @Test
callbackCalledOnDisplayChangednull140     fun callbackCalledOnDisplayChanged() {
141         val testDisplay = 2
142         val callback = TestCallback()
143         tracker.addDisplayChangeCallback(callback, executor)
144         tracker.displayChangedListener.onDisplayChanged(testDisplay)
145 
146         assertThat(callback.lastDisplayChanged).isEqualTo(testDisplay)
147     }
148 
149     @Test
callbackCalledOnBrightnessChangednull150     fun callbackCalledOnBrightnessChanged() {
151         val testDisplay = 2
152         val callback = TestCallback()
153         tracker.addBrightnessChangeCallback(callback, executor)
154         tracker.displayBrightnessChangedListener.onDisplayChanged(testDisplay)
155 
156         assertThat(callback.lastDisplayChanged).isEqualTo(testDisplay)
157     }
158 
159     private class TestCallback : DisplayTracker.Callback {
160         var lastDisplayAdded = -1
161         var lastDisplayRemoved = -1
162         var lastDisplayChanged = -1
163 
onDisplayAddednull164         override fun onDisplayAdded(displayId: Int) {
165             lastDisplayAdded = displayId
166         }
167 
onDisplayRemovednull168         override fun onDisplayRemoved(displayId: Int) {
169             lastDisplayRemoved = displayId
170         }
171 
onDisplayChangednull172         override fun onDisplayChanged(displayId: Int) {
173             lastDisplayChanged = displayId
174         }
175     }
176 }
177