blob: debc9d6430e07760f5c0cb3293388694ed95e749 [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;
34import android.os.Looper;
Jason Monk6dceace2018-05-15 20:24:07 -040035import android.testing.AndroidTestingRunner;
Dave Mankoff63a12822019-09-16 14:38:06 -040036import android.testing.TestableLooper;
Jason Monk6dceace2018-05-15 20:24:07 -040037import android.testing.TestableLooper.RunWithLooper;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070038
Brett Chabot84151d92019-02-27 15:37:59 -080039import androidx.test.filters.SmallTest;
40
Jason Monk25a52b62017-05-23 10:42:59 -040041import com.android.systemui.SysuiTestCase;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000042import com.android.systemui.broadcast.BroadcastDispatcher;
Lucas Dupin3174c662019-07-15 15:49:54 -070043import com.android.systemui.dock.DockManager;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070044import com.android.systemui.statusbar.phone.DozeParameters;
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;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070049import com.android.systemui.util.wakelock.WakeLock;
50import com.android.systemui.util.wakelock.WakeLockFake;
51
52import org.junit.Before;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070053import org.junit.Test;
Adrian Roos84a187f2017-04-28 14:10:51 -070054import org.junit.runner.RunWith;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070055import org.mockito.ArgumentCaptor;
56import org.mockito.Mock;
57import org.mockito.MockitoAnnotations;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070058
Adrian Roos84a187f2017-04-28 14:10:51 -070059@SmallTest
Jason Monk6dceace2018-05-15 20:24:07 -040060@RunWith(AndroidTestingRunner.class)
Lucas Dupin3174c662019-07-15 15:49:54 -070061@RunWithLooper(setAsMainLooper = true)
Jason Monk25a52b62017-05-23 10:42:59 -040062public class DozeTriggersTest extends SysuiTestCase {
Lucas Dupinedbe45b2019-10-14 15:43:03 -070063
64 @Mock
Adrian Roosd35d4ca2017-04-19 14:31:03 -070065 private DozeMachine mMachine;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070066 @Mock
67 private DozeHost mHost;
68 @Mock
69 private AlarmManager mAlarmManager;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000070 @Mock
71 private BroadcastDispatcher mBroadcastDispatcher;
Jerry Changae4dc4b2019-10-16 18:45:03 +080072 @Mock
73 private DockManager mDockManager;
Lucas Dupinedbe45b2019-10-14 15:43:03 -070074 private DozeTriggers mTriggers;
Adrian Roos84a187f2017-04-28 14:10:51 -070075 private FakeSensorManager mSensors;
Lucas Dupin3174c662019-07-15 15:49:54 -070076 private Sensor mTapSensor;
Dave Mankoffbf52f4b2019-09-20 14:34:28 -040077 private FakeProximitySensor mProximitySensor;
Adrian Roosd35d4ca2017-04-19 14:31:03 -070078
Adrian Roosd35d4ca2017-04-19 14:31:03 -070079 @Before
80 public void setUp() throws Exception {
Lucas Dupinedbe45b2019-10-14 15:43:03 -070081 MockitoAnnotations.initMocks(this);
Dave Mankoff63a12822019-09-16 14:38:06 -040082 AmbientDisplayConfiguration config = DozeConfigurationUtil.createMockConfig();
83 DozeParameters parameters = DozeConfigurationUtil.createMockParameters();
Lucas Dupin3174c662019-07-15 15:49:54 -070084 mSensors = spy(new FakeSensorManager(mContext));
85 mTapSensor = mSensors.getFakeTapSensor().getSensor();
Dave Mankoff63a12822019-09-16 14:38:06 -040086 WakeLock wakeLock = new WakeLockFake();
Dave Mankoff63a12822019-09-16 14:38:06 -040087 AsyncSensorManager asyncSensorManager =
88 new AsyncSensorManager(mSensors, null, new Handler());
Dave Mankoffd94c9692019-10-18 12:38:21 -040089 mProximitySensor = new FakeProximitySensor(getContext().getResources(), asyncSensorManager);
Adrian Roosd35d4ca2017-04-19 14:31:03 -070090
Lucas Dupinedbe45b2019-10-14 15:43:03 -070091 mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager, config, parameters,
Dave Mankoff63a12822019-09-16 14:38:06 -040092 asyncSensorManager, Handler.createAsync(Looper.myLooper()), wakeLock, true,
Jerry Changae4dc4b2019-10-16 18:45:03 +080093 mDockManager, mProximitySensor, mock(DozeLog.class), mBroadcastDispatcher);
Dave Mankoff63a12822019-09-16 14:38:06 -040094 waitForSensorManager();
Adrian Roosd35d4ca2017-04-19 14:31:03 -070095 }
96
97 @Test
Adrian Roosd35d4ca2017-04-19 14:31:03 -070098 public void testOnNotification_stillWorksAfterOneFailedProxCheck() throws Exception {
99 when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700100 ArgumentCaptor<DozeHost.Callback> captor = ArgumentCaptor.forClass(DozeHost.Callback.class);
101 doAnswer(invocation -> null).when(mHost).addCallback(captor.capture());
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700102
Jason Monk6dceace2018-05-15 20:24:07 -0400103 mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED);
104 mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
Lucas Dupin3174c662019-07-15 15:49:54 -0700105 clearInvocations(mMachine);
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700106
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400107 mProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(true, 1));
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700108 captor.getValue().onNotificationAlerted(null /* pulseSuppressedListener */);
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400109 mProximitySensor.alertListeners();
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700110
111 verify(mMachine, never()).requestState(any());
Adrian Roos84a187f2017-04-28 14:10:51 -0700112 verify(mMachine, never()).requestPulse(anyInt());
Adrian Roosd35d4ca2017-04-19 14:31:03 -0700113
Lucas Dupinedbe45b2019-10-14 15:43:03 -0700114 captor.getValue().onNotificationAlerted(null /* pulseSuppressedListener */);
Dave Mankoff63a12822019-09-16 14:38:06 -0400115 waitForSensorManager();
Dave Mankoffbf52f4b2019-09-20 14:34:28 -0400116 mProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(false, 2));
117 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}