1/* 2 * Copyright (C) 2017 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 17package com.android.systemui.doze; 18 19import static com.android.systemui.doze.DozeMachine.State.DOZE; 20import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD; 21import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSED; 22import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSING; 23import static com.android.systemui.doze.DozeMachine.State.DOZE_PULSE_DONE; 24import static com.android.systemui.doze.DozeMachine.State.DOZE_PULSING; 25import static com.android.systemui.doze.DozeMachine.State.DOZE_REQUEST_PULSE; 26import static com.android.systemui.doze.DozeMachine.State.FINISH; 27import static com.android.systemui.doze.DozeMachine.State.INITIALIZED; 28import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED; 29 30import static org.junit.Assert.assertEquals; 31import static org.junit.Assert.assertFalse; 32import static org.junit.Assert.assertNotEquals; 33import static org.junit.Assert.assertThat; 34import static org.junit.Assert.assertTrue; 35 36import android.os.PowerManager; 37import android.support.test.filters.SmallTest; 38import android.support.test.runner.AndroidJUnit4; 39 40import com.android.systemui.SysuiTestCase; 41import com.android.systemui.utils.hardware.FakeSensorManager; 42 43import org.junit.Before; 44import org.junit.Test; 45import org.junit.runner.RunWith; 46 47@RunWith(AndroidJUnit4.class) 48@SmallTest 49public class DozeScreenBrightnessTest extends SysuiTestCase { 50 51 static final int DEFAULT_BRIGHTNESS = 10; 52 static final int[] SENSOR_TO_BRIGHTNESS = new int[]{-1, 1, 2, 3, 4}; 53 static final int[] SENSOR_TO_OPACITY = new int[]{-1, 10, 0, 0, 0}; 54 55 DozeServiceFake mServiceFake; 56 DozeScreenBrightness mScreen; 57 FakeSensorManager.FakeGenericSensor mSensor; 58 FakeSensorManager mSensorManager; 59 DozeHostFake mHostFake; 60 61 @Before 62 public void setUp() throws Exception { 63 mServiceFake = new DozeServiceFake(); 64 mHostFake = new DozeHostFake(); 65 mSensorManager = new FakeSensorManager(mContext); 66 mSensor = mSensorManager.getFakeLightSensor(); 67 mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, 68 mSensor.getSensor(), mHostFake, null /* handler */, 69 DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY); 70 } 71 72 @Test 73 public void testInitialize_setsScreenBrightnessToValidValue() throws Exception { 74 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 75 76 assertEquals(DEFAULT_BRIGHTNESS, mServiceFake.screenBrightness); 77 assertTrue(mServiceFake.screenBrightness <= PowerManager.BRIGHTNESS_ON); 78 } 79 80 @Test 81 public void testAod_usesLightSensor() throws Exception { 82 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 83 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 84 85 mSensor.sendSensorEvent(3); 86 87 assertEquals(3, mServiceFake.screenBrightness); 88 } 89 90 @Test 91 public void testPausingAod_doesntPauseLightSensor() throws Exception { 92 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 93 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 94 95 mSensor.sendSensorEvent(1); 96 97 mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); 98 mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); 99 100 mSensor.sendSensorEvent(2); 101 102 assertEquals(2, mServiceFake.screenBrightness); 103 } 104 105 @Test 106 public void testPausingAod_doesNotResetBrightness() throws Exception { 107 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 108 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 109 110 mSensor.sendSensorEvent(1); 111 112 mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); 113 mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); 114 115 assertEquals(1, mServiceFake.screenBrightness); 116 } 117 118 @Test 119 public void testPulsing_usesLightSensor() throws Exception { 120 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 121 mScreen.transitionTo(INITIALIZED, DOZE); 122 mScreen.transitionTo(DOZE, DOZE_REQUEST_PULSE); 123 124 mSensor.sendSensorEvent(1); 125 126 assertEquals(1, mServiceFake.screenBrightness); 127 } 128 129 @Test 130 public void testDozingAfterPulsing_pausesLightSensor() throws Exception { 131 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 132 mScreen.transitionTo(INITIALIZED, DOZE); 133 mScreen.transitionTo(DOZE, DOZE_REQUEST_PULSE); 134 mScreen.transitionTo(DOZE_REQUEST_PULSE, DOZE_PULSING); 135 mScreen.transitionTo(DOZE_PULSING, DOZE_PULSE_DONE); 136 mScreen.transitionTo(DOZE_PULSE_DONE, DOZE); 137 138 mSensor.sendSensorEvent(1); 139 140 assertEquals(DEFAULT_BRIGHTNESS, mServiceFake.screenBrightness); 141 } 142 143 @Test 144 public void testNullSensor() throws Exception { 145 mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, 146 null /* sensor */, mHostFake, null /* handler */, 147 DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY); 148 149 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 150 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 151 mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); 152 mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); 153 } 154 155 @Test 156 public void testNoBrightnessDeliveredAfterFinish() throws Exception { 157 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 158 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 159 mScreen.transitionTo(DOZE_AOD, FINISH); 160 161 mSensor.sendSensorEvent(1); 162 163 assertNotEquals(1, mServiceFake.screenBrightness); 164 } 165 166 @Test 167 public void testNonPositiveBrightness_keepsPreviousBrightnessAndScrim() throws Exception { 168 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 169 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 170 171 mSensor.sendSensorEvent(1); 172 mSensor.sendSensorEvent(0); 173 174 assertEquals(1, mServiceFake.screenBrightness); 175 assertEquals(10/255f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */); 176 } 177 178 @Test 179 public void pausingAod_softBlanks() throws Exception { 180 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 181 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 182 183 mSensor.sendSensorEvent(2); 184 185 mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); 186 mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); 187 188 assertEquals(1f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */); 189 190 mSensor.sendSensorEvent(0); 191 assertEquals(1f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */); 192 193 mScreen.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD); 194 assertEquals(1f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */); 195 } 196 197 @Test 198 public void pausingAod_softBlanks_withSpuriousSensorDuringPause() throws Exception { 199 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 200 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 201 mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); 202 mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); 203 204 mSensor.sendSensorEvent(1); 205 assertEquals(1f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */); 206 } 207 208 @Test 209 public void pausingAod_unblanksAfterSensor() throws Exception { 210 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 211 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 212 213 mSensor.sendSensorEvent(2); 214 215 mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); 216 mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); 217 218 mSensor.sendSensorEvent(0); 219 220 mScreen.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD); 221 222 mSensor.sendSensorEvent(2); 223 224 assertEquals(0f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */); 225 } 226 227 @Test 228 public void pausingAod_unblanksIfSensorWasAlwaysReady() throws Exception { 229 mScreen.transitionTo(UNINITIALIZED, INITIALIZED); 230 mScreen.transitionTo(INITIALIZED, DOZE_AOD); 231 232 mSensor.sendSensorEvent(2); 233 234 mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); 235 mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); 236 mScreen.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD); 237 238 assertEquals(0f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */); 239 } 240}