blob: 8bb8aae768493199770f7a15c369420c9076ba2b [file] [log] [blame]
Christine Frankse5bb03e2017-02-10 17:36:10 -08001/*
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
Christine Franks0ada2772019-02-25 13:54:57 -080017package com.android.server.display.color;
Christine Frankse5bb03e2017-02-10 17:36:10 -080018
Brett Chabota26eda92018-07-23 13:08:30 -070019import static com.google.common.truth.Truth.assertWithMessage;
20
21import static org.mockito.Mockito.doReturn;
22
Justin Klaassen3da4c442017-05-05 15:19:33 -070023import android.annotation.NonNull;
Christine Frankse5bb03e2017-02-10 17:36:10 -080024import android.app.ActivityManager;
25import android.app.AlarmManager;
26import android.content.Context;
27import android.content.ContextWrapper;
Christine Franks83cc5412018-07-03 14:46:07 -070028import android.hardware.display.ColorDisplayManager;
Christine Franks71e003e2019-01-24 14:40:20 -080029import android.hardware.display.Time;
Justin Klaassen3da4c442017-05-05 15:19:33 -070030import android.os.Handler;
Christine Frankse5bb03e2017-02-10 17:36:10 -080031import android.os.UserHandle;
32import android.provider.Settings;
33import android.provider.Settings.Secure;
Daniel Solomon317a3572018-03-30 18:36:37 -070034import android.provider.Settings.System;
Christine Frankse5bb03e2017-02-10 17:36:10 -080035import android.test.mock.MockContentResolver;
36
Brett Chabota26eda92018-07-23 13:08:30 -070037import androidx.test.InstrumentationRegistry;
38import androidx.test.runner.AndroidJUnit4;
39
Christine Franks39b03112018-07-03 14:46:07 -070040import com.android.internal.R;
Christine Frankse5bb03e2017-02-10 17:36:10 -080041import com.android.internal.util.test.FakeSettingsProvider;
Christine Frankscf388c22018-05-15 15:48:10 -070042import com.android.server.LocalServices;
43import com.android.server.SystemService;
Justin Klaassen3da4c442017-05-05 15:19:33 -070044import com.android.server.twilight.TwilightListener;
Christine Frankse5bb03e2017-02-10 17:36:10 -080045import com.android.server.twilight.TwilightManager;
46import com.android.server.twilight.TwilightState;
Brett Chabota26eda92018-07-23 13:08:30 -070047
Christine Frankse5bb03e2017-02-10 17:36:10 -080048import org.junit.After;
Christine Franks83cc5412018-07-03 14:46:07 -070049import org.junit.AfterClass;
Christine Frankse5bb03e2017-02-10 17:36:10 -080050import org.junit.Before;
Christine Franks83cc5412018-07-03 14:46:07 -070051import org.junit.BeforeClass;
Christine Frankse5bb03e2017-02-10 17:36:10 -080052import org.junit.Test;
53import org.junit.runner.RunWith;
54import org.mockito.Mockito;
55
Brett Chabota26eda92018-07-23 13:08:30 -070056import java.time.LocalDateTime;
57import java.time.LocalTime;
58import java.time.ZoneId;
Christine Frankse5bb03e2017-02-10 17:36:10 -080059import java.util.Calendar;
Justin Klaassen3da4c442017-05-05 15:19:33 -070060import java.util.HashMap;
61import java.util.Map;
62import java.util.concurrent.CountDownLatch;
63import java.util.concurrent.TimeUnit;
Christine Frankse5bb03e2017-02-10 17:36:10 -080064
Christine Frankse5bb03e2017-02-10 17:36:10 -080065@RunWith(AndroidJUnit4.class)
Christine Franks5397f032017-11-01 18:35:16 -070066public class ColorDisplayServiceTest {
Christine Frankse5bb03e2017-02-10 17:36:10 -080067
68 private Context mContext;
69 private int mUserId;
70
Justin Klaassen3da4c442017-05-05 15:19:33 -070071 private MockTwilightManager mTwilightManager;
Christine Frankse5bb03e2017-02-10 17:36:10 -080072
Christine Franks0ada2772019-02-25 13:54:57 -080073 private ColorDisplayService mCds;
Christine Franks83cc5412018-07-03 14:46:07 -070074 private ColorDisplayService.BinderService mBinderService;
75
76 @BeforeClass
77 public static void setDtm() {
78 final DisplayTransformManager dtm = Mockito.mock(DisplayTransformManager.class);
79 LocalServices.addService(DisplayTransformManager.class, dtm);
80 }
Christine Frankse5bb03e2017-02-10 17:36:10 -080081
82 @Before
83 public void setUp() {
84 mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
Christine Frankse5bb03e2017-02-10 17:36:10 -080085 doReturn(mContext).when(mContext).getApplicationContext();
86
Christine Franks83cc5412018-07-03 14:46:07 -070087 mUserId = ActivityManager.getCurrentUser();
88
Christine Frankse5bb03e2017-02-10 17:36:10 -080089 final MockContentResolver cr = new MockContentResolver(mContext);
90 cr.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
91 doReturn(cr).when(mContext).getContentResolver();
92
93 final AlarmManager am = Mockito.mock(AlarmManager.class);
94 doReturn(am).when(mContext).getSystemService(Context.ALARM_SERVICE);
95
Justin Klaassen3da4c442017-05-05 15:19:33 -070096 mTwilightManager = new MockTwilightManager();
Christine Frankse5bb03e2017-02-10 17:36:10 -080097 LocalServices.addService(TwilightManager.class, mTwilightManager);
98
Christine Franks0ada2772019-02-25 13:54:57 -080099 mCds = new ColorDisplayService(mContext);
100 mBinderService = mCds.new BinderService();
Long Ling1d3f1892019-02-06 12:34:02 -0800101 LocalServices.addService(ColorDisplayService.ColorDisplayServiceInternal.class,
Christine Franks0ada2772019-02-25 13:54:57 -0800102 mCds.new ColorDisplayServiceInternal());
Christine Frankse5bb03e2017-02-10 17:36:10 -0800103 }
104
105 @After
106 public void tearDown() {
Christine Frankse5bb03e2017-02-10 17:36:10 -0800107 LocalServices.removeServiceForTest(TwilightManager.class);
108
Christine Franks0ada2772019-02-25 13:54:57 -0800109 mCds = null;
Christine Frankse5bb03e2017-02-10 17:36:10 -0800110
111 mTwilightManager = null;
112
113 mUserId = UserHandle.USER_NULL;
114 mContext = null;
Long Ling1d3f1892019-02-06 12:34:02 -0800115
116 LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800117 }
118
Christine Franks83cc5412018-07-03 14:46:07 -0700119 @AfterClass
120 public static void removeDtm() {
121 LocalServices.removeServiceForTest(DisplayTransformManager.class);
122 }
123
Christine Frankse5bb03e2017-02-10 17:36:10 -0800124 @Test
125 public void customSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
126 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800127 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800128
129 startService();
130 assertActivated(false /* activated */);
131 }
132
133 @Test
134 public void customSchedule_whenStartedAfterNight_ifOffBeforeNight_turnsOff() {
135 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800136 setNightDisplayActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800137
138 startService();
139 assertActivated(false /* activated */);
140 }
141
142 @Test
143 public void customSchedule_whenStartedAfterNight_ifOffDuringNight_turnsOff() {
144 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800145 setNightDisplayActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800146
147 startService();
148 assertActivated(false /* activated */);
149 }
150
151 @Test
152 public void customSchedule_whenStartedAfterNight_ifOffInFuture_turnsOff() {
153 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800154 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800155
156 startService();
157 assertActivated(false /* activated */);
158 }
159
160 @Test
161 public void customSchedule_whenStartedAfterNight_ifOnAfterNight_turnsOn() {
162 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800163 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800164
165 startService();
166 assertActivated(true /* activated */);
167 }
168
169 @Test
170 public void customSchedule_whenStartedAfterNight_ifOnBeforeNight_turnsOff() {
171 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800172 setNightDisplayActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800173
174 startService();
175 assertActivated(false /* activated */);
176 }
177
178 @Test
179 public void customSchedule_whenStartedAfterNight_ifOnDuringNight_turnsOff() {
180 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800181 setNightDisplayActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800182
183 startService();
184 assertActivated(false /* activated */);
185 }
186
187 @Test
188 public void customSchedule_whenStartedAfterNight_ifOnInFuture_turnsOff() {
189 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800190 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800191
192 startService();
193 assertActivated(false /* activated */);
194 }
195
196 @Test
197 public void customSchedule_whenStartedBeforeNight_ifOffAfterNight_turnsOff() {
198 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800199 setNightDisplayActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800200
201 startService();
202 assertActivated(false /* activated */);
203 }
204
205 @Test
206 public void customSchedule_whenStartedBeforeNight_ifOffBeforeNight_turnsOff() {
207 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800208 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800209
210 startService();
211 assertActivated(false /* activated */);
212 }
213
214 @Test
215 public void customSchedule_whenStartedBeforeNight_ifOffDuringNight_turnsOff() {
216 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800217 setNightDisplayActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800218
219 startService();
220 assertActivated(false /* activated */);
221 }
222
223 @Test
224 public void customSchedule_whenStartedBeforeNight_ifOffInPast_turnsOff() {
225 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800226 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800227
228 startService();
229 assertActivated(false /* activated */);
230 }
231
232 @Test
233 public void customSchedule_whenStartedBeforeNight_ifOnAfterNight_turnsOff() {
234 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800235 setNightDisplayActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800236
237 startService();
238 assertActivated(false /* activated */);
239 }
240
241 @Test
242 public void customSchedule_whenStartedBeforeNight_ifOnBeforeNight_turnsOff() {
243 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800244 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800245
246 startService();
247 assertActivated(false /* activated */);
248 }
249
250 @Test
251 public void customSchedule_whenStartedBeforeNight_ifOnDuringNight_turnsOff() {
252 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800253 setNightDisplayActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800254
255 startService();
256 assertActivated(false /* activated */);
257 }
258
259 @Test
260 public void customSchedule_whenStartedBeforeNight_ifOnInPast_turnsOn() {
261 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800262 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800263
264 startService();
265 assertActivated(true /* activated */);
266 }
267
268 @Test
269 public void customSchedule_whenStartedDuringNight_ifOffAfterNight_turnsOn() {
270 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800271 setNightDisplayActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800272
273 startService();
274 assertActivated(true /* activated */);
275 }
276
277 @Test
278 public void customSchedule_whenStartedDuringNight_ifOffBeforeNight_turnsOn() {
279 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800280 setNightDisplayActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800281
282 startService();
283 assertActivated(true /* activated */);
284 }
285
286 @Test
287 public void customSchedule_whenStartedDuringNight_ifOffDuringNightInFuture_turnsOn() {
288 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800289 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800290
291 startService();
292 assertActivated(true /* activated */);
293 }
294
295 @Test
296 public void customSchedule_whenStartedDuringNight_ifOffDuringNightInPast_turnsOff() {
297 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800298 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800299
300 startService();
301 assertActivated(false /* activated */);
302 }
303
304 @Test
305 public void customSchedule_whenStartedDuringNight_ifOnAfterNight_turnsOn() {
306 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800307 setNightDisplayActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800308
309 startService();
310 assertActivated(true /* activated */);
311 }
312
313 @Test
314 public void customSchedule_whenStartedDuringNight_ifOnBeforeNight_turnsOn() {
315 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800316 setNightDisplayActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800317
318 startService();
319 assertActivated(true /* activated */);
320 }
321
322 @Test
323 public void customSchedule_whenStartedDuringNight_ifOnDuringNightInFuture_turnsOn() {
324 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800325 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800326
327 startService();
328 assertActivated(true /* activated */);
329 }
330
331 @Test
332 public void customSchedule_whenStartedDuringNight_ifOnDuringNightInPast_turnsOn() {
333 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800334 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800335
336 startService();
337 assertActivated(true /* activated */);
338 }
339
340 @Test
341 public void twilightSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
342 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800343 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800344
345 startService();
346 assertActivated(false /* activated */);
347 }
348
349 @Test
350 public void twilightSchedule_whenStartedAfterNight_ifOffBeforeNight_turnsOff() {
351 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800352 setNightDisplayActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800353
354 startService();
355 assertActivated(false /* activated */);
356 }
357
358 @Test
359 public void twilightSchedule_whenStartedAfterNight_ifOffDuringNight_turnsOff() {
360 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800361 setNightDisplayActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800362
363 startService();
364 assertActivated(false /* activated */);
365 }
366
367 @Test
368 public void twilightSchedule_whenStartedAfterNight_ifOffInFuture_turnsOff() {
369 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800370 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800371
372 startService();
373 assertActivated(false /* activated */);
374 }
375
376 @Test
377 public void twilightSchedule_whenStartedAfterNight_ifOnAfterNight_turnsOn() {
378 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800379 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800380
381 startService();
382 assertActivated(true /* activated */);
383 }
384
385 @Test
386 public void twilightSchedule_whenStartedAfterNight_ifOnBeforeNight_turnsOff() {
387 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800388 setNightDisplayActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800389
390 startService();
391 assertActivated(false /* activated */);
392 }
393
394 @Test
395 public void twilightSchedule_whenStartedAfterNight_ifOnDuringNight_turnsOff() {
396 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800397 setNightDisplayActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800398
399 startService();
400 assertActivated(false /* activated */);
401 }
402
403 @Test
404 public void twilightSchedule_whenStartedAfterNight_ifOnInFuture_turnsOff() {
405 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800406 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800407
408 startService();
409 assertActivated(false /* activated */);
410 }
411
412 @Test
413 public void twilightSchedule_whenStartedBeforeNight_ifOffAfterNight_turnsOff() {
414 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800415 setNightDisplayActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800416
417 startService();
418 assertActivated(false /* activated */);
419 }
420
421 @Test
422 public void twilightSchedule_whenStartedBeforeNight_ifOffBeforeNight_turnsOff() {
423 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800424 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800425
426 startService();
427 assertActivated(false /* activated */);
428 }
429
430 @Test
431 public void twilightSchedule_whenStartedBeforeNight_ifOffDuringNight_turnsOff() {
432 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800433 setNightDisplayActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800434
435 startService();
436 assertActivated(false /* activated */);
437 }
438
439 @Test
440 public void twilightSchedule_whenStartedBeforeNight_ifOffInPast_turnsOff() {
441 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800442 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800443
444 startService();
445 assertActivated(false /* activated */);
446 }
447
448 @Test
449 public void twilightSchedule_whenStartedBeforeNight_ifOnAfterNight_turnsOff() {
450 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800451 setNightDisplayActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800452
453 startService();
454 assertActivated(false /* activated */);
455 }
456
457 @Test
458 public void twilightSchedule_whenStartedBeforeNight_ifOnBeforeNight_turnsOff() {
459 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800460 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800461
462 startService();
463 assertActivated(false /* activated */);
464 }
465
466 @Test
467 public void twilightSchedule_whenStartedBeforeNight_ifOnDuringNight_turnsOff() {
468 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800469 setNightDisplayActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800470
471 startService();
472 assertActivated(false /* activated */);
473 }
474
475 @Test
476 public void twilightSchedule_whenStartedBeforeNight_ifOnInPast_turnsOn() {
477 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800478 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800479
480 startService();
481 assertActivated(true /* activated */);
482 }
483
484 @Test
485 public void twilightSchedule_whenStartedDuringNight_ifOffAfterNight_turnsOn() {
486 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800487 setNightDisplayActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800488
489 startService();
490 assertActivated(true /* activated */);
491 }
492
493 @Test
494 public void twilightSchedule_whenStartedDuringNight_ifOffBeforeNight_turnsOn() {
495 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800496 setNightDisplayActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800497
498 startService();
499 assertActivated(true /* activated */);
500 }
501
502 @Test
503 public void twilightSchedule_whenStartedDuringNight_ifOffDuringNightInFuture_turnsOn() {
504 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800505 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800506
507 startService();
508 assertActivated(true /* activated */);
509 }
510
511 @Test
512 public void twilightSchedule_whenStartedDuringNight_ifOffDuringNightInPast_turnsOff() {
513 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800514 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800515
516 startService();
517 assertActivated(false /* activated */);
518 }
519
520 @Test
521 public void twilightSchedule_whenStartedDuringNight_ifOnAfterNight_turnsOn() {
522 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800523 setNightDisplayActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800524
525 startService();
526 assertActivated(true /* activated */);
527 }
528
529 @Test
530 public void twilightSchedule_whenStartedDuringNight_ifOnBeforeNight_turnsOn() {
531 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800532 setNightDisplayActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800533
534 startService();
535 assertActivated(true /* activated */);
536 }
537
538 @Test
539 public void twilightSchedule_whenStartedDuringNight_ifOnDuringNightInFuture_turnsOn() {
540 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800541 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800542
543 startService();
544 assertActivated(true /* activated */);
545 }
546
547 @Test
548 public void twilightSchedule_whenStartedDuringNight_ifOnDuringNightInPast_turnsOn() {
549 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800550 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800551
552 startService();
553 assertActivated(true /* activated */);
554 }
555
Justin Klaassen3da4c442017-05-05 15:19:33 -0700556 @Test
557 public void twilightSchedule_whenRebootedAfterNight_ifOffAfterNight_turnsOff() {
558 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800559 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700560
561 final TwilightState state = mTwilightManager.getLastTwilightState();
562 mTwilightManager.setTwilightState(null);
563
564 startService();
565 assertActivated(false /* activated */);
566
567 mTwilightManager.setTwilightState(state);
568 assertActivated(false /* activated */);
569 }
570
571 @Test
572 public void twilightSchedule_whenRebootedAfterNight_ifOffBeforeNight_turnsOff() {
573 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800574 setNightDisplayActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700575
576 final TwilightState state = mTwilightManager.getLastTwilightState();
577 mTwilightManager.setTwilightState(null);
578
579 startService();
580 assertActivated(false /* activated */);
581
582 mTwilightManager.setTwilightState(state);
583 assertActivated(false /* activated */);
584 }
585
586 @Test
587 public void twilightSchedule_whenRebootedAfterNight_ifOffDuringNight_turnsOff() {
588 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800589 setNightDisplayActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700590
591 final TwilightState state = mTwilightManager.getLastTwilightState();
592 mTwilightManager.setTwilightState(null);
593
594 startService();
595 assertActivated(false /* activated */);
596
597 mTwilightManager.setTwilightState(state);
598 assertActivated(false /* activated */);
599 }
600
601 @Test
602 public void twilightSchedule_whenRebootedAfterNight_ifOffInFuture_turnsOff() {
603 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800604 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700605
606 final TwilightState state = mTwilightManager.getLastTwilightState();
607 mTwilightManager.setTwilightState(null);
608
609 startService();
610 assertActivated(false /* activated */);
611
612 mTwilightManager.setTwilightState(state);
613 assertActivated(false /* activated */);
614 }
615
616 @Test
617 public void twilightSchedule_whenRebootedAfterNight_ifOnAfterNight_turnsOn() {
618 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800619 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700620
621 final TwilightState state = mTwilightManager.getLastTwilightState();
622 mTwilightManager.setTwilightState(null);
623
624 startService();
625 assertActivated(true /* activated */);
626
627 mTwilightManager.setTwilightState(state);
628 assertActivated(true /* activated */);
629 }
630
631 @Test
632 public void twilightSchedule_whenRebootedAfterNight_ifOnBeforeNight_turnsOff() {
633 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800634 setNightDisplayActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700635
636 final TwilightState state = mTwilightManager.getLastTwilightState();
637 mTwilightManager.setTwilightState(null);
638
639 startService();
640 assertActivated(true /* activated */);
641
642 mTwilightManager.setTwilightState(state);
643 assertActivated(false /* activated */);
644 }
645
646 @Test
647 public void twilightSchedule_whenRebootedAfterNight_ifOnDuringNight_turnsOff() {
648 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800649 setNightDisplayActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700650
651 final TwilightState state = mTwilightManager.getLastTwilightState();
652 mTwilightManager.setTwilightState(null);
653
654 startService();
655 assertActivated(true /* activated */);
656
657 mTwilightManager.setTwilightState(state);
658 assertActivated(false /* activated */);
659 }
660
661 @Test
662 public void twilightSchedule_whenRebootedAfterNight_ifOnInFuture_turnsOff() {
663 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800664 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700665
666 final TwilightState state = mTwilightManager.getLastTwilightState();
667 mTwilightManager.setTwilightState(null);
668
669 startService();
670 assertActivated(true /* activated */);
671
672 mTwilightManager.setTwilightState(state);
673 assertActivated(false /* activated */);
674 }
675
676 @Test
677 public void twilightSchedule_whenRebootedBeforeNight_ifOffAfterNight_turnsOff() {
678 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800679 setNightDisplayActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700680
681 final TwilightState state = mTwilightManager.getLastTwilightState();
682 mTwilightManager.setTwilightState(null);
683
684 startService();
685 assertActivated(false /* activated */);
686
687 mTwilightManager.setTwilightState(state);
688 assertActivated(false /* activated */);
689 }
690
691 @Test
692 public void twilightSchedule_whenRebootedBeforeNight_ifOffBeforeNight_turnsOff() {
693 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800694 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700695
696 final TwilightState state = mTwilightManager.getLastTwilightState();
697 mTwilightManager.setTwilightState(null);
698
699 startService();
700 assertActivated(false /* activated */);
701
702 mTwilightManager.setTwilightState(state);
703 assertActivated(false /* activated */);
704 }
705
706 @Test
707 public void twilightSchedule_whenRebootedBeforeNight_ifOffDuringNight_turnsOff() {
708 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800709 setNightDisplayActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700710
711 final TwilightState state = mTwilightManager.getLastTwilightState();
712 mTwilightManager.setTwilightState(null);
713
714 startService();
715 assertActivated(false /* activated */);
716
717 mTwilightManager.setTwilightState(state);
718 assertActivated(false /* activated */);
719 }
720
721 @Test
722 public void twilightSchedule_whenRebootedBeforeNight_ifOffInPast_turnsOff() {
723 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800724 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700725
726 final TwilightState state = mTwilightManager.getLastTwilightState();
727 mTwilightManager.setTwilightState(null);
728
729 startService();
730 assertActivated(false /* activated */);
731
732 mTwilightManager.setTwilightState(state);
733 assertActivated(false /* activated */);
734 }
735
736 @Test
737 public void twilightSchedule_whenRebootedBeforeNight_ifOnAfterNight_turnsOff() {
738 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800739 setNightDisplayActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700740
741 final TwilightState state = mTwilightManager.getLastTwilightState();
742 mTwilightManager.setTwilightState(null);
743
744 startService();
745 assertActivated(true /* activated */);
746
747 mTwilightManager.setTwilightState(state);
748 assertActivated(false /* activated */);
749 }
750
751 @Test
752 public void twilightSchedule_whenRebootedBeforeNight_ifOnBeforeNight_turnsOff() {
753 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800754 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700755
756 final TwilightState state = mTwilightManager.getLastTwilightState();
757 mTwilightManager.setTwilightState(null);
758
759 startService();
760 assertActivated(true /* activated */);
761
762 mTwilightManager.setTwilightState(state);
763 assertActivated(false /* activated */);
764 }
765
766 @Test
767 public void twilightSchedule_whenRebootedBeforeNight_ifOnDuringNight_turnsOff() {
768 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800769 setNightDisplayActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700770
771 final TwilightState state = mTwilightManager.getLastTwilightState();
772 mTwilightManager.setTwilightState(null);
773
774 startService();
775 assertActivated(true /* activated */);
776
777 mTwilightManager.setTwilightState(state);
778 assertActivated(false /* activated */);
779 }
780
781 @Test
782 public void twilightSchedule_whenRebootedBeforeNight_ifOnInPast_turnsOn() {
783 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800784 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700785
786 final TwilightState state = mTwilightManager.getLastTwilightState();
787 mTwilightManager.setTwilightState(null);
788
789 startService();
790 assertActivated(true /* activated */);
791
792 mTwilightManager.setTwilightState(state);
793 assertActivated(true /* activated */);
794 }
795
796 @Test
797 public void twilightSchedule_whenRebootedDuringNight_ifOffAfterNight_turnsOn() {
798 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800799 setNightDisplayActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700800
801 final TwilightState state = mTwilightManager.getLastTwilightState();
802 mTwilightManager.setTwilightState(null);
803
804 startService();
805 assertActivated(false /* activated */);
806
807 mTwilightManager.setTwilightState(state);
808 assertActivated(true /* activated */);
809 }
810
811 @Test
812 public void twilightSchedule_whenRebootedDuringNight_ifOffBeforeNight_turnsOn() {
813 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800814 setNightDisplayActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700815
816 final TwilightState state = mTwilightManager.getLastTwilightState();
817 mTwilightManager.setTwilightState(null);
818
819 startService();
820 assertActivated(false /* activated */);
821
822 mTwilightManager.setTwilightState(state);
823 assertActivated(true /* activated */);
824 }
825
826 @Test
827 public void twilightSchedule_whenRebootedDuringNight_ifOffDuringNightInFuture_turnsOn() {
828 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800829 setNightDisplayActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700830
831 final TwilightState state = mTwilightManager.getLastTwilightState();
832 mTwilightManager.setTwilightState(null);
833
834 startService();
835 assertActivated(false /* activated */);
836
837 mTwilightManager.setTwilightState(state);
838 assertActivated(true /* activated */);
839 }
840
841 @Test
842 public void twilightSchedule_whenRebootedDuringNight_ifOffDuringNightInPast_turnsOff() {
843 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800844 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700845
846 final TwilightState state = mTwilightManager.getLastTwilightState();
847 mTwilightManager.setTwilightState(null);
848
849 startService();
850 assertActivated(false /* activated */);
851
852 mTwilightManager.setTwilightState(state);
853 assertActivated(false /* activated */);
854 }
855
856 @Test
857 public void twilightSchedule_whenRebootedDuringNight_ifOnAfterNight_turnsOn() {
858 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800859 setNightDisplayActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700860
861 final TwilightState state = mTwilightManager.getLastTwilightState();
862 mTwilightManager.setTwilightState(null);
863
864 startService();
865 assertActivated(true /* activated */);
866
867 mTwilightManager.setTwilightState(state);
868 assertActivated(true /* activated */);
869 }
870
871 @Test
872 public void twilightSchedule_whenRebootedDuringNight_ifOnBeforeNight_turnsOn() {
873 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800874 setNightDisplayActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700875
876 final TwilightState state = mTwilightManager.getLastTwilightState();
877 mTwilightManager.setTwilightState(null);
878
879 startService();
880 assertActivated(true /* activated */);
881
882 mTwilightManager.setTwilightState(state);
883 assertActivated(true /* activated */);
884 }
885
886 @Test
887 public void twilightSchedule_whenRebootedDuringNight_ifOnDuringNightInFuture_turnsOn() {
888 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800889 setNightDisplayActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700890
891 final TwilightState state = mTwilightManager.getLastTwilightState();
892 mTwilightManager.setTwilightState(null);
893
894 startService();
895 assertActivated(true /* activated */);
896
897 mTwilightManager.setTwilightState(state);
898 assertActivated(true /* activated */);
899 }
900
901 @Test
902 public void twilightSchedule_whenRebootedDuringNight_ifOnDuringNightInPast_turnsOn() {
903 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
Christine Franks6caba0f2019-03-07 17:48:25 -0800904 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700905
906 final TwilightState state = mTwilightManager.getLastTwilightState();
907 mTwilightManager.setTwilightState(null);
908
909 startService();
910 assertActivated(true /* activated */);
911
912 mTwilightManager.setTwilightState(state);
913 assertActivated(true /* activated */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800914 }
915
Daniel Solomon317a3572018-03-30 18:36:37 -0700916 @Test
917 public void accessibility_colorInversion_transformActivated() {
Chia-I Wu1e0e7172018-03-14 15:45:29 -0700918 if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) {
919 return;
920 }
921
Daniel Solomon317a3572018-03-30 18:36:37 -0700922 setAccessibilityColorInversion(true);
Christine Franksd154fe52019-01-04 17:17:45 -0800923 setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
Daniel Solomon317a3572018-03-30 18:36:37 -0700924
925 startService();
Christine Franksd154fe52019-01-04 17:17:45 -0800926 assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
927 if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) {
928 assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED);
929 } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) {
930 assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC);
Christine Franks39b03112018-07-03 14:46:07 -0700931 }
Daniel Solomon317a3572018-03-30 18:36:37 -0700932 }
933
934 @Test
935 public void accessibility_colorCorrection_transformActivated() {
Chia-I Wu1e0e7172018-03-14 15:45:29 -0700936 if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) {
937 return;
938 }
939
Daniel Solomon317a3572018-03-30 18:36:37 -0700940 setAccessibilityColorCorrection(true);
Christine Franksd154fe52019-01-04 17:17:45 -0800941 setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
Daniel Solomon317a3572018-03-30 18:36:37 -0700942
943 startService();
Christine Franksd154fe52019-01-04 17:17:45 -0800944 assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
945 if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) {
946 assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED);
947 } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) {
948 assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC);
Christine Franks39b03112018-07-03 14:46:07 -0700949 }
Daniel Solomon317a3572018-03-30 18:36:37 -0700950 }
951
952 @Test
953 public void accessibility_all_transformActivated() {
Chia-I Wu1e0e7172018-03-14 15:45:29 -0700954 if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) {
955 return;
956 }
957
Daniel Solomon317a3572018-03-30 18:36:37 -0700958 setAccessibilityColorCorrection(true);
959 setAccessibilityColorInversion(true);
Christine Franksd154fe52019-01-04 17:17:45 -0800960 setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
Daniel Solomon317a3572018-03-30 18:36:37 -0700961
962 startService();
Christine Franksd154fe52019-01-04 17:17:45 -0800963 assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
964 if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) {
965 assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED);
966 } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) {
967 assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC);
Christine Franks39b03112018-07-03 14:46:07 -0700968 }
Daniel Solomon317a3572018-03-30 18:36:37 -0700969 }
970
971 @Test
972 public void accessibility_none_transformActivated() {
Chia-I Wu1e0e7172018-03-14 15:45:29 -0700973 if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) {
974 return;
975 }
976
Daniel Solomon317a3572018-03-30 18:36:37 -0700977 setAccessibilityColorCorrection(false);
978 setAccessibilityColorInversion(false);
Christine Franksd154fe52019-01-04 17:17:45 -0800979 setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
Daniel Solomon317a3572018-03-30 18:36:37 -0700980
981 startService();
Christine Franksd154fe52019-01-04 17:17:45 -0800982 assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
983 assertActiveColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
Daniel Solomon317a3572018-03-30 18:36:37 -0700984 }
985
Long Ling1d3f1892019-02-06 12:34:02 -0800986 @Test
Christine Franks6caba0f2019-03-07 17:48:25 -0800987 public void displayWhiteBalance_enabled() {
988 setDisplayWhiteBalanceEnabled(true);
989 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Long Ling1d3f1892019-02-06 12:34:02 -0800990 mBinderService.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
991 startService();
992 assertDwbActive(true);
993 }
994
995 @Test
Christine Franks6caba0f2019-03-07 17:48:25 -0800996 public void displayWhiteBalance_disabledAfterNightDisplayEnabled() {
997 setDisplayWhiteBalanceEnabled(true);
Long Ling1d3f1892019-02-06 12:34:02 -0800998 startService();
Christine Franks6caba0f2019-03-07 17:48:25 -0800999 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Long Ling1d3f1892019-02-06 12:34:02 -08001000
1001 /* Since we are using FakeSettingsProvider which could not trigger observer change,
1002 * force an update here.*/
Christine Franks0ada2772019-02-25 13:54:57 -08001003 mCds.updateDisplayWhiteBalanceStatus();
Long Ling1d3f1892019-02-06 12:34:02 -08001004 assertDwbActive(false);
1005 }
1006
1007 @Test
Christine Franks6caba0f2019-03-07 17:48:25 -08001008 public void displayWhiteBalance_enabledAfterNightDisplayDisabled() {
1009 setDisplayWhiteBalanceEnabled(true);
Long Ling1d3f1892019-02-06 12:34:02 -08001010 startService();
Christine Franks6caba0f2019-03-07 17:48:25 -08001011 setNightDisplayActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
Long Ling1d3f1892019-02-06 12:34:02 -08001012
Christine Franks0ada2772019-02-25 13:54:57 -08001013 mCds.updateDisplayWhiteBalanceStatus();
Long Ling1d3f1892019-02-06 12:34:02 -08001014 assertDwbActive(false);
1015
Christine Franks6caba0f2019-03-07 17:48:25 -08001016 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Franks0ada2772019-02-25 13:54:57 -08001017 mCds.updateDisplayWhiteBalanceStatus();
Long Ling1d3f1892019-02-06 12:34:02 -08001018 assertDwbActive(true);
1019 }
1020
1021 @Test
Christine Franks6caba0f2019-03-07 17:48:25 -08001022 public void displayWhiteBalance_enabledAfterLinearColorModeSelected() {
1023 setDisplayWhiteBalanceEnabled(true);
1024 setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Long Ling1d3f1892019-02-06 12:34:02 -08001025 startService();
1026 mBinderService.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
1027
Christine Franks0ada2772019-02-25 13:54:57 -08001028 mCds.updateDisplayWhiteBalanceStatus();
Long Ling1d3f1892019-02-06 12:34:02 -08001029 assertDwbActive(true);
1030 }
1031
Daniel Solomonff24ba92019-04-11 19:29:31 -07001032 @Test
1033 public void displayWhiteBalance_disabledWhileAccessibilityColorCorrectionEnabled() {
1034 setDisplayWhiteBalanceEnabled(true);
1035 startService();
1036 setAccessibilityColorCorrection(true);
1037
1038 mCds.updateDisplayWhiteBalanceStatus();
1039 assertDwbActive(false);
1040
1041 setAccessibilityColorCorrection(false);
1042 mCds.updateDisplayWhiteBalanceStatus();
1043 assertDwbActive(true);
1044 }
1045
1046 @Test
1047 public void displayWhiteBalance_disabledWhileAccessibilityColorInversionEnabled() {
1048 setDisplayWhiteBalanceEnabled(true);
1049 startService();
1050 setAccessibilityColorInversion(true);
1051
1052 mCds.updateDisplayWhiteBalanceStatus();
1053 assertDwbActive(false);
1054
1055 setAccessibilityColorInversion(false);
1056 mCds.updateDisplayWhiteBalanceStatus();
1057 assertDwbActive(true);
1058 }
1059
Christine Frankse5bb03e2017-02-10 17:36:10 -08001060 /**
1061 * Configures Night display to use a custom schedule.
1062 *
1063 * @param startTimeOffset the offset relative to now to activate Night display (in minutes)
Justin Klaassen3da4c442017-05-05 15:19:33 -07001064 * @param endTimeOffset the offset relative to now to deactivate Night display (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -08001065 */
1066 private void setAutoModeCustom(int startTimeOffset, int endTimeOffset) {
Christine Franks71e003e2019-01-24 14:40:20 -08001067 mBinderService.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_CUSTOM_TIME);
1068 mBinderService.setNightDisplayCustomStartTime(
1069 new Time(getLocalTimeRelativeToNow(startTimeOffset)));
1070 mBinderService
1071 .setNightDisplayCustomEndTime(new Time(getLocalTimeRelativeToNow(endTimeOffset)));
Christine Frankse5bb03e2017-02-10 17:36:10 -08001072 }
1073
1074 /**
1075 * Configures Night display to use the twilight schedule.
1076 *
Justin Klaassen3da4c442017-05-05 15:19:33 -07001077 * @param sunsetOffset the offset relative to now for sunset (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -08001078 * @param sunriseOffset the offset relative to now for sunrise (in minutes)
1079 */
1080 private void setAutoModeTwilight(int sunsetOffset, int sunriseOffset) {
Christine Franks71e003e2019-01-24 14:40:20 -08001081 mBinderService.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_TWILIGHT);
Justin Klaassen3da4c442017-05-05 15:19:33 -07001082 mTwilightManager.setTwilightState(
1083 getTwilightStateRelativeToNow(sunsetOffset, sunriseOffset));
Christine Frankse5bb03e2017-02-10 17:36:10 -08001084 }
1085
1086 /**
1087 * Configures the Night display activated state.
1088 *
Justin Klaassen3da4c442017-05-05 15:19:33 -07001089 * @param activated {@code true} if Night display should be activated
Christine Frankse5bb03e2017-02-10 17:36:10 -08001090 * @param lastActivatedTimeOffset the offset relative to now to record that Night display was
Justin Klaassen3da4c442017-05-05 15:19:33 -07001091 * activated (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -08001092 */
Christine Franks6caba0f2019-03-07 17:48:25 -08001093 private void setNightDisplayActivated(boolean activated, int lastActivatedTimeOffset) {
Christine Franks83cc5412018-07-03 14:46:07 -07001094 mBinderService.setNightDisplayActivated(activated);
Christine Franks03213462017-08-25 13:57:26 -07001095 Secure.putStringForUser(mContext.getContentResolver(),
1096 Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME,
1097 LocalDateTime.now().plusMinutes(lastActivatedTimeOffset).toString(),
1098 mUserId);
Christine Frankse5bb03e2017-02-10 17:36:10 -08001099 }
1100
1101 /**
Daniel Solomon317a3572018-03-30 18:36:37 -07001102 * Configures the Accessibility color correction setting state.
1103 *
1104 * @param state {@code true} if color inversion should be activated
1105 */
1106 private void setAccessibilityColorCorrection(boolean state) {
1107 Secure.putIntForUser(mContext.getContentResolver(),
1108 Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, state ? 1 : 0, mUserId);
1109 }
1110
1111 /**
1112 * Configures the Accessibility color inversion setting state.
1113 *
1114 * @param state {@code true} if color inversion should be activated
1115 */
1116 private void setAccessibilityColorInversion(boolean state) {
1117 Secure.putIntForUser(mContext.getContentResolver(),
1118 Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, state ? 1 : 0, mUserId);
1119 }
1120
1121 /**
Long Ling1d3f1892019-02-06 12:34:02 -08001122 * Configures the Display White Balance setting state.
1123 *
Christine Franks6caba0f2019-03-07 17:48:25 -08001124 * @param enabled {@code true} if display white balance should be enabled
Long Ling1d3f1892019-02-06 12:34:02 -08001125 */
Christine Franks6caba0f2019-03-07 17:48:25 -08001126 private void setDisplayWhiteBalanceEnabled(boolean enabled) {
Long Ling1d3f1892019-02-06 12:34:02 -08001127 Secure.putIntForUser(mContext.getContentResolver(),
Christine Franks6caba0f2019-03-07 17:48:25 -08001128 Secure.DISPLAY_WHITE_BALANCE_ENABLED, enabled ? 1 : 0, mUserId);
Long Ling1d3f1892019-02-06 12:34:02 -08001129 }
1130
1131 /**
Christine Franks71e003e2019-01-24 14:40:20 -08001132 * Configures color mode.
Daniel Solomon317a3572018-03-30 18:36:37 -07001133 */
Christine Franks83cc5412018-07-03 14:46:07 -07001134 private void setColorMode(int colorMode) {
Christine Franks71e003e2019-01-24 14:40:20 -08001135 mBinderService.setColorMode(colorMode);
Daniel Solomon317a3572018-03-30 18:36:37 -07001136 }
1137
1138 /**
Christine Franks39b03112018-07-03 14:46:07 -07001139 * Returns whether the color mode is valid on the device the tests are running on.
Christine Franks39b03112018-07-03 14:46:07 -07001140 */
1141 private boolean isColorModeValid(int mode) {
1142 final int[] availableColorModes = mContext.getResources().getIntArray(
Christine Franks71e003e2019-01-24 14:40:20 -08001143 R.array.config_availableColorModes);
Christine Franks39b03112018-07-03 14:46:07 -07001144 if (availableColorModes != null) {
1145 for (int availableMode : availableColorModes) {
1146 if (mode == availableMode) {
1147 return true;
1148 }
1149 }
1150 }
1151 return false;
1152 }
1153
1154 /**
Christine Franks0ada2772019-02-25 13:54:57 -08001155 * Convenience method to start {@link #mCds}.
Christine Frankse5bb03e2017-02-10 17:36:10 -08001156 */
1157 private void startService() {
1158 Secure.putIntForUser(mContext.getContentResolver(), Secure.USER_SETUP_COMPLETE, 1, mUserId);
1159
Christine Franks71e003e2019-01-24 14:40:20 -08001160 InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
Christine Franks0ada2772019-02-25 13:54:57 -08001161 mCds.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
1162 mCds.onStartUser(mUserId);
Christine Frankse5bb03e2017-02-10 17:36:10 -08001163 });
1164 }
1165
1166 /**
1167 * Convenience method for asserting whether Night display should be activated.
1168 *
1169 * @param activated the expected activated state of Night display
1170 */
1171 private void assertActivated(boolean activated) {
Christine Franks83cc5412018-07-03 14:46:07 -07001172 assertWithMessage("Incorrect Night display activated state")
1173 .that(mBinderService.isNightDisplayActivated())
Christine Frankse5bb03e2017-02-10 17:36:10 -08001174 .isEqualTo(activated);
1175 }
Justin Klaassen3da4c442017-05-05 15:19:33 -07001176
1177 /**
Daniel Solomon317a3572018-03-30 18:36:37 -07001178 * Convenience method for asserting that the active color mode matches expectation.
1179 *
1180 * @param mode the expected active color mode.
1181 */
1182 private void assertActiveColorMode(int mode) {
1183 assertWithMessage("Unexpected color mode setting")
Christine Franks71e003e2019-01-24 14:40:20 -08001184 .that(mBinderService.getColorMode())
Daniel Solomon317a3572018-03-30 18:36:37 -07001185 .isEqualTo(mode);
1186 }
1187
1188 /**
1189 * Convenience method for asserting that the user chosen color mode matches expectation.
1190 *
1191 * @param mode the expected color mode setting.
1192 */
1193 private void assertUserColorMode(int mode) {
1194 final int actualMode = System.getIntForUser(mContext.getContentResolver(),
1195 System.DISPLAY_COLOR_MODE, -1, mUserId);
1196 assertWithMessage("Unexpected color mode setting")
1197 .that(actualMode)
1198 .isEqualTo(mode);
1199 }
1200
1201 /**
Long Ling1d3f1892019-02-06 12:34:02 -08001202 * Convenience method for asserting that the DWB active status matches expectation.
1203 *
1204 * @param enabled the expected active status.
1205 */
1206 private void assertDwbActive(boolean enabled) {
1207 assertWithMessage("Incorrect Display White Balance state")
Christine Franks0ada2772019-02-25 13:54:57 -08001208 .that(mCds.mDisplayWhiteBalanceTintController.isActivated())
Long Ling1d3f1892019-02-06 12:34:02 -08001209 .isEqualTo(enabled);
1210 }
1211
1212 /**
Justin Klaassen3da4c442017-05-05 15:19:33 -07001213 * Convenience for making a {@link LocalTime} instance with an offset relative to now.
1214 *
1215 * @param offsetMinutes the offset relative to now (in minutes)
1216 * @return the LocalTime instance
1217 */
1218 private static LocalTime getLocalTimeRelativeToNow(int offsetMinutes) {
1219 final Calendar c = Calendar.getInstance();
1220 c.add(Calendar.MINUTE, offsetMinutes);
Christine Franks03213462017-08-25 13:57:26 -07001221 return LocalTime.of(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE));
Justin Klaassen3da4c442017-05-05 15:19:33 -07001222 }
1223
1224 /**
1225 * Convenience for making a {@link TwilightState} instance with sunrise/sunset relative to now.
1226 *
1227 * @param sunsetOffset the offset relative to now for sunset (in minutes)
1228 * @param sunriseOffset the offset relative to now for sunrise (in minutes)
1229 * @return the TwilightState instance
1230 */
1231 private static TwilightState getTwilightStateRelativeToNow(int sunsetOffset,
1232 int sunriseOffset) {
1233 final LocalTime sunset = getLocalTimeRelativeToNow(sunsetOffset);
1234 final LocalTime sunrise = getLocalTimeRelativeToNow(sunriseOffset);
1235
Christine Franks03213462017-08-25 13:57:26 -07001236 final LocalDateTime now = LocalDateTime.now();
1237 final ZoneId zoneId = ZoneId.systemDefault();
1238
Christine Franks5397f032017-11-01 18:35:16 -07001239 long sunsetMillis = ColorDisplayService.getDateTimeBefore(sunset, now)
Christine Franks03213462017-08-25 13:57:26 -07001240 .atZone(zoneId)
1241 .toInstant()
1242 .toEpochMilli();
Christine Franks5397f032017-11-01 18:35:16 -07001243 long sunriseMillis = ColorDisplayService.getDateTimeBefore(sunrise, now)
Christine Franks03213462017-08-25 13:57:26 -07001244 .atZone(zoneId)
1245 .toInstant()
1246 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001247 if (sunsetMillis < sunriseMillis) {
Christine Franks5397f032017-11-01 18:35:16 -07001248 sunsetMillis = ColorDisplayService.getDateTimeAfter(sunset, now)
Christine Franks03213462017-08-25 13:57:26 -07001249 .atZone(zoneId)
1250 .toInstant()
1251 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001252 } else {
Christine Franks5397f032017-11-01 18:35:16 -07001253 sunriseMillis = ColorDisplayService.getDateTimeAfter(sunrise, now)
Christine Franks03213462017-08-25 13:57:26 -07001254 .atZone(zoneId)
1255 .toInstant()
1256 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001257 }
1258
1259 return new TwilightState(sunriseMillis, sunsetMillis);
1260 }
1261
1262 private static class MockTwilightManager implements TwilightManager {
1263
1264 private final Map<TwilightListener, Handler> mListeners = new HashMap<>();
1265 private TwilightState mTwilightState;
1266
1267 /**
1268 * Updates the TwilightState and notifies any registered listeners.
1269 *
1270 * @param state the new TwilightState to use
1271 */
1272 void setTwilightState(TwilightState state) {
1273 synchronized (mListeners) {
1274 mTwilightState = state;
1275
1276 final CountDownLatch latch = new CountDownLatch(mListeners.size());
1277 for (Map.Entry<TwilightListener, Handler> entry : mListeners.entrySet()) {
1278 entry.getValue().post(new Runnable() {
1279 @Override
1280 public void run() {
1281 entry.getKey().onTwilightStateChanged(state);
1282 latch.countDown();
1283 }
1284 });
1285 }
1286
1287 try {
1288 latch.await(5, TimeUnit.SECONDS);
1289 } catch (InterruptedException e) {
1290 throw new RuntimeException(e);
1291 }
1292 }
1293 }
1294
1295 @Override
1296 public void registerListener(@NonNull TwilightListener listener, @NonNull Handler handler) {
1297 synchronized (mListeners) {
1298 mListeners.put(listener, handler);
1299 }
1300 }
1301
1302 @Override
1303 public void unregisterListener(@NonNull TwilightListener listener) {
1304 synchronized (mListeners) {
1305 mListeners.remove(listener);
1306 }
1307 }
1308
1309 @Override
1310 public TwilightState getLastTwilightState() {
1311 return mTwilightState;
1312 }
1313 }
Christine Frankse5bb03e2017-02-10 17:36:10 -08001314}