blob: 37b315fec26e0194b5cd672972bfd7c88029ff73 [file] [log] [blame]
Dave Mankoff63a12822019-09-16 14:38:06 -04001/*
2 * Copyright (C) 2019 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.util.sensors;
18
19import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertFalse;
21import static org.junit.Assert.assertNull;
22import static org.junit.Assert.assertTrue;
23
24import android.os.Handler;
25import android.testing.AndroidTestingRunner;
26import android.testing.TestableLooper;
27
28import androidx.test.filters.SmallTest;
29
30import com.android.systemui.SysuiTestCase;
31
32import org.junit.Before;
33import org.junit.Test;
34import org.junit.runner.RunWith;
35
36@SmallTest
37@RunWith(AndroidTestingRunner.class)
38@TestableLooper.RunWithLooper
39public class ProximitySensorTest extends SysuiTestCase {
40
41 private ProximitySensor mProximitySensor;
42 private FakeSensorManager.FakeProximitySensor mFakeProximitySensor;
43
44 @Before
45 public void setUp() throws Exception {
46 FakeSensorManager sensorManager = new FakeSensorManager(getContext());
47 AsyncSensorManager asyncSensorManager = new AsyncSensorManager(
48 sensorManager, null, new Handler());
49 mFakeProximitySensor = sensorManager.getFakeProximitySensor();
Dave Mankoffd94c9692019-10-18 12:38:21 -040050 mProximitySensor = new ProximitySensor(getContext().getResources(), asyncSensorManager);
Dave Mankoff63a12822019-09-16 14:38:06 -040051 }
52
53 @Test
54 public void testSingleListener() {
55 TestableListener listener = new TestableListener();
56
57 assertFalse(mProximitySensor.isRegistered());
58 mProximitySensor.register(listener);
59 waitForSensorManager();
60 assertTrue(mProximitySensor.isRegistered());
61 assertNull(listener.mLastEvent);
62
63 mFakeProximitySensor.sendProximityResult(true);
64 assertFalse(listener.mLastEvent.getNear());
65 assertEquals(listener.mCallCount, 1);
66 mFakeProximitySensor.sendProximityResult(false);
67 assertTrue(listener.mLastEvent.getNear());
68 assertEquals(listener.mCallCount, 2);
69
70 mProximitySensor.unregister(listener);
71 waitForSensorManager();
72 }
73
74 @Test
75 public void testMultiListener() {
76 TestableListener listenerA = new TestableListener();
77 TestableListener listenerB = new TestableListener();
78
79 assertFalse(mProximitySensor.isRegistered());
80
81 mProximitySensor.register(listenerA);
82 waitForSensorManager();
83 assertTrue(mProximitySensor.isRegistered());
84 mProximitySensor.register(listenerB);
85 waitForSensorManager();
86 assertTrue(mProximitySensor.isRegistered());
87 assertNull(listenerA.mLastEvent);
88 assertNull(listenerB.mLastEvent);
89
90 mFakeProximitySensor.sendProximityResult(true);
91 assertFalse(listenerA.mLastEvent.getNear());
92 assertFalse(listenerB.mLastEvent.getNear());
93 assertEquals(listenerA.mCallCount, 1);
94 assertEquals(listenerB.mCallCount, 1);
95 mFakeProximitySensor.sendProximityResult(false);
96 assertTrue(listenerA.mLastEvent.getNear());
97 assertTrue(listenerB.mLastEvent.getNear());
98 assertEquals(listenerA.mCallCount, 2);
99 assertEquals(listenerB.mCallCount, 2);
100
101 mProximitySensor.unregister(listenerA);
102 mProximitySensor.unregister(listenerB);
103 waitForSensorManager();
104 }
105
106 @Test
107 public void testUnregister() {
108 TestableListener listener = new TestableListener();
109
110 assertFalse(mProximitySensor.isRegistered());
111 mProximitySensor.register(listener);
112 waitForSensorManager();
113 assertTrue(mProximitySensor.isRegistered());
114 assertNull(listener.mLastEvent);
115
116 mFakeProximitySensor.sendProximityResult(true);
117 assertFalse(listener.mLastEvent.getNear());
118 assertEquals(listener.mCallCount, 1);
119
120 mProximitySensor.unregister(listener);
121 waitForSensorManager();
122 assertFalse(mProximitySensor.isRegistered());
123 }
124
125 @Test
126 public void testPauseAndResume() {
127 TestableListener listener = new TestableListener();
128
129 assertFalse(mProximitySensor.isRegistered());
130 mProximitySensor.register(listener);
131 waitForSensorManager();
132 assertTrue(mProximitySensor.isRegistered());
133 assertNull(listener.mLastEvent);
134
135 mFakeProximitySensor.sendProximityResult(true);
136 assertFalse(listener.mLastEvent.getNear());
137 assertEquals(listener.mCallCount, 1);
138
139 mProximitySensor.pause();
140 waitForSensorManager();
141 assertFalse(mProximitySensor.isRegistered());
142
143 // More events do nothing when paused.
144 mFakeProximitySensor.sendProximityResult(true);
145 assertFalse(listener.mLastEvent.getNear());
146 assertEquals(listener.mCallCount, 1);
147 mFakeProximitySensor.sendProximityResult(false);
148 assertFalse(listener.mLastEvent.getNear());
149 assertEquals(listener.mCallCount, 1);
150
151 mProximitySensor.resume();
152 waitForSensorManager();
153 assertTrue(mProximitySensor.isRegistered());
154 // Still matches our previous call
155 assertFalse(listener.mLastEvent.getNear());
156 assertEquals(listener.mCallCount, 1);
157
158 mFakeProximitySensor.sendProximityResult(true);
159 assertFalse(listener.mLastEvent.getNear());
160 assertEquals(listener.mCallCount, 2);
161
162 mProximitySensor.unregister(listener);
163 waitForSensorManager();
164 assertFalse(mProximitySensor.isRegistered());
165 }
166
Dave Mankoff63a12822019-09-16 14:38:06 -0400167 @Test
168 public void testAlertListeners() {
169 TestableListener listenerA = new TestableListener();
170 TestableListener listenerB = new TestableListener();
171
172 assertFalse(mProximitySensor.isRegistered());
173
174 mProximitySensor.register(listenerA);
175 mProximitySensor.register(listenerB);
176 waitForSensorManager();
177 assertTrue(mProximitySensor.isRegistered());
178 assertNull(listenerA.mLastEvent);
179 assertNull(listenerB.mLastEvent);
180
181 mProximitySensor.alertListeners();
182 assertNull(listenerA.mLastEvent);
183 assertEquals(listenerA.mCallCount, 1);
184 assertNull(listenerB.mLastEvent);
185 assertEquals(listenerB.mCallCount, 1);
186
187 mFakeProximitySensor.sendProximityResult(false);
188 assertTrue(listenerA.mLastEvent.getNear());
189 assertEquals(listenerA.mCallCount, 2);
190 assertTrue(listenerB.mLastEvent.getNear());
191 assertEquals(listenerB.mCallCount, 2);
192
193 mProximitySensor.unregister(listenerA);
194 mProximitySensor.unregister(listenerB);
195 waitForSensorManager();
196 }
197
198 class TestableListener implements ProximitySensor.ProximitySensorListener {
199 ProximitySensor.ProximityEvent mLastEvent;
200 int mCallCount = 0;
201
202 @Override
203 public void onSensorEvent(ProximitySensor.ProximityEvent proximityEvent) {
204 mLastEvent = proximityEvent;
205 mCallCount++;
206 }
207
208 void reset() {
209 mLastEvent = null;
210 mCallCount = 0;
211 }
212 };
213
214 private void waitForSensorManager() {
215 TestableLooper.get(this).processAllMessages();
216 }
217
218}