blob: 25231bcbc1c40df52ac348199aa6404af5455cbb [file] [log] [blame]
Adrian Roos540b5282017-05-15 13:29:49 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.doze;
18
Lucas Dupin43d0d732017-11-16 11:23:49 -080019import static com.android.systemui.doze.DozeMachine.State.DOZE;
Adrian Roos540b5282017-05-15 13:29:49 -070020import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD;
21import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSED;
22import static com.android.systemui.doze.DozeMachine.State.INITIALIZED;
23import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;
24
25import static org.mockito.ArgumentMatchers.any;
26import static org.mockito.ArgumentMatchers.anyInt;
27import static org.mockito.ArgumentMatchers.anyLong;
28import static org.mockito.ArgumentMatchers.eq;
29import static org.mockito.Mockito.clearInvocations;
Lucas Dupin16cfe452018-02-08 13:14:50 -080030import static org.mockito.Mockito.never;
31import static org.mockito.Mockito.reset;
Adrian Roos540b5282017-05-15 13:29:49 -070032import static org.mockito.Mockito.verify;
Lucas Dupin43d0d732017-11-16 11:23:49 -080033import static org.mockito.Mockito.when;
Adrian Roos540b5282017-05-15 13:29:49 -070034
35import android.app.AlarmManager;
Adrian Roos540b5282017-05-15 13:29:49 -070036import android.os.Handler;
37import android.os.HandlerThread;
Brett Chabot84151d92019-02-27 15:37:59 -080038
39import androidx.test.filters.SmallTest;
40import androidx.test.runner.AndroidJUnit4;
Adrian Roos540b5282017-05-15 13:29:49 -070041
Lucas Dupin16cfe452018-02-08 13:14:50 -080042import com.android.keyguard.KeyguardUpdateMonitor;
Jason Monkfba8faf2017-05-23 10:42:59 -040043import com.android.systemui.SysuiTestCase;
Lucas Dupin43d0d732017-11-16 11:23:49 -080044import com.android.systemui.statusbar.phone.DozeParameters;
Adrian Roos540b5282017-05-15 13:29:49 -070045import com.android.systemui.util.wakelock.WakeLockFake;
46
47import org.junit.After;
48import org.junit.Before;
49import org.junit.Test;
50import org.junit.runner.RunWith;
Lucas Dupin16cfe452018-02-08 13:14:50 -080051import org.mockito.Mock;
52import org.mockito.MockitoAnnotations;
Adrian Roos540b5282017-05-15 13:29:49 -070053
54@RunWith(AndroidJUnit4.class)
Jason Monkfba8faf2017-05-23 10:42:59 -040055@SmallTest
56public class DozeUiTest extends SysuiTestCase {
Adrian Roos540b5282017-05-15 13:29:49 -070057
Lucas Dupin16cfe452018-02-08 13:14:50 -080058 @Mock
Adrian Roos540b5282017-05-15 13:29:49 -070059 private AlarmManager mAlarmManager;
Lucas Dupin16cfe452018-02-08 13:14:50 -080060 @Mock
Adrian Roos540b5282017-05-15 13:29:49 -070061 private DozeMachine mMachine;
Lucas Dupin16cfe452018-02-08 13:14:50 -080062 @Mock
63 private DozeParameters mDozeParameters;
64 @Mock
65 private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
66 @Mock
67 private DozeHost mHost;
Adrian Roos540b5282017-05-15 13:29:49 -070068 private WakeLockFake mWakeLock;
Adrian Roos540b5282017-05-15 13:29:49 -070069 private Handler mHandler;
70 private HandlerThread mHandlerThread;
71 private DozeUi mDozeUi;
72
73 @Before
74 public void setUp() throws Exception {
Lucas Dupin16cfe452018-02-08 13:14:50 -080075 MockitoAnnotations.initMocks(this);
76
Adrian Roos540b5282017-05-15 13:29:49 -070077 mHandlerThread = new HandlerThread("DozeUiTest");
78 mHandlerThread.start();
Adrian Roos540b5282017-05-15 13:29:49 -070079 mWakeLock = new WakeLockFake();
Adrian Roos540b5282017-05-15 13:29:49 -070080 mHandler = mHandlerThread.getThreadHandler();
81
Lucas Dupin16cfe452018-02-08 13:14:50 -080082 mDozeUi = new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler,
83 mDozeParameters, mKeyguardUpdateMonitor);
Adrian Roos540b5282017-05-15 13:29:49 -070084 }
85
86 @After
87 public void tearDown() throws Exception {
88 mHandlerThread.quit();
89 mHandler = null;
90 mHandlerThread = null;
91 }
92
93 @Test
94 public void pausingAndUnpausingAod_registersTimeTickAfterUnpausing() throws Exception {
95 mDozeUi.transitionTo(UNINITIALIZED, INITIALIZED);
96 mDozeUi.transitionTo(INITIALIZED, DOZE_AOD);
97 mDozeUi.transitionTo(DOZE_AOD, DOZE_AOD_PAUSED);
98
99 clearInvocations(mAlarmManager);
100
101 mDozeUi.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD);
102
103 verify(mAlarmManager).setExact(anyInt(), anyLong(), eq("doze_time_tick"), any(), any());
104 }
Lucas Dupin43d0d732017-11-16 11:23:49 -0800105
106 @Test
Lucas Dupin16cfe452018-02-08 13:14:50 -0800107 public void propagatesAnimateScreenOff_noAlwaysOn() {
108 reset(mHost);
109 when(mDozeParameters.getAlwaysOn()).thenReturn(false);
110 when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
Lucas Dupin43d0d732017-11-16 11:23:49 -0800111
Lucas Dupin16cfe452018-02-08 13:14:50 -0800112 mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false);
113 verify(mHost).setAnimateScreenOff(eq(false));
Lucas Dupin43d0d732017-11-16 11:23:49 -0800114 }
115
116 @Test
Lucas Dupin16cfe452018-02-08 13:14:50 -0800117 public void propagatesAnimateScreenOff_alwaysOn() {
118 reset(mHost);
119 when(mDozeParameters.getAlwaysOn()).thenReturn(true);
120 when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
121
122 // Take over when the keyguard is visible.
123 mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(true);
124 verify(mHost).setAnimateScreenOff(eq(true));
125
126 // Do not animate screen-off when keyguard isn't visible - PowerManager will do it.
127 mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false);
128 verify(mHost).setAnimateScreenOff(eq(false));
129 }
130
131 @Test
132 public void neverAnimateScreenOff_whenNotSupported() {
133 // Re-initialize DozeParameters saying that the display requires blanking.
134 reset(mDozeParameters);
135 reset(mHost);
136 when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(true);
137 mDozeUi = new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler,
138 mDozeParameters, mKeyguardUpdateMonitor);
139
140 // Never animate if display doesn't support it.
141 mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(true);
142 mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false);
143 verify(mHost, never()).setAnimateScreenOff(eq(false));
144 }
145
146 @Test
147 public void transitionSetsAnimateWakeup_alwaysOn() {
148 when(mDozeParameters.getAlwaysOn()).thenReturn(true);
149 when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
Lucas Dupin43d0d732017-11-16 11:23:49 -0800150 mDozeUi.transitionTo(UNINITIALIZED, DOZE);
Lucas Dupin16cfe452018-02-08 13:14:50 -0800151 verify(mHost).setAnimateWakeup(eq(true));
152 }
153
154 @Test
155 public void keyguardVisibility_changesControlScreenOffAnimation() {
156 // Pre-condition
157 reset(mDozeParameters);
158 when(mDozeParameters.getAlwaysOn()).thenReturn(true);
159 when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
160
161 mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false);
162 verify(mDozeParameters).setControlScreenOffAnimation(eq(false));
163 mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(true);
164 verify(mDozeParameters).setControlScreenOffAnimation(eq(true));
165 }
166
167 @Test
168 public void transitionSetsAnimateWakeup_noAlwaysOn() {
169 mDozeUi.transitionTo(UNINITIALIZED, DOZE);
170 verify(mHost).setAnimateWakeup(eq(false));
Lucas Dupin43d0d732017-11-16 11:23:49 -0800171 }
Brett Chabot84151d92019-02-27 15:37:59 -0800172}