blob: c004074d241b51d348a60c11652abba5e27fba74 [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
17package com.android.server;
18
Justin Klaassen3da4c442017-05-05 15:19:33 -070019import android.annotation.NonNull;
Christine Frankse5bb03e2017-02-10 17:36:10 -080020import android.app.ActivityManager;
21import android.app.AlarmManager;
22import android.content.Context;
23import android.content.ContextWrapper;
Justin Klaassen3da4c442017-05-05 15:19:33 -070024import android.os.Handler;
Christine Frankse5bb03e2017-02-10 17:36:10 -080025import android.os.UserHandle;
26import android.provider.Settings;
27import android.provider.Settings.Secure;
Daniel Solomon317a3572018-03-30 18:36:37 -070028import android.provider.Settings.System;
Christine Frankse5bb03e2017-02-10 17:36:10 -080029import android.support.test.InstrumentationRegistry;
30import android.support.test.runner.AndroidJUnit4;
31import android.test.mock.MockContentResolver;
32
Christine Franks5397f032017-11-01 18:35:16 -070033import com.android.internal.app.ColorDisplayController;
Christine Frankse5bb03e2017-02-10 17:36:10 -080034import com.android.internal.util.test.FakeSettingsProvider;
35import com.android.server.display.DisplayTransformManager;
Christine Franks5397f032017-11-01 18:35:16 -070036import com.android.server.display.ColorDisplayService;
Justin Klaassen3da4c442017-05-05 15:19:33 -070037import com.android.server.twilight.TwilightListener;
Christine Frankse5bb03e2017-02-10 17:36:10 -080038import com.android.server.twilight.TwilightManager;
39import com.android.server.twilight.TwilightState;
Christine Franks03213462017-08-25 13:57:26 -070040import java.time.LocalDateTime;
41import java.time.ZoneId;
Christine Frankse5bb03e2017-02-10 17:36:10 -080042import org.junit.After;
43import org.junit.Before;
44import org.junit.Test;
45import org.junit.runner.RunWith;
46import org.mockito.Mockito;
47
48import java.util.Calendar;
Justin Klaassen3da4c442017-05-05 15:19:33 -070049import java.util.HashMap;
Christine Franks03213462017-08-25 13:57:26 -070050import java.time.LocalTime;
Justin Klaassen3da4c442017-05-05 15:19:33 -070051import java.util.Map;
52import java.util.concurrent.CountDownLatch;
53import java.util.concurrent.TimeUnit;
Christine Frankse5bb03e2017-02-10 17:36:10 -080054
55import static com.google.common.truth.Truth.assertWithMessage;
56import static org.mockito.Mockito.doReturn;
57
58@RunWith(AndroidJUnit4.class)
Christine Franks5397f032017-11-01 18:35:16 -070059public class ColorDisplayServiceTest {
Christine Frankse5bb03e2017-02-10 17:36:10 -080060
61 private Context mContext;
62 private int mUserId;
63
Justin Klaassen3da4c442017-05-05 15:19:33 -070064 private MockTwilightManager mTwilightManager;
Christine Frankse5bb03e2017-02-10 17:36:10 -080065
Christine Franks5397f032017-11-01 18:35:16 -070066 private ColorDisplayController mColorDisplayController;
67 private ColorDisplayService mColorDisplayService;
Christine Frankse5bb03e2017-02-10 17:36:10 -080068
69 @Before
70 public void setUp() {
71 mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
72 mUserId = ActivityManager.getCurrentUser();
73
74 doReturn(mContext).when(mContext).getApplicationContext();
75
76 final MockContentResolver cr = new MockContentResolver(mContext);
77 cr.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
78 doReturn(cr).when(mContext).getContentResolver();
79
80 final AlarmManager am = Mockito.mock(AlarmManager.class);
81 doReturn(am).when(mContext).getSystemService(Context.ALARM_SERVICE);
82
83 final DisplayTransformManager dtm = Mockito.mock(DisplayTransformManager.class);
84 LocalServices.addService(DisplayTransformManager.class, dtm);
85
Justin Klaassen3da4c442017-05-05 15:19:33 -070086 mTwilightManager = new MockTwilightManager();
Christine Frankse5bb03e2017-02-10 17:36:10 -080087 LocalServices.addService(TwilightManager.class, mTwilightManager);
88
Christine Franks5397f032017-11-01 18:35:16 -070089 mColorDisplayController = new ColorDisplayController(mContext, mUserId);
90 mColorDisplayService = new ColorDisplayService(mContext);
Christine Frankse5bb03e2017-02-10 17:36:10 -080091 }
92
93 @After
94 public void tearDown() {
95 LocalServices.removeServiceForTest(DisplayTransformManager.class);
96 LocalServices.removeServiceForTest(TwilightManager.class);
97
Christine Franks5397f032017-11-01 18:35:16 -070098 mColorDisplayService = null;
99 mColorDisplayController = null;
Christine Frankse5bb03e2017-02-10 17:36:10 -0800100
101 mTwilightManager = null;
102
103 mUserId = UserHandle.USER_NULL;
104 mContext = null;
105 }
106
107 @Test
108 public void customSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
109 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
110 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
111
112 startService();
113 assertActivated(false /* activated */);
114 }
115
116 @Test
117 public void customSchedule_whenStartedAfterNight_ifOffBeforeNight_turnsOff() {
118 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
119 setActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
120
121 startService();
122 assertActivated(false /* activated */);
123 }
124
125 @Test
126 public void customSchedule_whenStartedAfterNight_ifOffDuringNight_turnsOff() {
127 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
128 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
129
130 startService();
131 assertActivated(false /* activated */);
132 }
133
134 @Test
135 public void customSchedule_whenStartedAfterNight_ifOffInFuture_turnsOff() {
136 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
137 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
138
139 startService();
140 assertActivated(false /* activated */);
141 }
142
143 @Test
144 public void customSchedule_whenStartedAfterNight_ifOnAfterNight_turnsOn() {
145 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
146 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
147
148 startService();
149 assertActivated(true /* activated */);
150 }
151
152 @Test
153 public void customSchedule_whenStartedAfterNight_ifOnBeforeNight_turnsOff() {
154 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
155 setActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
156
157 startService();
158 assertActivated(false /* activated */);
159 }
160
161 @Test
162 public void customSchedule_whenStartedAfterNight_ifOnDuringNight_turnsOff() {
163 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
164 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
165
166 startService();
167 assertActivated(false /* activated */);
168 }
169
170 @Test
171 public void customSchedule_whenStartedAfterNight_ifOnInFuture_turnsOff() {
172 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
173 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
174
175 startService();
176 assertActivated(false /* activated */);
177 }
178
179 @Test
180 public void customSchedule_whenStartedBeforeNight_ifOffAfterNight_turnsOff() {
181 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
182 setActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
183
184 startService();
185 assertActivated(false /* activated */);
186 }
187
188 @Test
189 public void customSchedule_whenStartedBeforeNight_ifOffBeforeNight_turnsOff() {
190 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
191 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
192
193 startService();
194 assertActivated(false /* activated */);
195 }
196
197 @Test
198 public void customSchedule_whenStartedBeforeNight_ifOffDuringNight_turnsOff() {
199 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
200 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
201
202 startService();
203 assertActivated(false /* activated */);
204 }
205
206 @Test
207 public void customSchedule_whenStartedBeforeNight_ifOffInPast_turnsOff() {
208 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
209 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
210
211 startService();
212 assertActivated(false /* activated */);
213 }
214
215 @Test
216 public void customSchedule_whenStartedBeforeNight_ifOnAfterNight_turnsOff() {
217 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
218 setActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
219
220 startService();
221 assertActivated(false /* activated */);
222 }
223
224 @Test
225 public void customSchedule_whenStartedBeforeNight_ifOnBeforeNight_turnsOff() {
226 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
227 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
228
229 startService();
230 assertActivated(false /* activated */);
231 }
232
233 @Test
234 public void customSchedule_whenStartedBeforeNight_ifOnDuringNight_turnsOff() {
235 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
236 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
237
238 startService();
239 assertActivated(false /* activated */);
240 }
241
242 @Test
243 public void customSchedule_whenStartedBeforeNight_ifOnInPast_turnsOn() {
244 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
245 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
246
247 startService();
248 assertActivated(true /* activated */);
249 }
250
251 @Test
252 public void customSchedule_whenStartedDuringNight_ifOffAfterNight_turnsOn() {
253 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
254 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
255
256 startService();
257 assertActivated(true /* activated */);
258 }
259
260 @Test
261 public void customSchedule_whenStartedDuringNight_ifOffBeforeNight_turnsOn() {
262 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
263 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
264
265 startService();
266 assertActivated(true /* activated */);
267 }
268
269 @Test
270 public void customSchedule_whenStartedDuringNight_ifOffDuringNightInFuture_turnsOn() {
271 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
272 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
273
274 startService();
275 assertActivated(true /* activated */);
276 }
277
278 @Test
279 public void customSchedule_whenStartedDuringNight_ifOffDuringNightInPast_turnsOff() {
280 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
281 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
282
283 startService();
284 assertActivated(false /* activated */);
285 }
286
287 @Test
288 public void customSchedule_whenStartedDuringNight_ifOnAfterNight_turnsOn() {
289 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
290 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
291
292 startService();
293 assertActivated(true /* activated */);
294 }
295
296 @Test
297 public void customSchedule_whenStartedDuringNight_ifOnBeforeNight_turnsOn() {
298 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
299 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
300
301 startService();
302 assertActivated(true /* activated */);
303 }
304
305 @Test
306 public void customSchedule_whenStartedDuringNight_ifOnDuringNightInFuture_turnsOn() {
307 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
308 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
309
310 startService();
311 assertActivated(true /* activated */);
312 }
313
314 @Test
315 public void customSchedule_whenStartedDuringNight_ifOnDuringNightInPast_turnsOn() {
316 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
317 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
318
319 startService();
320 assertActivated(true /* activated */);
321 }
322
323 @Test
324 public void twilightSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
325 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
326 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
327
328 startService();
329 assertActivated(false /* activated */);
330 }
331
332 @Test
333 public void twilightSchedule_whenStartedAfterNight_ifOffBeforeNight_turnsOff() {
334 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
335 setActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
336
337 startService();
338 assertActivated(false /* activated */);
339 }
340
341 @Test
342 public void twilightSchedule_whenStartedAfterNight_ifOffDuringNight_turnsOff() {
343 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
344 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
345
346 startService();
347 assertActivated(false /* activated */);
348 }
349
350 @Test
351 public void twilightSchedule_whenStartedAfterNight_ifOffInFuture_turnsOff() {
352 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
353 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
354
355 startService();
356 assertActivated(false /* activated */);
357 }
358
359 @Test
360 public void twilightSchedule_whenStartedAfterNight_ifOnAfterNight_turnsOn() {
361 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
362 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
363
364 startService();
365 assertActivated(true /* activated */);
366 }
367
368 @Test
369 public void twilightSchedule_whenStartedAfterNight_ifOnBeforeNight_turnsOff() {
370 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
371 setActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
372
373 startService();
374 assertActivated(false /* activated */);
375 }
376
377 @Test
378 public void twilightSchedule_whenStartedAfterNight_ifOnDuringNight_turnsOff() {
379 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
380 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
381
382 startService();
383 assertActivated(false /* activated */);
384 }
385
386 @Test
387 public void twilightSchedule_whenStartedAfterNight_ifOnInFuture_turnsOff() {
388 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
389 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
390
391 startService();
392 assertActivated(false /* activated */);
393 }
394
395 @Test
396 public void twilightSchedule_whenStartedBeforeNight_ifOffAfterNight_turnsOff() {
397 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
398 setActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
399
400 startService();
401 assertActivated(false /* activated */);
402 }
403
404 @Test
405 public void twilightSchedule_whenStartedBeforeNight_ifOffBeforeNight_turnsOff() {
406 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
407 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
408
409 startService();
410 assertActivated(false /* activated */);
411 }
412
413 @Test
414 public void twilightSchedule_whenStartedBeforeNight_ifOffDuringNight_turnsOff() {
415 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
416 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
417
418 startService();
419 assertActivated(false /* activated */);
420 }
421
422 @Test
423 public void twilightSchedule_whenStartedBeforeNight_ifOffInPast_turnsOff() {
424 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
425 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
426
427 startService();
428 assertActivated(false /* activated */);
429 }
430
431 @Test
432 public void twilightSchedule_whenStartedBeforeNight_ifOnAfterNight_turnsOff() {
433 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
434 setActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
435
436 startService();
437 assertActivated(false /* activated */);
438 }
439
440 @Test
441 public void twilightSchedule_whenStartedBeforeNight_ifOnBeforeNight_turnsOff() {
442 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
443 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
444
445 startService();
446 assertActivated(false /* activated */);
447 }
448
449 @Test
450 public void twilightSchedule_whenStartedBeforeNight_ifOnDuringNight_turnsOff() {
451 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
452 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
453
454 startService();
455 assertActivated(false /* activated */);
456 }
457
458 @Test
459 public void twilightSchedule_whenStartedBeforeNight_ifOnInPast_turnsOn() {
460 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
461 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
462
463 startService();
464 assertActivated(true /* activated */);
465 }
466
467 @Test
468 public void twilightSchedule_whenStartedDuringNight_ifOffAfterNight_turnsOn() {
469 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
470 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
471
472 startService();
473 assertActivated(true /* activated */);
474 }
475
476 @Test
477 public void twilightSchedule_whenStartedDuringNight_ifOffBeforeNight_turnsOn() {
478 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
479 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
480
481 startService();
482 assertActivated(true /* activated */);
483 }
484
485 @Test
486 public void twilightSchedule_whenStartedDuringNight_ifOffDuringNightInFuture_turnsOn() {
487 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
488 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
489
490 startService();
491 assertActivated(true /* activated */);
492 }
493
494 @Test
495 public void twilightSchedule_whenStartedDuringNight_ifOffDuringNightInPast_turnsOff() {
496 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
497 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
498
499 startService();
500 assertActivated(false /* activated */);
501 }
502
503 @Test
504 public void twilightSchedule_whenStartedDuringNight_ifOnAfterNight_turnsOn() {
505 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
506 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
507
508 startService();
509 assertActivated(true /* activated */);
510 }
511
512 @Test
513 public void twilightSchedule_whenStartedDuringNight_ifOnBeforeNight_turnsOn() {
514 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
515 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
516
517 startService();
518 assertActivated(true /* activated */);
519 }
520
521 @Test
522 public void twilightSchedule_whenStartedDuringNight_ifOnDuringNightInFuture_turnsOn() {
523 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
524 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
525
526 startService();
527 assertActivated(true /* activated */);
528 }
529
530 @Test
531 public void twilightSchedule_whenStartedDuringNight_ifOnDuringNightInPast_turnsOn() {
532 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
533 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
534
535 startService();
536 assertActivated(true /* activated */);
537 }
538
Justin Klaassen3da4c442017-05-05 15:19:33 -0700539 @Test
540 public void twilightSchedule_whenRebootedAfterNight_ifOffAfterNight_turnsOff() {
541 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
542 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
543
544 final TwilightState state = mTwilightManager.getLastTwilightState();
545 mTwilightManager.setTwilightState(null);
546
547 startService();
548 assertActivated(false /* activated */);
549
550 mTwilightManager.setTwilightState(state);
551 assertActivated(false /* activated */);
552 }
553
554 @Test
555 public void twilightSchedule_whenRebootedAfterNight_ifOffBeforeNight_turnsOff() {
556 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
557 setActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
558
559 final TwilightState state = mTwilightManager.getLastTwilightState();
560 mTwilightManager.setTwilightState(null);
561
562 startService();
563 assertActivated(false /* activated */);
564
565 mTwilightManager.setTwilightState(state);
566 assertActivated(false /* activated */);
567 }
568
569 @Test
570 public void twilightSchedule_whenRebootedAfterNight_ifOffDuringNight_turnsOff() {
571 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
572 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
573
574 final TwilightState state = mTwilightManager.getLastTwilightState();
575 mTwilightManager.setTwilightState(null);
576
577 startService();
578 assertActivated(false /* activated */);
579
580 mTwilightManager.setTwilightState(state);
581 assertActivated(false /* activated */);
582 }
583
584 @Test
585 public void twilightSchedule_whenRebootedAfterNight_ifOffInFuture_turnsOff() {
586 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
587 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
588
589 final TwilightState state = mTwilightManager.getLastTwilightState();
590 mTwilightManager.setTwilightState(null);
591
592 startService();
593 assertActivated(false /* activated */);
594
595 mTwilightManager.setTwilightState(state);
596 assertActivated(false /* activated */);
597 }
598
599 @Test
600 public void twilightSchedule_whenRebootedAfterNight_ifOnAfterNight_turnsOn() {
601 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
602 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
603
604 final TwilightState state = mTwilightManager.getLastTwilightState();
605 mTwilightManager.setTwilightState(null);
606
607 startService();
608 assertActivated(true /* activated */);
609
610 mTwilightManager.setTwilightState(state);
611 assertActivated(true /* activated */);
612 }
613
614 @Test
615 public void twilightSchedule_whenRebootedAfterNight_ifOnBeforeNight_turnsOff() {
616 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
617 setActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
618
619 final TwilightState state = mTwilightManager.getLastTwilightState();
620 mTwilightManager.setTwilightState(null);
621
622 startService();
623 assertActivated(true /* activated */);
624
625 mTwilightManager.setTwilightState(state);
626 assertActivated(false /* activated */);
627 }
628
629 @Test
630 public void twilightSchedule_whenRebootedAfterNight_ifOnDuringNight_turnsOff() {
631 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
632 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
633
634 final TwilightState state = mTwilightManager.getLastTwilightState();
635 mTwilightManager.setTwilightState(null);
636
637 startService();
638 assertActivated(true /* activated */);
639
640 mTwilightManager.setTwilightState(state);
641 assertActivated(false /* activated */);
642 }
643
644 @Test
645 public void twilightSchedule_whenRebootedAfterNight_ifOnInFuture_turnsOff() {
646 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
647 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
648
649 final TwilightState state = mTwilightManager.getLastTwilightState();
650 mTwilightManager.setTwilightState(null);
651
652 startService();
653 assertActivated(true /* activated */);
654
655 mTwilightManager.setTwilightState(state);
656 assertActivated(false /* activated */);
657 }
658
659 @Test
660 public void twilightSchedule_whenRebootedBeforeNight_ifOffAfterNight_turnsOff() {
661 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
662 setActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
663
664 final TwilightState state = mTwilightManager.getLastTwilightState();
665 mTwilightManager.setTwilightState(null);
666
667 startService();
668 assertActivated(false /* activated */);
669
670 mTwilightManager.setTwilightState(state);
671 assertActivated(false /* activated */);
672 }
673
674 @Test
675 public void twilightSchedule_whenRebootedBeforeNight_ifOffBeforeNight_turnsOff() {
676 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
677 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
678
679 final TwilightState state = mTwilightManager.getLastTwilightState();
680 mTwilightManager.setTwilightState(null);
681
682 startService();
683 assertActivated(false /* activated */);
684
685 mTwilightManager.setTwilightState(state);
686 assertActivated(false /* activated */);
687 }
688
689 @Test
690 public void twilightSchedule_whenRebootedBeforeNight_ifOffDuringNight_turnsOff() {
691 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
692 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
693
694 final TwilightState state = mTwilightManager.getLastTwilightState();
695 mTwilightManager.setTwilightState(null);
696
697 startService();
698 assertActivated(false /* activated */);
699
700 mTwilightManager.setTwilightState(state);
701 assertActivated(false /* activated */);
702 }
703
704 @Test
705 public void twilightSchedule_whenRebootedBeforeNight_ifOffInPast_turnsOff() {
706 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
707 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
708
709 final TwilightState state = mTwilightManager.getLastTwilightState();
710 mTwilightManager.setTwilightState(null);
711
712 startService();
713 assertActivated(false /* activated */);
714
715 mTwilightManager.setTwilightState(state);
716 assertActivated(false /* activated */);
717 }
718
719 @Test
720 public void twilightSchedule_whenRebootedBeforeNight_ifOnAfterNight_turnsOff() {
721 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
722 setActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
723
724 final TwilightState state = mTwilightManager.getLastTwilightState();
725 mTwilightManager.setTwilightState(null);
726
727 startService();
728 assertActivated(true /* activated */);
729
730 mTwilightManager.setTwilightState(state);
731 assertActivated(false /* activated */);
732 }
733
734 @Test
735 public void twilightSchedule_whenRebootedBeforeNight_ifOnBeforeNight_turnsOff() {
736 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
737 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
738
739 final TwilightState state = mTwilightManager.getLastTwilightState();
740 mTwilightManager.setTwilightState(null);
741
742 startService();
743 assertActivated(true /* activated */);
744
745 mTwilightManager.setTwilightState(state);
746 assertActivated(false /* activated */);
747 }
748
749 @Test
750 public void twilightSchedule_whenRebootedBeforeNight_ifOnDuringNight_turnsOff() {
751 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
752 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
753
754 final TwilightState state = mTwilightManager.getLastTwilightState();
755 mTwilightManager.setTwilightState(null);
756
757 startService();
758 assertActivated(true /* activated */);
759
760 mTwilightManager.setTwilightState(state);
761 assertActivated(false /* activated */);
762 }
763
764 @Test
765 public void twilightSchedule_whenRebootedBeforeNight_ifOnInPast_turnsOn() {
766 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
767 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
768
769 final TwilightState state = mTwilightManager.getLastTwilightState();
770 mTwilightManager.setTwilightState(null);
771
772 startService();
773 assertActivated(true /* activated */);
774
775 mTwilightManager.setTwilightState(state);
776 assertActivated(true /* activated */);
777 }
778
779 @Test
780 public void twilightSchedule_whenRebootedDuringNight_ifOffAfterNight_turnsOn() {
781 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
782 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
783
784 final TwilightState state = mTwilightManager.getLastTwilightState();
785 mTwilightManager.setTwilightState(null);
786
787 startService();
788 assertActivated(false /* activated */);
789
790 mTwilightManager.setTwilightState(state);
791 assertActivated(true /* activated */);
792 }
793
794 @Test
795 public void twilightSchedule_whenRebootedDuringNight_ifOffBeforeNight_turnsOn() {
796 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
797 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
798
799 final TwilightState state = mTwilightManager.getLastTwilightState();
800 mTwilightManager.setTwilightState(null);
801
802 startService();
803 assertActivated(false /* activated */);
804
805 mTwilightManager.setTwilightState(state);
806 assertActivated(true /* activated */);
807 }
808
809 @Test
810 public void twilightSchedule_whenRebootedDuringNight_ifOffDuringNightInFuture_turnsOn() {
811 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
812 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
813
814 final TwilightState state = mTwilightManager.getLastTwilightState();
815 mTwilightManager.setTwilightState(null);
816
817 startService();
818 assertActivated(false /* activated */);
819
820 mTwilightManager.setTwilightState(state);
821 assertActivated(true /* activated */);
822 }
823
824 @Test
825 public void twilightSchedule_whenRebootedDuringNight_ifOffDuringNightInPast_turnsOff() {
826 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
827 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
828
829 final TwilightState state = mTwilightManager.getLastTwilightState();
830 mTwilightManager.setTwilightState(null);
831
832 startService();
833 assertActivated(false /* activated */);
834
835 mTwilightManager.setTwilightState(state);
836 assertActivated(false /* activated */);
837 }
838
839 @Test
840 public void twilightSchedule_whenRebootedDuringNight_ifOnAfterNight_turnsOn() {
841 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
842 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
843
844 final TwilightState state = mTwilightManager.getLastTwilightState();
845 mTwilightManager.setTwilightState(null);
846
847 startService();
848 assertActivated(true /* activated */);
849
850 mTwilightManager.setTwilightState(state);
851 assertActivated(true /* activated */);
852 }
853
854 @Test
855 public void twilightSchedule_whenRebootedDuringNight_ifOnBeforeNight_turnsOn() {
856 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
857 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
858
859 final TwilightState state = mTwilightManager.getLastTwilightState();
860 mTwilightManager.setTwilightState(null);
861
862 startService();
863 assertActivated(true /* activated */);
864
865 mTwilightManager.setTwilightState(state);
866 assertActivated(true /* activated */);
867 }
868
869 @Test
870 public void twilightSchedule_whenRebootedDuringNight_ifOnDuringNightInFuture_turnsOn() {
871 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
872 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
873
874 final TwilightState state = mTwilightManager.getLastTwilightState();
875 mTwilightManager.setTwilightState(null);
876
877 startService();
878 assertActivated(true /* activated */);
879
880 mTwilightManager.setTwilightState(state);
881 assertActivated(true /* activated */);
882 }
883
884 @Test
885 public void twilightSchedule_whenRebootedDuringNight_ifOnDuringNightInPast_turnsOn() {
886 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
887 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
888
889 final TwilightState state = mTwilightManager.getLastTwilightState();
890 mTwilightManager.setTwilightState(null);
891
892 startService();
893 assertActivated(true /* activated */);
894
895 mTwilightManager.setTwilightState(state);
896 assertActivated(true /* activated */);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800897 }
898
Daniel Solomon317a3572018-03-30 18:36:37 -0700899 @Test
900 public void accessibility_colorInversion_transformActivated() {
Chia-I Wu1e0e7172018-03-14 15:45:29 -0700901 if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) {
902 return;
903 }
904
Daniel Solomon317a3572018-03-30 18:36:37 -0700905 setAccessibilityColorInversion(true);
906 setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
907
908 startService();
909 assertAccessibilityTransformActivated(true /* activated */ );
910 assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
911 assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
912 }
913
914 @Test
915 public void accessibility_colorCorrection_transformActivated() {
Chia-I Wu1e0e7172018-03-14 15:45:29 -0700916 if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) {
917 return;
918 }
919
Daniel Solomon317a3572018-03-30 18:36:37 -0700920 setAccessibilityColorCorrection(true);
921 setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
922
923 startService();
924 assertAccessibilityTransformActivated(true /* activated */ );
925 assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
926 assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
927 }
928
929 @Test
930 public void accessibility_all_transformActivated() {
Chia-I Wu1e0e7172018-03-14 15:45:29 -0700931 if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) {
932 return;
933 }
934
Daniel Solomon317a3572018-03-30 18:36:37 -0700935 setAccessibilityColorCorrection(true);
936 setAccessibilityColorInversion(true);
937 setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
938
939 startService();
940 assertAccessibilityTransformActivated(true /* activated */ );
941 assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
942 assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
943 }
944
945 @Test
946 public void accessibility_none_transformActivated() {
Chia-I Wu1e0e7172018-03-14 15:45:29 -0700947 if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) {
948 return;
949 }
950
Daniel Solomon317a3572018-03-30 18:36:37 -0700951 setAccessibilityColorCorrection(false);
952 setAccessibilityColorInversion(false);
953 setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
954
955 startService();
956 assertAccessibilityTransformActivated(false /* activated */ );
957 assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
958 assertActiveColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
959 }
960
Christine Frankse5bb03e2017-02-10 17:36:10 -0800961 /**
962 * Configures Night display to use a custom schedule.
963 *
964 * @param startTimeOffset the offset relative to now to activate Night display (in minutes)
Justin Klaassen3da4c442017-05-05 15:19:33 -0700965 * @param endTimeOffset the offset relative to now to deactivate Night display (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -0800966 */
967 private void setAutoModeCustom(int startTimeOffset, int endTimeOffset) {
Christine Franks5397f032017-11-01 18:35:16 -0700968 mColorDisplayController.setAutoMode(ColorDisplayController.AUTO_MODE_CUSTOM);
969 mColorDisplayController.setCustomStartTime(getLocalTimeRelativeToNow(startTimeOffset));
970 mColorDisplayController.setCustomEndTime(getLocalTimeRelativeToNow(endTimeOffset));
Christine Frankse5bb03e2017-02-10 17:36:10 -0800971 }
972
973 /**
974 * Configures Night display to use the twilight schedule.
975 *
Justin Klaassen3da4c442017-05-05 15:19:33 -0700976 * @param sunsetOffset the offset relative to now for sunset (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -0800977 * @param sunriseOffset the offset relative to now for sunrise (in minutes)
978 */
979 private void setAutoModeTwilight(int sunsetOffset, int sunriseOffset) {
Christine Franks5397f032017-11-01 18:35:16 -0700980 mColorDisplayController.setAutoMode(ColorDisplayController.AUTO_MODE_TWILIGHT);
Justin Klaassen3da4c442017-05-05 15:19:33 -0700981 mTwilightManager.setTwilightState(
982 getTwilightStateRelativeToNow(sunsetOffset, sunriseOffset));
Christine Frankse5bb03e2017-02-10 17:36:10 -0800983 }
984
985 /**
986 * Configures the Night display activated state.
987 *
Justin Klaassen3da4c442017-05-05 15:19:33 -0700988 * @param activated {@code true} if Night display should be activated
Christine Frankse5bb03e2017-02-10 17:36:10 -0800989 * @param lastActivatedTimeOffset the offset relative to now to record that Night display was
Justin Klaassen3da4c442017-05-05 15:19:33 -0700990 * activated (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -0800991 */
992 private void setActivated(boolean activated, int lastActivatedTimeOffset) {
Christine Franks5397f032017-11-01 18:35:16 -0700993 mColorDisplayController.setActivated(activated);
Christine Franks03213462017-08-25 13:57:26 -0700994 Secure.putStringForUser(mContext.getContentResolver(),
995 Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME,
996 LocalDateTime.now().plusMinutes(lastActivatedTimeOffset).toString(),
997 mUserId);
Christine Frankse5bb03e2017-02-10 17:36:10 -0800998 }
999
1000 /**
Daniel Solomon317a3572018-03-30 18:36:37 -07001001 * Configures the Accessibility color correction setting state.
1002 *
1003 * @param state {@code true} if color inversion should be activated
1004 */
1005 private void setAccessibilityColorCorrection(boolean state) {
1006 Secure.putIntForUser(mContext.getContentResolver(),
1007 Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, state ? 1 : 0, mUserId);
1008 }
1009
1010 /**
1011 * Configures the Accessibility color inversion setting state.
1012 *
1013 * @param state {@code true} if color inversion should be activated
1014 */
1015 private void setAccessibilityColorInversion(boolean state) {
1016 Secure.putIntForUser(mContext.getContentResolver(),
1017 Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, state ? 1 : 0, mUserId);
1018 }
1019
1020 /**
1021 * Configures color mode via ColorDisplayController.
1022 *
1023 * @param mode the color mode to set
1024 */
1025 private void setColorMode(int mode) {
1026 mColorDisplayController.setColorMode(mode);
1027 }
1028
1029 /**
Christine Franks5397f032017-11-01 18:35:16 -07001030 * Convenience method to start {@link #mColorDisplayService}.
Christine Frankse5bb03e2017-02-10 17:36:10 -08001031 */
1032 private void startService() {
1033 Secure.putIntForUser(mContext.getContentResolver(), Secure.USER_SETUP_COMPLETE, 1, mUserId);
1034
1035 InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
1036 @Override
1037 public void run() {
Christine Franks5397f032017-11-01 18:35:16 -07001038 mColorDisplayService.onStart();
1039 mColorDisplayService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
1040 mColorDisplayService.onStartUser(mUserId);
Christine Frankse5bb03e2017-02-10 17:36:10 -08001041 }
1042 });
1043 }
1044
1045 /**
1046 * Convenience method for asserting whether Night display should be activated.
1047 *
1048 * @param activated the expected activated state of Night display
1049 */
1050 private void assertActivated(boolean activated) {
1051 assertWithMessage("Invalid Night display activated state")
Christine Franks5397f032017-11-01 18:35:16 -07001052 .that(mColorDisplayController.isActivated())
Christine Frankse5bb03e2017-02-10 17:36:10 -08001053 .isEqualTo(activated);
1054 }
Justin Klaassen3da4c442017-05-05 15:19:33 -07001055
1056 /**
Daniel Solomon317a3572018-03-30 18:36:37 -07001057 * Convenience method for asserting that Accessibility color transform is detected.
1058 *
1059 * @param state {@code true} if any Accessibility transform should be activated
1060 */
1061 private void assertAccessibilityTransformActivated(boolean state) {
1062 assertWithMessage("Unexpected Accessibility color transform state")
1063 .that(mColorDisplayController.getAccessibilityTransformActivated())
1064 .isEqualTo(state);
1065 }
1066
1067 /**
1068 * Convenience method for asserting that the active color mode matches expectation.
1069 *
1070 * @param mode the expected active color mode.
1071 */
1072 private void assertActiveColorMode(int mode) {
1073 assertWithMessage("Unexpected color mode setting")
1074 .that(mColorDisplayController.getColorMode())
1075 .isEqualTo(mode);
1076 }
1077
1078 /**
1079 * Convenience method for asserting that the user chosen color mode matches expectation.
1080 *
1081 * @param mode the expected color mode setting.
1082 */
1083 private void assertUserColorMode(int mode) {
1084 final int actualMode = System.getIntForUser(mContext.getContentResolver(),
1085 System.DISPLAY_COLOR_MODE, -1, mUserId);
1086 assertWithMessage("Unexpected color mode setting")
1087 .that(actualMode)
1088 .isEqualTo(mode);
1089 }
1090
1091 /**
Justin Klaassen3da4c442017-05-05 15:19:33 -07001092 * Convenience for making a {@link LocalTime} instance with an offset relative to now.
1093 *
1094 * @param offsetMinutes the offset relative to now (in minutes)
1095 * @return the LocalTime instance
1096 */
1097 private static LocalTime getLocalTimeRelativeToNow(int offsetMinutes) {
1098 final Calendar c = Calendar.getInstance();
1099 c.add(Calendar.MINUTE, offsetMinutes);
Christine Franks03213462017-08-25 13:57:26 -07001100 return LocalTime.of(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE));
Justin Klaassen3da4c442017-05-05 15:19:33 -07001101 }
1102
1103 /**
1104 * Convenience for making a {@link TwilightState} instance with sunrise/sunset relative to now.
1105 *
1106 * @param sunsetOffset the offset relative to now for sunset (in minutes)
1107 * @param sunriseOffset the offset relative to now for sunrise (in minutes)
1108 * @return the TwilightState instance
1109 */
1110 private static TwilightState getTwilightStateRelativeToNow(int sunsetOffset,
1111 int sunriseOffset) {
1112 final LocalTime sunset = getLocalTimeRelativeToNow(sunsetOffset);
1113 final LocalTime sunrise = getLocalTimeRelativeToNow(sunriseOffset);
1114
Christine Franks03213462017-08-25 13:57:26 -07001115 final LocalDateTime now = LocalDateTime.now();
1116 final ZoneId zoneId = ZoneId.systemDefault();
1117
Christine Franks5397f032017-11-01 18:35:16 -07001118 long sunsetMillis = ColorDisplayService.getDateTimeBefore(sunset, now)
Christine Franks03213462017-08-25 13:57:26 -07001119 .atZone(zoneId)
1120 .toInstant()
1121 .toEpochMilli();
Christine Franks5397f032017-11-01 18:35:16 -07001122 long sunriseMillis = ColorDisplayService.getDateTimeBefore(sunrise, now)
Christine Franks03213462017-08-25 13:57:26 -07001123 .atZone(zoneId)
1124 .toInstant()
1125 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001126 if (sunsetMillis < sunriseMillis) {
Christine Franks5397f032017-11-01 18:35:16 -07001127 sunsetMillis = ColorDisplayService.getDateTimeAfter(sunset, now)
Christine Franks03213462017-08-25 13:57:26 -07001128 .atZone(zoneId)
1129 .toInstant()
1130 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001131 } else {
Christine Franks5397f032017-11-01 18:35:16 -07001132 sunriseMillis = ColorDisplayService.getDateTimeAfter(sunrise, now)
Christine Franks03213462017-08-25 13:57:26 -07001133 .atZone(zoneId)
1134 .toInstant()
1135 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001136 }
1137
1138 return new TwilightState(sunriseMillis, sunsetMillis);
1139 }
1140
1141 private static class MockTwilightManager implements TwilightManager {
1142
1143 private final Map<TwilightListener, Handler> mListeners = new HashMap<>();
1144 private TwilightState mTwilightState;
1145
1146 /**
1147 * Updates the TwilightState and notifies any registered listeners.
1148 *
1149 * @param state the new TwilightState to use
1150 */
1151 void setTwilightState(TwilightState state) {
1152 synchronized (mListeners) {
1153 mTwilightState = state;
1154
1155 final CountDownLatch latch = new CountDownLatch(mListeners.size());
1156 for (Map.Entry<TwilightListener, Handler> entry : mListeners.entrySet()) {
1157 entry.getValue().post(new Runnable() {
1158 @Override
1159 public void run() {
1160 entry.getKey().onTwilightStateChanged(state);
1161 latch.countDown();
1162 }
1163 });
1164 }
1165
1166 try {
1167 latch.await(5, TimeUnit.SECONDS);
1168 } catch (InterruptedException e) {
1169 throw new RuntimeException(e);
1170 }
1171 }
1172 }
1173
1174 @Override
1175 public void registerListener(@NonNull TwilightListener listener, @NonNull Handler handler) {
1176 synchronized (mListeners) {
1177 mListeners.put(listener, handler);
1178 }
1179 }
1180
1181 @Override
1182 public void unregisterListener(@NonNull TwilightListener listener) {
1183 synchronized (mListeners) {
1184 mListeners.remove(listener);
1185 }
1186 }
1187
1188 @Override
1189 public TwilightState getLastTwilightState() {
1190 return mTwilightState;
1191 }
1192 }
Christine Frankse5bb03e2017-02-10 17:36:10 -08001193}