1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.doze;
18 
19 import static com.android.systemui.doze.DozeMachine.State.DOZE;
20 import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD;
21 import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSED;
22 import static com.android.systemui.doze.DozeMachine.State.INITIALIZED;
23 import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;
24 
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.ArgumentMatchers.anyInt;
27 import static org.mockito.ArgumentMatchers.anyLong;
28 import static org.mockito.ArgumentMatchers.eq;
29 import static org.mockito.Mockito.clearInvocations;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
32 
33 import android.app.AlarmManager;
34 import android.os.Handler;
35 import android.os.HandlerThread;
36 import android.testing.TestableLooper;
37 
38 import androidx.test.filters.SmallTest;
39 import androidx.test.runner.AndroidJUnit4;
40 
41 import com.android.systemui.DejankUtils;
42 import com.android.systemui.SysuiTestCase;
43 import com.android.systemui.statusbar.phone.DozeParameters;
44 import com.android.systemui.util.wakelock.WakeLockFake;
45 
46 import org.junit.After;
47 import org.junit.Before;
48 import org.junit.Test;
49 import org.junit.runner.RunWith;
50 import org.mockito.Mock;
51 import org.mockito.MockitoAnnotations;
52 
53 @RunWith(AndroidJUnit4.class)
54 @SmallTest
55 @TestableLooper.RunWithLooper
56 public class DozeUiTest extends SysuiTestCase {
57 
58     @Mock
59     private AlarmManager mAlarmManager;
60     @Mock
61     private DozeMachine mMachine;
62     @Mock
63     private DozeParameters mDozeParameters;
64     @Mock
65     private DozeHost mHost;
66     @Mock
67     private DozeLog mDozeLog;
68     private WakeLockFake mWakeLock;
69     private Handler mHandler;
70     private HandlerThread mHandlerThread;
71     private DozeUi mDozeUi;
72 
73     @Before
setUp()74     public void setUp() throws Exception {
75         allowTestableLooperAsMainThread();
76         MockitoAnnotations.initMocks(this);
77         DejankUtils.setImmediate(true);
78 
79         mHandlerThread = new HandlerThread("DozeUiTest");
80         mHandlerThread.start();
81         mWakeLock = new WakeLockFake();
82         mHandler = mHandlerThread.getThreadHandler();
83 
84         mDozeUi = new DozeUi(mContext, mAlarmManager, mWakeLock, mHost, mHandler,
85                 mDozeParameters, mDozeLog);
86         mDozeUi.setDozeMachine(mMachine);
87     }
88 
89     @After
tearDown()90     public void tearDown() throws Exception {
91         DejankUtils.setImmediate(false);
92         mHandlerThread.quit();
93         mHandler = null;
94         mHandlerThread = null;
95     }
96 
97     @Test
pausingAndUnpausingAod_registersTimeTickAfterUnpausing()98     public void pausingAndUnpausingAod_registersTimeTickAfterUnpausing() {
99         mDozeUi.transitionTo(UNINITIALIZED, INITIALIZED);
100         mDozeUi.transitionTo(INITIALIZED, DOZE_AOD);
101         mDozeUi.transitionTo(DOZE_AOD, DOZE_AOD_PAUSED);
102 
103         clearInvocations(mAlarmManager);
104 
105         mDozeUi.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD);
106 
107         verify(mAlarmManager).setExact(anyInt(), anyLong(), eq("doze_time_tick"), any(), any());
108     }
109 
110     @Test
transitionSetsAnimateWakeup_noAlwaysOn()111     public void transitionSetsAnimateWakeup_noAlwaysOn() {
112         mDozeUi.transitionTo(UNINITIALIZED, DOZE);
113         verify(mHost).setAnimateWakeup(eq(false));
114     }
115 
116     @Test
transitionSetsAnimateWakeup_alwaysOn()117     public void transitionSetsAnimateWakeup_alwaysOn() {
118         when(mDozeParameters.getAlwaysOn()).thenReturn(true);
119         when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
120         mDozeUi.transitionTo(UNINITIALIZED, DOZE);
121         verify(mHost).setAnimateWakeup(eq(true));
122     }
123 }
124