blob: 2f427b0e26f997974bda8f7c7fb83881507f42a4 [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 */);
127 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
128
129 startService();
130 assertActivated(false /* activated */);
131 }
132
133 @Test
134 public void customSchedule_whenStartedAfterNight_ifOffBeforeNight_turnsOff() {
135 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
136 setActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
137
138 startService();
139 assertActivated(false /* activated */);
140 }
141
142 @Test
143 public void customSchedule_whenStartedAfterNight_ifOffDuringNight_turnsOff() {
144 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
145 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
146
147 startService();
148 assertActivated(false /* activated */);
149 }
150
151 @Test
152 public void customSchedule_whenStartedAfterNight_ifOffInFuture_turnsOff() {
153 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
154 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
155
156 startService();
157 assertActivated(false /* activated */);
158 }
159
160 @Test
161 public void customSchedule_whenStartedAfterNight_ifOnAfterNight_turnsOn() {
162 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
163 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
164
165 startService();
166 assertActivated(true /* activated */);
167 }
168
169 @Test
170 public void customSchedule_whenStartedAfterNight_ifOnBeforeNight_turnsOff() {
171 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
172 setActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
173
174 startService();
175 assertActivated(false /* activated */);
176 }
177
178 @Test
179 public void customSchedule_whenStartedAfterNight_ifOnDuringNight_turnsOff() {
180 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
181 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
182
183 startService();
184 assertActivated(false /* activated */);
185 }
186
187 @Test
188 public void customSchedule_whenStartedAfterNight_ifOnInFuture_turnsOff() {
189 setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
190 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
191
192 startService();
193 assertActivated(false /* activated */);
194 }
195
196 @Test
197 public void customSchedule_whenStartedBeforeNight_ifOffAfterNight_turnsOff() {
198 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
199 setActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
200
201 startService();
202 assertActivated(false /* activated */);
203 }
204
205 @Test
206 public void customSchedule_whenStartedBeforeNight_ifOffBeforeNight_turnsOff() {
207 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
208 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
209
210 startService();
211 assertActivated(false /* activated */);
212 }
213
214 @Test
215 public void customSchedule_whenStartedBeforeNight_ifOffDuringNight_turnsOff() {
216 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
217 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
218
219 startService();
220 assertActivated(false /* activated */);
221 }
222
223 @Test
224 public void customSchedule_whenStartedBeforeNight_ifOffInPast_turnsOff() {
225 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
226 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
227
228 startService();
229 assertActivated(false /* activated */);
230 }
231
232 @Test
233 public void customSchedule_whenStartedBeforeNight_ifOnAfterNight_turnsOff() {
234 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
235 setActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
236
237 startService();
238 assertActivated(false /* activated */);
239 }
240
241 @Test
242 public void customSchedule_whenStartedBeforeNight_ifOnBeforeNight_turnsOff() {
243 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
244 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
245
246 startService();
247 assertActivated(false /* activated */);
248 }
249
250 @Test
251 public void customSchedule_whenStartedBeforeNight_ifOnDuringNight_turnsOff() {
252 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
253 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
254
255 startService();
256 assertActivated(false /* activated */);
257 }
258
259 @Test
260 public void customSchedule_whenStartedBeforeNight_ifOnInPast_turnsOn() {
261 setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
262 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
263
264 startService();
265 assertActivated(true /* activated */);
266 }
267
268 @Test
269 public void customSchedule_whenStartedDuringNight_ifOffAfterNight_turnsOn() {
270 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
271 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
272
273 startService();
274 assertActivated(true /* activated */);
275 }
276
277 @Test
278 public void customSchedule_whenStartedDuringNight_ifOffBeforeNight_turnsOn() {
279 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
280 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
281
282 startService();
283 assertActivated(true /* activated */);
284 }
285
286 @Test
287 public void customSchedule_whenStartedDuringNight_ifOffDuringNightInFuture_turnsOn() {
288 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
289 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
290
291 startService();
292 assertActivated(true /* activated */);
293 }
294
295 @Test
296 public void customSchedule_whenStartedDuringNight_ifOffDuringNightInPast_turnsOff() {
297 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
298 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
299
300 startService();
301 assertActivated(false /* activated */);
302 }
303
304 @Test
305 public void customSchedule_whenStartedDuringNight_ifOnAfterNight_turnsOn() {
306 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
307 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
308
309 startService();
310 assertActivated(true /* activated */);
311 }
312
313 @Test
314 public void customSchedule_whenStartedDuringNight_ifOnBeforeNight_turnsOn() {
315 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
316 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
317
318 startService();
319 assertActivated(true /* activated */);
320 }
321
322 @Test
323 public void customSchedule_whenStartedDuringNight_ifOnDuringNightInFuture_turnsOn() {
324 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
325 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
326
327 startService();
328 assertActivated(true /* activated */);
329 }
330
331 @Test
332 public void customSchedule_whenStartedDuringNight_ifOnDuringNightInPast_turnsOn() {
333 setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
334 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
335
336 startService();
337 assertActivated(true /* activated */);
338 }
339
340 @Test
341 public void twilightSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
342 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
343 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
344
345 startService();
346 assertActivated(false /* activated */);
347 }
348
349 @Test
350 public void twilightSchedule_whenStartedAfterNight_ifOffBeforeNight_turnsOff() {
351 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
352 setActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
353
354 startService();
355 assertActivated(false /* activated */);
356 }
357
358 @Test
359 public void twilightSchedule_whenStartedAfterNight_ifOffDuringNight_turnsOff() {
360 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
361 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
362
363 startService();
364 assertActivated(false /* activated */);
365 }
366
367 @Test
368 public void twilightSchedule_whenStartedAfterNight_ifOffInFuture_turnsOff() {
369 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
370 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
371
372 startService();
373 assertActivated(false /* activated */);
374 }
375
376 @Test
377 public void twilightSchedule_whenStartedAfterNight_ifOnAfterNight_turnsOn() {
378 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
379 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
380
381 startService();
382 assertActivated(true /* activated */);
383 }
384
385 @Test
386 public void twilightSchedule_whenStartedAfterNight_ifOnBeforeNight_turnsOff() {
387 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
388 setActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
389
390 startService();
391 assertActivated(false /* activated */);
392 }
393
394 @Test
395 public void twilightSchedule_whenStartedAfterNight_ifOnDuringNight_turnsOff() {
396 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
397 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
398
399 startService();
400 assertActivated(false /* activated */);
401 }
402
403 @Test
404 public void twilightSchedule_whenStartedAfterNight_ifOnInFuture_turnsOff() {
405 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
406 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
407
408 startService();
409 assertActivated(false /* activated */);
410 }
411
412 @Test
413 public void twilightSchedule_whenStartedBeforeNight_ifOffAfterNight_turnsOff() {
414 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
415 setActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
416
417 startService();
418 assertActivated(false /* activated */);
419 }
420
421 @Test
422 public void twilightSchedule_whenStartedBeforeNight_ifOffBeforeNight_turnsOff() {
423 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
424 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
425
426 startService();
427 assertActivated(false /* activated */);
428 }
429
430 @Test
431 public void twilightSchedule_whenStartedBeforeNight_ifOffDuringNight_turnsOff() {
432 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
433 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
434
435 startService();
436 assertActivated(false /* activated */);
437 }
438
439 @Test
440 public void twilightSchedule_whenStartedBeforeNight_ifOffInPast_turnsOff() {
441 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
442 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
443
444 startService();
445 assertActivated(false /* activated */);
446 }
447
448 @Test
449 public void twilightSchedule_whenStartedBeforeNight_ifOnAfterNight_turnsOff() {
450 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
451 setActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
452
453 startService();
454 assertActivated(false /* activated */);
455 }
456
457 @Test
458 public void twilightSchedule_whenStartedBeforeNight_ifOnBeforeNight_turnsOff() {
459 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
460 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
461
462 startService();
463 assertActivated(false /* activated */);
464 }
465
466 @Test
467 public void twilightSchedule_whenStartedBeforeNight_ifOnDuringNight_turnsOff() {
468 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
469 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
470
471 startService();
472 assertActivated(false /* activated */);
473 }
474
475 @Test
476 public void twilightSchedule_whenStartedBeforeNight_ifOnInPast_turnsOn() {
477 setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
478 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
479
480 startService();
481 assertActivated(true /* activated */);
482 }
483
484 @Test
485 public void twilightSchedule_whenStartedDuringNight_ifOffAfterNight_turnsOn() {
486 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
487 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
488
489 startService();
490 assertActivated(true /* activated */);
491 }
492
493 @Test
494 public void twilightSchedule_whenStartedDuringNight_ifOffBeforeNight_turnsOn() {
495 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
496 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
497
498 startService();
499 assertActivated(true /* activated */);
500 }
501
502 @Test
503 public void twilightSchedule_whenStartedDuringNight_ifOffDuringNightInFuture_turnsOn() {
504 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
505 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
506
507 startService();
508 assertActivated(true /* activated */);
509 }
510
511 @Test
512 public void twilightSchedule_whenStartedDuringNight_ifOffDuringNightInPast_turnsOff() {
513 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
514 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
515
516 startService();
517 assertActivated(false /* activated */);
518 }
519
520 @Test
521 public void twilightSchedule_whenStartedDuringNight_ifOnAfterNight_turnsOn() {
522 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
523 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
524
525 startService();
526 assertActivated(true /* activated */);
527 }
528
529 @Test
530 public void twilightSchedule_whenStartedDuringNight_ifOnBeforeNight_turnsOn() {
531 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
532 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
533
534 startService();
535 assertActivated(true /* activated */);
536 }
537
538 @Test
539 public void twilightSchedule_whenStartedDuringNight_ifOnDuringNightInFuture_turnsOn() {
540 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
541 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
542
543 startService();
544 assertActivated(true /* activated */);
545 }
546
547 @Test
548 public void twilightSchedule_whenStartedDuringNight_ifOnDuringNightInPast_turnsOn() {
549 setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
550 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
551
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 */);
559 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
560
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 */);
574 setActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
575
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 */);
589 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
590
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 */);
604 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
605
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 */);
619 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
620
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 */);
634 setActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
635
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 */);
649 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
650
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 */);
664 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
665
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 */);
679 setActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
680
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 */);
694 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
695
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 */);
709 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
710
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 */);
724 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
725
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 */);
739 setActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
740
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 */);
754 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
755
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 */);
769 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
770
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 */);
784 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
785
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 */);
799 setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
800
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 */);
814 setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
815
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 */);
829 setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
830
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 */);
844 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
845
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 */);
859 setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
860
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 */);
874 setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
875
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 */);
889 setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
890
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 */);
904 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
905
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
987 public void displayWhiteBalance_enable() {
988 setWhiteBalance(true /* Enable DWB Setting */);
989 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
990 mBinderService.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
991 startService();
992 assertDwbActive(true);
993 }
994
995 @Test
996 public void displayWhiteBalance_disableAfterNightDisplayEnable() {
997 setWhiteBalance(true /* Enable DWB Setting */);
998
999 startService();
1000 /* Enable nightlight */
1001 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
1002 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
1003
1004 /* Since we are using FakeSettingsProvider which could not trigger observer change,
1005 * force an update here.*/
Christine Franks0ada2772019-02-25 13:54:57 -08001006 mCds.updateDisplayWhiteBalanceStatus();
Long Ling1d3f1892019-02-06 12:34:02 -08001007 assertDwbActive(false);
1008 }
1009
1010 @Test
1011 public void displayWhiteBalance_enableAfterNightDisplayDisable() {
1012 setWhiteBalance(true /* Enable DWB Setting */);
1013 startService();
1014 /* Enable nightlight */
1015 setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
1016 setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
1017
Christine Franks0ada2772019-02-25 13:54:57 -08001018 mCds.updateDisplayWhiteBalanceStatus();
Long Ling1d3f1892019-02-06 12:34:02 -08001019 assertDwbActive(false);
1020
1021 /* Disable nightlight */
1022 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
Christine Franks0ada2772019-02-25 13:54:57 -08001023 mCds.updateDisplayWhiteBalanceStatus();
Long Ling1d3f1892019-02-06 12:34:02 -08001024 assertDwbActive(true);
1025 }
1026
1027 @Test
1028 public void displayWhiteBalance_enableAfterLinearColorMode() {
1029 setWhiteBalance(true /* Enable DWB Setting */);
1030 setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
1031 startService();
1032 mBinderService.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
1033
Christine Franks0ada2772019-02-25 13:54:57 -08001034 mCds.updateDisplayWhiteBalanceStatus();
Long Ling1d3f1892019-02-06 12:34:02 -08001035 assertDwbActive(true);
1036 }
1037
1038 @Test
1039 public void displayWhiteBalance_setTemperatureOverMax() {
Christine Franks0ada2772019-02-25 13:54:57 -08001040 int max = mCds.mDisplayWhiteBalanceTintController.mTemperatureMax;
Long Ling1d3f1892019-02-06 12:34:02 -08001041
1042 ColorDisplayService.ColorDisplayServiceInternal cdsInternal = LocalServices.getService(
Christine Franks0ada2772019-02-25 13:54:57 -08001043 ColorDisplayService.ColorDisplayServiceInternal.class);
1044 cdsInternal.setDisplayWhiteBalanceColorTemperature(max + 1);
Long Ling1d3f1892019-02-06 12:34:02 -08001045
1046 assertWithMessage("Unexpected temperature set")
Christine Franks0ada2772019-02-25 13:54:57 -08001047 .that(mCds.mDisplayWhiteBalanceTintController.mCurrentColorTemperature)
Long Ling1d3f1892019-02-06 12:34:02 -08001048 .isEqualTo(max);
1049 }
1050
1051 @Test
1052 public void displayWhiteBalance_setTemperatureBelowMin() {
Christine Franks0ada2772019-02-25 13:54:57 -08001053 int min = mCds.mDisplayWhiteBalanceTintController.mTemperatureMin;
Long Ling1d3f1892019-02-06 12:34:02 -08001054
1055 ColorDisplayService.ColorDisplayServiceInternal cdsInternal = LocalServices.getService(
Christine Franks0ada2772019-02-25 13:54:57 -08001056 ColorDisplayService.ColorDisplayServiceInternal.class);
Long Ling1d3f1892019-02-06 12:34:02 -08001057 cdsInternal.setDisplayWhiteBalanceColorTemperature(min - 1);
1058
1059 assertWithMessage("Unexpected temperature set")
Christine Franks0ada2772019-02-25 13:54:57 -08001060 .that(mCds.mDisplayWhiteBalanceTintController.mCurrentColorTemperature)
Long Ling1d3f1892019-02-06 12:34:02 -08001061 .isEqualTo(min);
1062 }
1063
1064 @Test
1065 public void displayWhiteBalance_setValidTemperature() {
Christine Franks0ada2772019-02-25 13:54:57 -08001066 int min = mCds.mDisplayWhiteBalanceTintController.mTemperatureMin;
1067 int max = mCds.mDisplayWhiteBalanceTintController.mTemperatureMax;
Long Ling1d3f1892019-02-06 12:34:02 -08001068 int valToSet = (min + max) / 2;
1069
1070 ColorDisplayService.ColorDisplayServiceInternal cdsInternal = LocalServices.getService(
Christine Franks0ada2772019-02-25 13:54:57 -08001071 ColorDisplayService.ColorDisplayServiceInternal.class);
Long Ling1d3f1892019-02-06 12:34:02 -08001072 cdsInternal.setDisplayWhiteBalanceColorTemperature(valToSet);
1073
1074 assertWithMessage("Unexpected temperature set")
Christine Franks0ada2772019-02-25 13:54:57 -08001075 .that(mCds.mDisplayWhiteBalanceTintController.mCurrentColorTemperature)
Long Ling1d3f1892019-02-06 12:34:02 -08001076 .isEqualTo(valToSet);
1077 }
1078
Christine Frankse5bb03e2017-02-10 17:36:10 -08001079 /**
1080 * Configures Night display to use a custom schedule.
1081 *
1082 * @param startTimeOffset the offset relative to now to activate Night display (in minutes)
Justin Klaassen3da4c442017-05-05 15:19:33 -07001083 * @param endTimeOffset the offset relative to now to deactivate Night display (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -08001084 */
1085 private void setAutoModeCustom(int startTimeOffset, int endTimeOffset) {
Christine Franks71e003e2019-01-24 14:40:20 -08001086 mBinderService.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_CUSTOM_TIME);
1087 mBinderService.setNightDisplayCustomStartTime(
1088 new Time(getLocalTimeRelativeToNow(startTimeOffset)));
1089 mBinderService
1090 .setNightDisplayCustomEndTime(new Time(getLocalTimeRelativeToNow(endTimeOffset)));
Christine Frankse5bb03e2017-02-10 17:36:10 -08001091 }
1092
1093 /**
1094 * Configures Night display to use the twilight schedule.
1095 *
Justin Klaassen3da4c442017-05-05 15:19:33 -07001096 * @param sunsetOffset the offset relative to now for sunset (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -08001097 * @param sunriseOffset the offset relative to now for sunrise (in minutes)
1098 */
1099 private void setAutoModeTwilight(int sunsetOffset, int sunriseOffset) {
Christine Franks71e003e2019-01-24 14:40:20 -08001100 mBinderService.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_TWILIGHT);
Justin Klaassen3da4c442017-05-05 15:19:33 -07001101 mTwilightManager.setTwilightState(
1102 getTwilightStateRelativeToNow(sunsetOffset, sunriseOffset));
Christine Frankse5bb03e2017-02-10 17:36:10 -08001103 }
1104
1105 /**
1106 * Configures the Night display activated state.
1107 *
Justin Klaassen3da4c442017-05-05 15:19:33 -07001108 * @param activated {@code true} if Night display should be activated
Christine Frankse5bb03e2017-02-10 17:36:10 -08001109 * @param lastActivatedTimeOffset the offset relative to now to record that Night display was
Justin Klaassen3da4c442017-05-05 15:19:33 -07001110 * activated (in minutes)
Christine Frankse5bb03e2017-02-10 17:36:10 -08001111 */
1112 private void setActivated(boolean activated, int lastActivatedTimeOffset) {
Christine Franks83cc5412018-07-03 14:46:07 -07001113 mBinderService.setNightDisplayActivated(activated);
Christine Franks03213462017-08-25 13:57:26 -07001114 Secure.putStringForUser(mContext.getContentResolver(),
1115 Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME,
1116 LocalDateTime.now().plusMinutes(lastActivatedTimeOffset).toString(),
1117 mUserId);
Christine Frankse5bb03e2017-02-10 17:36:10 -08001118 }
1119
1120 /**
Daniel Solomon317a3572018-03-30 18:36:37 -07001121 * Configures the Accessibility color correction setting state.
1122 *
1123 * @param state {@code true} if color inversion should be activated
1124 */
1125 private void setAccessibilityColorCorrection(boolean state) {
1126 Secure.putIntForUser(mContext.getContentResolver(),
1127 Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, state ? 1 : 0, mUserId);
1128 }
1129
1130 /**
1131 * Configures the Accessibility color inversion setting state.
1132 *
1133 * @param state {@code true} if color inversion should be activated
1134 */
1135 private void setAccessibilityColorInversion(boolean state) {
1136 Secure.putIntForUser(mContext.getContentResolver(),
1137 Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, state ? 1 : 0, mUserId);
1138 }
1139
1140 /**
Long Ling1d3f1892019-02-06 12:34:02 -08001141 * Configures the Display White Balance setting state.
1142 *
1143 * @param state {@code true} if display white balance should be enabled
1144 */
1145 private void setWhiteBalance(boolean state) {
1146 Secure.putIntForUser(mContext.getContentResolver(),
1147 Secure.DISPLAY_WHITE_BALANCE_ENABLED, state ? 1 : 0, mUserId);
1148 }
1149
1150 /**
Christine Franks71e003e2019-01-24 14:40:20 -08001151 * Configures color mode.
Daniel Solomon317a3572018-03-30 18:36:37 -07001152 */
Christine Franks83cc5412018-07-03 14:46:07 -07001153 private void setColorMode(int colorMode) {
Christine Franks71e003e2019-01-24 14:40:20 -08001154 mBinderService.setColorMode(colorMode);
Daniel Solomon317a3572018-03-30 18:36:37 -07001155 }
1156
1157 /**
Christine Franks39b03112018-07-03 14:46:07 -07001158 * Returns whether the color mode is valid on the device the tests are running on.
Christine Franks39b03112018-07-03 14:46:07 -07001159 */
1160 private boolean isColorModeValid(int mode) {
1161 final int[] availableColorModes = mContext.getResources().getIntArray(
Christine Franks71e003e2019-01-24 14:40:20 -08001162 R.array.config_availableColorModes);
Christine Franks39b03112018-07-03 14:46:07 -07001163 if (availableColorModes != null) {
1164 for (int availableMode : availableColorModes) {
1165 if (mode == availableMode) {
1166 return true;
1167 }
1168 }
1169 }
1170 return false;
1171 }
1172
1173 /**
Christine Franks0ada2772019-02-25 13:54:57 -08001174 * Convenience method to start {@link #mCds}.
Christine Frankse5bb03e2017-02-10 17:36:10 -08001175 */
1176 private void startService() {
1177 Secure.putIntForUser(mContext.getContentResolver(), Secure.USER_SETUP_COMPLETE, 1, mUserId);
1178
Christine Franks71e003e2019-01-24 14:40:20 -08001179 InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
Christine Franks0ada2772019-02-25 13:54:57 -08001180 mCds.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
1181 mCds.onStartUser(mUserId);
Christine Frankse5bb03e2017-02-10 17:36:10 -08001182 });
1183 }
1184
1185 /**
1186 * Convenience method for asserting whether Night display should be activated.
1187 *
1188 * @param activated the expected activated state of Night display
1189 */
1190 private void assertActivated(boolean activated) {
Christine Franks83cc5412018-07-03 14:46:07 -07001191 assertWithMessage("Incorrect Night display activated state")
1192 .that(mBinderService.isNightDisplayActivated())
Christine Frankse5bb03e2017-02-10 17:36:10 -08001193 .isEqualTo(activated);
1194 }
Justin Klaassen3da4c442017-05-05 15:19:33 -07001195
1196 /**
Daniel Solomon317a3572018-03-30 18:36:37 -07001197 * Convenience method for asserting that the active color mode matches expectation.
1198 *
1199 * @param mode the expected active color mode.
1200 */
1201 private void assertActiveColorMode(int mode) {
1202 assertWithMessage("Unexpected color mode setting")
Christine Franks71e003e2019-01-24 14:40:20 -08001203 .that(mBinderService.getColorMode())
Daniel Solomon317a3572018-03-30 18:36:37 -07001204 .isEqualTo(mode);
1205 }
1206
1207 /**
1208 * Convenience method for asserting that the user chosen color mode matches expectation.
1209 *
1210 * @param mode the expected color mode setting.
1211 */
1212 private void assertUserColorMode(int mode) {
1213 final int actualMode = System.getIntForUser(mContext.getContentResolver(),
1214 System.DISPLAY_COLOR_MODE, -1, mUserId);
1215 assertWithMessage("Unexpected color mode setting")
1216 .that(actualMode)
1217 .isEqualTo(mode);
1218 }
1219
1220 /**
Long Ling1d3f1892019-02-06 12:34:02 -08001221 * Convenience method for asserting that the DWB active status matches expectation.
1222 *
1223 * @param enabled the expected active status.
1224 */
1225 private void assertDwbActive(boolean enabled) {
1226 assertWithMessage("Incorrect Display White Balance state")
Christine Franks0ada2772019-02-25 13:54:57 -08001227 .that(mCds.mDisplayWhiteBalanceTintController.isActivated())
Long Ling1d3f1892019-02-06 12:34:02 -08001228 .isEqualTo(enabled);
1229 }
1230
1231 /**
Justin Klaassen3da4c442017-05-05 15:19:33 -07001232 * Convenience for making a {@link LocalTime} instance with an offset relative to now.
1233 *
1234 * @param offsetMinutes the offset relative to now (in minutes)
1235 * @return the LocalTime instance
1236 */
1237 private static LocalTime getLocalTimeRelativeToNow(int offsetMinutes) {
1238 final Calendar c = Calendar.getInstance();
1239 c.add(Calendar.MINUTE, offsetMinutes);
Christine Franks03213462017-08-25 13:57:26 -07001240 return LocalTime.of(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE));
Justin Klaassen3da4c442017-05-05 15:19:33 -07001241 }
1242
1243 /**
1244 * Convenience for making a {@link TwilightState} instance with sunrise/sunset relative to now.
1245 *
1246 * @param sunsetOffset the offset relative to now for sunset (in minutes)
1247 * @param sunriseOffset the offset relative to now for sunrise (in minutes)
1248 * @return the TwilightState instance
1249 */
1250 private static TwilightState getTwilightStateRelativeToNow(int sunsetOffset,
1251 int sunriseOffset) {
1252 final LocalTime sunset = getLocalTimeRelativeToNow(sunsetOffset);
1253 final LocalTime sunrise = getLocalTimeRelativeToNow(sunriseOffset);
1254
Christine Franks03213462017-08-25 13:57:26 -07001255 final LocalDateTime now = LocalDateTime.now();
1256 final ZoneId zoneId = ZoneId.systemDefault();
1257
Christine Franks5397f032017-11-01 18:35:16 -07001258 long sunsetMillis = ColorDisplayService.getDateTimeBefore(sunset, now)
Christine Franks03213462017-08-25 13:57:26 -07001259 .atZone(zoneId)
1260 .toInstant()
1261 .toEpochMilli();
Christine Franks5397f032017-11-01 18:35:16 -07001262 long sunriseMillis = ColorDisplayService.getDateTimeBefore(sunrise, now)
Christine Franks03213462017-08-25 13:57:26 -07001263 .atZone(zoneId)
1264 .toInstant()
1265 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001266 if (sunsetMillis < sunriseMillis) {
Christine Franks5397f032017-11-01 18:35:16 -07001267 sunsetMillis = ColorDisplayService.getDateTimeAfter(sunset, now)
Christine Franks03213462017-08-25 13:57:26 -07001268 .atZone(zoneId)
1269 .toInstant()
1270 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001271 } else {
Christine Franks5397f032017-11-01 18:35:16 -07001272 sunriseMillis = ColorDisplayService.getDateTimeAfter(sunrise, now)
Christine Franks03213462017-08-25 13:57:26 -07001273 .atZone(zoneId)
1274 .toInstant()
1275 .toEpochMilli();
Justin Klaassen3da4c442017-05-05 15:19:33 -07001276 }
1277
1278 return new TwilightState(sunriseMillis, sunsetMillis);
1279 }
1280
1281 private static class MockTwilightManager implements TwilightManager {
1282
1283 private final Map<TwilightListener, Handler> mListeners = new HashMap<>();
1284 private TwilightState mTwilightState;
1285
1286 /**
1287 * Updates the TwilightState and notifies any registered listeners.
1288 *
1289 * @param state the new TwilightState to use
1290 */
1291 void setTwilightState(TwilightState state) {
1292 synchronized (mListeners) {
1293 mTwilightState = state;
1294
1295 final CountDownLatch latch = new CountDownLatch(mListeners.size());
1296 for (Map.Entry<TwilightListener, Handler> entry : mListeners.entrySet()) {
1297 entry.getValue().post(new Runnable() {
1298 @Override
1299 public void run() {
1300 entry.getKey().onTwilightStateChanged(state);
1301 latch.countDown();
1302 }
1303 });
1304 }
1305
1306 try {
1307 latch.await(5, TimeUnit.SECONDS);
1308 } catch (InterruptedException e) {
1309 throw new RuntimeException(e);
1310 }
1311 }
1312 }
1313
1314 @Override
1315 public void registerListener(@NonNull TwilightListener listener, @NonNull Handler handler) {
1316 synchronized (mListeners) {
1317 mListeners.put(listener, handler);
1318 }
1319 }
1320
1321 @Override
1322 public void unregisterListener(@NonNull TwilightListener listener) {
1323 synchronized (mListeners) {
1324 mListeners.remove(listener);
1325 }
1326 }
1327
1328 @Override
1329 public TwilightState getLastTwilightState() {
1330 return mTwilightState;
1331 }
1332 }
Christine Frankse5bb03e2017-02-10 17:36:10 -08001333}