blob: 1cdc02fdd01a2356e1b86244b960791390152212 [file] [log] [blame]
Adrian Roosd35d4ca2017-04-19 14:31:03 -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
19import static org.mockito.ArgumentMatchers.any;
20import static org.mockito.ArgumentMatchers.anyInt;
Lucas Dupined5b7a92019-03-20 11:00:27 -070021import static org.mockito.ArgumentMatchers.eq;
Lucas Dupin3174c662019-07-15 15:49:54 -070022import static org.mockito.Mockito.clearInvocations;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070023import static org.mockito.Mockito.doAnswer;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070024import static org.mockito.Mockito.mock;
25import static org.mockito.Mockito.never;
lpeter8a5f4702019-01-18 16:53:07 +080026import static org.mockito.Mockito.spy;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070027import static org.mockito.Mockito.verify;
28import static org.mockito.Mockito.when;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070029
Adrian Roos6023ccb2017-06-28 16:22:02 +020030import android.app.AlarmManager;
Lucas Dupin3174c662019-07-15 15:49:54 -070031import android.hardware.Sensor;
Issei Suzukica19e6e2019-02-26 12:39:11 +010032import android.hardware.display.AmbientDisplayConfiguration;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070033import android.os.Handler;
Jason Monk6dceace2018-05-15 20:24:07 -040034import android.testing.AndroidTestingRunner;
Dave Mankoff63a12822019-09-16 14:38:06 -040035import android.testing.TestableLooper;
Jason Monk6dceace2018-05-15 20:24:07 -040036import android.testing.TestableLooper.RunWithLooper;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070037
Brett Chabot84151d92019-02-27 15:37:59 -080038import androidx.test.filters.SmallTest;
39
Jason Monk25a52b62017-05-23 10:42:59 -040040import com.android.systemui.SysuiTestCase;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000041import com.android.systemui.broadcast.BroadcastDispatcher;
Lucas Dupin3174c662019-07-15 15:49:54 -070042import com.android.systemui.dock.DockManager;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070043import com.android.systemui.statusbar.phone.DozeParameters;
Dave Mankoff63a12822019-09-16 14:38:06 -040044import com.android.systemui.util.sensors.AsyncSensorManager;
Dave Mankoffbf52f4b2019-09-20 14:34:28 -040045import com.android.systemui.util.sensors.FakeProximitySensor;
Dave Mankoff63a12822019-09-16 14:38:06 -040046import com.android.systemui.util.sensors.FakeSensorManager;
Dave Mankoffbf52f4b2019-09-20 14:34:28 -040047import com.android.systemui.util.sensors.ProximitySensor;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070048import com.android.systemui.util.wakelock.WakeLock;
49import com.android.systemui.util.wakelock.WakeLockFake;
50
51import org.junit.Before;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070052import org.junit.Test;
Adrian Roos84a187f2017-04-28 14:10:51 -070053import org.junit.runner.RunWith;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070054import org.mockito.ArgumentCaptor;
55import org.mockito.Mock;
56import org.mockito.MockitoAnnotations;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070057
Adrian Roos84a187f2017-04-28 14:10:51 -070058@SmallTest
Jason Monk6dceace2018-05-15 20:24:07 -040059@RunWith(AndroidTestingRunner.class)
Lucas Dupin3174c662019-07-15 15:49:54 -070060@RunWithLooper(setAsMainLooper = true)
Jason Monk25a52b62017-05-23 10:42:59 -040061public class DozeTriggersTest extends SysuiTestCase {
Lucas Dupinedbe45b2019-10-14 15:43:03 -070062
63 @Mock
Adrian Roosd35d4ca2017-04-19 14:31:03 -070064 private DozeMachine mMachine;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070065 @Mock
66 private DozeHost mHost;
67 @Mock
68 private AlarmManager mAlarmManager;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000069 @Mock
70 private BroadcastDispatcher mBroadcastDispatcher;
Jerry Changae4dc4b2019-10-16 18:45:03 +080071 @Mock
72 private DockManager mDockManager;
Dave Mankoff0dbd6172020-06-22 15:58:25 -040073 @Mock
74 private ProximitySensor.ProximityCheck mProximityCheck;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070075 private DozeTriggers mTriggers;
Adrian Roos84a187f2017-04-28 14:10:51 -070076 private FakeSensorManager mSensors;
Lucas Dupin3174c662019-07-15 15:49:54 -070077 private Sensor mTapSensor;
Dave Mankoffbf52f4b2019-09-20 14:34:28 -040078 private FakeProximitySensor mProximitySensor;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070079
Adrian Roosd35d4ca2017-04-19 14:31:03 -070080 @Before
81 public void setUp() throws Exception {
Lucas Dupinedbe45b2019-10-14 15:43:03 -070082 MockitoAnnotations.initMocks(this);
Dave Mankoff63a12822019-09-16 14:38:06 -040083 AmbientDisplayConfiguration config = DozeConfigurationUtil.createMockConfig();
84 DozeParameters parameters = DozeConfigurationUtil.createMockParameters();
Lucas Dupin3174c662019-07-15 15:49:54 -070085 mSensors = spy(new FakeSensorManager(mContext));
86 mTapSensor = mSensors.getFakeTapSensor().getSensor();
Dave Mankoff63a12822019-09-16 14:38:06 -040087 WakeLock wakeLock = new WakeLockFake();
Dave Mankoff63a12822019-09-16 14:38:06 -040088 AsyncSensorManager asyncSensorManager =
89 new AsyncSensorManager(mSensors, null, new Handler());
Dave Mankoffd94c9692019-10-18 12:38:21 -040090 mProximitySensor = new FakeProximitySensor(getContext().getResources(), asyncSensorManager);
Adrian Roosd35d4ca2017-04-19 14:31:03 -070091
Lucas Dupinedbe45b2019-10-14 15:43:03 -070092 mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager, config, parameters,
Dave Mankoff0dbd6172020-06-22 15:58:25 -040093 asyncSensorManager, wakeLock, true, mDockManager, mProximitySensor,
94 mProximityCheck, mock(DozeLog.class), mBroadcastDispatcher);
Dave Mankoff63a12822019-09-16 14:38:06 -040095 waitForSensorManager();
Adrian Roosd35d4ca2017-04-19 14:31:03 -070096 }
97
98 @Test
Adrian Roosd35d4ca2017-04-19 14:31:03 -070099 public void testOnNotification_stillWorksAfterOneFailedProxCheck() throws Exception {
100 when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700101 ArgumentCaptor<DozeHost.Callback> captor = ArgumentCaptor.forClass(DozeHost.Callback.class);
102 doAnswer(invocation -> null).when(mHost).addCallback(captor.capture());
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700103
Jason Monk6dceace2018-05-15 20:24:07 -0400104 mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED);
105 mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
Lucas Dupin3174c662019-07-15 15:49:54 -0700106 clearInvocations(mMachine);
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700107
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400108 mProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(true, 1));
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700109 captor.getValue().onNotificationAlerted(null /* pulseSuppressedListener */);
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400110 mProximitySensor.alertListeners();
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700111
112 verify(mMachine, never()).requestState(any());
Adrian Roos84a187f2017-04-28 14:10:51 -0700113 verify(mMachine, never()).requestPulse(anyInt());
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700114
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400115 mProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(false, 2));
Dave Mankoffdddcae92020-05-13 12:46:18 -0400116 captor.getValue().onNotificationAlerted(null /* pulseSuppressedListener */);
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400117 mProximitySensor.alertListeners();
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700118
Adrian Roosd7b9d102017-04-28 15:42:58 -0700119 verify(mMachine).requestPulse(anyInt());
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700120 }
121
lpeter8a5f4702019-01-18 16:53:07 +0800122 @Test
Lucas Dupin3174c662019-07-15 15:49:54 -0700123 public void testTransitionTo_disablesAndEnablesTouchSensors() {
124 when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
125
126 mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
Dave Mankoff63a12822019-09-16 14:38:06 -0400127 waitForSensorManager();
Lucas Dupin3174c662019-07-15 15:49:54 -0700128 verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
129
130 clearInvocations(mSensors);
131 mTriggers.transitionTo(DozeMachine.State.DOZE,
132 DozeMachine.State.DOZE_REQUEST_PULSE);
133 mTriggers.transitionTo(DozeMachine.State.DOZE_REQUEST_PULSE,
134 DozeMachine.State.DOZE_PULSING);
Dave Mankoff63a12822019-09-16 14:38:06 -0400135 waitForSensorManager();
Lucas Dupin3174c662019-07-15 15:49:54 -0700136 verify(mSensors).cancelTriggerSensor(any(), eq(mTapSensor));
137
138 clearInvocations(mSensors);
139 mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE);
Dave Mankoff63a12822019-09-16 14:38:06 -0400140 waitForSensorManager();
Lucas Dupin3174c662019-07-15 15:49:54 -0700141 verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
142 }
143
144 @Test
Jerry Changae4dc4b2019-10-16 18:45:03 +0800145 public void transitionToDockedAod_disablesTouchSensors() {
146 mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
147 waitForSensorManager();
148 verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
149
150 mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.DOZE_AOD_DOCKED);
151 waitForSensorManager();
152
153 verify(mSensors).cancelTriggerSensor(any(), eq(mTapSensor));
154 }
155
156 @Test
lpeter8a5f4702019-01-18 16:53:07 +0800157 public void testDockEventListener_registerAndUnregister() {
158 mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED);
Jerry Changae4dc4b2019-10-16 18:45:03 +0800159 verify(mDockManager).addListener(any());
lpeter8a5f4702019-01-18 16:53:07 +0800160
161 mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.FINISH);
Jerry Changae4dc4b2019-10-16 18:45:03 +0800162 verify(mDockManager).removeListener(any());
lpeter8a5f4702019-01-18 16:53:07 +0800163 }
Dave Mankoff63a12822019-09-16 14:38:06 -0400164
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400165 @Test
166 public void testProximitySensorNotAvailablel() {
167 mProximitySensor.setSensorAvailable(false);
Ned Burns30d67702020-01-28 12:58:45 -0500168 mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_LONG_PRESS, 100, 100, null);
169 mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, 100, 100,
Beverlycc4a62f2019-09-26 14:55:28 -0400170 new float[]{1});
Ned Burns30d67702020-01-28 12:58:45 -0500171 mTriggers.onSensor(DozeLog.REASON_SENSOR_TAP, 100, 100, null);
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400172 }
173
Dave Mankoff63a12822019-09-16 14:38:06 -0400174 private void waitForSensorManager() {
175 TestableLooper.get(this).processAllMessages();
176 }
Geoffrey Pitscheefa3be2017-06-12 10:55:28 -0400177}