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}