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