blob: 73aaeffd6044a4fd16c11a4d6d87e72f73b210f6 [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 Mankoffdddcae92020-05-13 12:46:18 -040044import com.android.systemui.util.concurrency.FakeExecutor;
Dave Mankoff63a12822019-09-16 14:38:06 -040045import com.android.systemui.util.sensors.AsyncSensorManager;
Dave Mankoffbf52f4b2019-09-20 14:34:28 -040046import com.android.systemui.util.sensors.FakeProximitySensor;
Dave Mankoff63a12822019-09-16 14:38:06 -040047import com.android.systemui.util.sensors.FakeSensorManager;
Dave Mankoffbf52f4b2019-09-20 14:34:28 -040048import com.android.systemui.util.sensors.ProximitySensor;
Dave Mankoffdddcae92020-05-13 12:46:18 -040049import com.android.systemui.util.time.FakeSystemClock;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070050import com.android.systemui.util.wakelock.WakeLock;
51import com.android.systemui.util.wakelock.WakeLockFake;
52
53import org.junit.Before;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070054import org.junit.Test;
Adrian Roos84a187f2017-04-28 14:10:51 -070055import org.junit.runner.RunWith;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070056import org.mockito.ArgumentCaptor;
57import org.mockito.Mock;
58import org.mockito.MockitoAnnotations;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070059
Adrian Roos84a187f2017-04-28 14:10:51 -070060@SmallTest
Jason Monk6dceace2018-05-15 20:24:07 -040061@RunWith(AndroidTestingRunner.class)
Lucas Dupin3174c662019-07-15 15:49:54 -070062@RunWithLooper(setAsMainLooper = true)
Jason Monk25a52b62017-05-23 10:42:59 -040063public class DozeTriggersTest extends SysuiTestCase {
Lucas Dupinedbe45b2019-10-14 15:43:03 -070064
65 @Mock
Adrian Roosd35d4ca2017-04-19 14:31:03 -070066 private DozeMachine mMachine;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070067 @Mock
68 private DozeHost mHost;
69 @Mock
70 private AlarmManager mAlarmManager;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000071 @Mock
72 private BroadcastDispatcher mBroadcastDispatcher;
Jerry Changae4dc4b2019-10-16 18:45:03 +080073 @Mock
74 private DockManager mDockManager;
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;
Dave Mankoffdddcae92020-05-13 12:46:18 -040079 private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
Adrian Roosd35d4ca2017-04-19 14:31:03 -070080
Adrian Roosd35d4ca2017-04-19 14:31:03 -070081 @Before
82 public void setUp() throws Exception {
Lucas Dupinedbe45b2019-10-14 15:43:03 -070083 MockitoAnnotations.initMocks(this);
Dave Mankoff63a12822019-09-16 14:38:06 -040084 AmbientDisplayConfiguration config = DozeConfigurationUtil.createMockConfig();
85 DozeParameters parameters = DozeConfigurationUtil.createMockParameters();
Lucas Dupin3174c662019-07-15 15:49:54 -070086 mSensors = spy(new FakeSensorManager(mContext));
87 mTapSensor = mSensors.getFakeTapSensor().getSensor();
Dave Mankoff63a12822019-09-16 14:38:06 -040088 WakeLock wakeLock = new WakeLockFake();
Dave Mankoff63a12822019-09-16 14:38:06 -040089 AsyncSensorManager asyncSensorManager =
90 new AsyncSensorManager(mSensors, null, new Handler());
Dave Mankoffd94c9692019-10-18 12:38:21 -040091 mProximitySensor = new FakeProximitySensor(getContext().getResources(), asyncSensorManager);
Adrian Roosd35d4ca2017-04-19 14:31:03 -070092
Lucas Dupinedbe45b2019-10-14 15:43:03 -070093 mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager, config, parameters,
Dave Mankoffdddcae92020-05-13 12:46:18 -040094 asyncSensorManager, mFakeExecutor, wakeLock, true,
Jerry Changae4dc4b2019-10-16 18:45:03 +080095 mDockManager, mProximitySensor, mock(DozeLog.class), mBroadcastDispatcher);
Dave Mankoff63a12822019-09-16 14:38:06 -040096 waitForSensorManager();
Adrian Roosd35d4ca2017-04-19 14:31:03 -070097 }
98
99 @Test
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700100 public void testOnNotification_stillWorksAfterOneFailedProxCheck() throws Exception {
101 when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700102 ArgumentCaptor<DozeHost.Callback> captor = ArgumentCaptor.forClass(DozeHost.Callback.class);
103 doAnswer(invocation -> null).when(mHost).addCallback(captor.capture());
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700104
Jason Monk6dceace2018-05-15 20:24:07 -0400105 mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED);
106 mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
Lucas Dupin3174c662019-07-15 15:49:54 -0700107 clearInvocations(mMachine);
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700108
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400109 mProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(true, 1));
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700110 captor.getValue().onNotificationAlerted(null /* pulseSuppressedListener */);
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400111 mProximitySensor.alertListeners();
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700112
113 verify(mMachine, never()).requestState(any());
Adrian Roos84a187f2017-04-28 14:10:51 -0700114 verify(mMachine, never()).requestPulse(anyInt());
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700115
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400116 mProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(false, 2));
Dave Mankoffdddcae92020-05-13 12:46:18 -0400117 captor.getValue().onNotificationAlerted(null /* pulseSuppressedListener */);
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400118 mProximitySensor.alertListeners();
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700119
Adrian Roosd7b9d102017-04-28 15:42:58 -0700120 verify(mMachine).requestPulse(anyInt());
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700121 }
122
lpeter8a5f4702019-01-18 16:53:07 +0800123 @Test
Lucas Dupin3174c662019-07-15 15:49:54 -0700124 public void testTransitionTo_disablesAndEnablesTouchSensors() {
125 when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
126
127 mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
Dave Mankoff63a12822019-09-16 14:38:06 -0400128 waitForSensorManager();
Lucas Dupin3174c662019-07-15 15:49:54 -0700129 verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
130
131 clearInvocations(mSensors);
132 mTriggers.transitionTo(DozeMachine.State.DOZE,
133 DozeMachine.State.DOZE_REQUEST_PULSE);
134 mTriggers.transitionTo(DozeMachine.State.DOZE_REQUEST_PULSE,
135 DozeMachine.State.DOZE_PULSING);
Dave Mankoff63a12822019-09-16 14:38:06 -0400136 waitForSensorManager();
Lucas Dupin3174c662019-07-15 15:49:54 -0700137 verify(mSensors).cancelTriggerSensor(any(), eq(mTapSensor));
138
139 clearInvocations(mSensors);
140 mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE);
Dave Mankoff63a12822019-09-16 14:38:06 -0400141 waitForSensorManager();
Lucas Dupin3174c662019-07-15 15:49:54 -0700142 verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
143 }
144
145 @Test
Jerry Changae4dc4b2019-10-16 18:45:03 +0800146 public void transitionToDockedAod_disablesTouchSensors() {
147 mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
148 waitForSensorManager();
149 verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
150
151 mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.DOZE_AOD_DOCKED);
152 waitForSensorManager();
153
154 verify(mSensors).cancelTriggerSensor(any(), eq(mTapSensor));
155 }
156
157 @Test
lpeter8a5f4702019-01-18 16:53:07 +0800158 public void testDockEventListener_registerAndUnregister() {
159 mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED);
Jerry Changae4dc4b2019-10-16 18:45:03 +0800160 verify(mDockManager).addListener(any());
lpeter8a5f4702019-01-18 16:53:07 +0800161
162 mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.FINISH);
Jerry Changae4dc4b2019-10-16 18:45:03 +0800163 verify(mDockManager).removeListener(any());
lpeter8a5f4702019-01-18 16:53:07 +0800164 }
Dave Mankoff63a12822019-09-16 14:38:06 -0400165
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400166 @Test
167 public void testProximitySensorNotAvailablel() {
168 mProximitySensor.setSensorAvailable(false);
Ned Burns30d67702020-01-28 12:58:45 -0500169 mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_LONG_PRESS, 100, 100, null);
170 mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, 100, 100,
Beverlycc4a62f2019-09-26 14:55:28 -0400171 new float[]{1});
Ned Burns30d67702020-01-28 12:58:45 -0500172 mTriggers.onSensor(DozeLog.REASON_SENSOR_TAP, 100, 100, null);
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400173 }
174
Dave Mankoff63a12822019-09-16 14:38:06 -0400175 private void waitForSensorManager() {
176 TestableLooper.get(this).processAllMessages();
177 }
Geoffrey Pitscheefa3be2017-06-12 10:55:28 -0400178}