blob: 9c1f3f5f63316ebf5b44525e5cbf301978541f69 [file] [log] [blame]
Juan Langacf62e62017-04-18 16:35:39 -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.server;
18
19import static org.junit.Assert.assertFalse;
20import static org.junit.Assert.assertTrue;
21import static org.mockito.Matchers.anyInt;
Juan Lang36f46242017-04-19 11:58:28 -070022import static org.mockito.Matchers.eq;
23import static org.mockito.Mockito.never;
Juan Langacf62e62017-04-18 16:35:39 -070024import static org.mockito.Mockito.verify;
25import static org.mockito.Mockito.when;
26
27import android.app.StatusBarManager;
28import android.content.Context;
29import android.content.res.Resources;
30import android.os.Looper;
31import android.os.UserHandle;
32import android.platform.test.annotations.Presubmit;
33import android.provider.Settings;
34import android.support.test.InstrumentationRegistry;
35import android.support.test.filters.SmallTest;
36import android.support.test.runner.AndroidJUnit4;
37import android.test.mock.MockContentResolver;
38import android.view.KeyEvent;
39import android.util.MutableBoolean;
40
Juan Lang36f46242017-04-19 11:58:28 -070041import com.android.internal.logging.MetricsLogger;
42import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Juan Langacf62e62017-04-18 16:35:39 -070043import com.android.internal.util.test.FakeSettingsProvider;
44import com.android.server.LocalServices;
45import com.android.server.statusbar.StatusBarManagerInternal;
46
47import org.junit.Before;
48import org.junit.BeforeClass;
49import org.junit.Test;
50import org.junit.runner.RunWith;
51import org.junit.runners.JUnit4;
52import org.mockito.Mock;
53import org.mockito.MockitoAnnotations;
54
55/**
56 * Unit tests for {@link GestureLauncherService}.
57 * runtest frameworks-services -c com.android.server.GestureLauncherServiceTest
58 */
59@Presubmit
60@SmallTest
61@RunWith(AndroidJUnit4.class)
62public class GestureLauncherServiceTest {
63
64 private static final int FAKE_USER_ID = 1337;
65 private static final int FAKE_SOURCE = 1982;
66 private static final long INITIAL_EVENT_TIME_MILLIS = 20000L;
67 private static final long IGNORED_DOWN_TIME = 1234L;
68 private static final int IGNORED_ACTION = 13;
69 private static final int IGNORED_CODE = 1999;
70 private static final int IGNORED_REPEAT = 42;
71
72 private @Mock Context mContext;
73 private @Mock Resources mResources;
74 private @Mock StatusBarManagerInternal mStatusBarManagerInternal;
Juan Lang36f46242017-04-19 11:58:28 -070075 private @Mock MetricsLogger mMetricsLogger;
Juan Langacf62e62017-04-18 16:35:39 -070076 private MockContentResolver mContentResolver;
77 private GestureLauncherService mGestureLauncherService;
78
79 @BeforeClass
80 public static void oneTimeInitialization() {
81 if (Looper.myLooper() == null) {
82 Looper.prepare();
83 }
84 }
85
86 @Before
87 public void setup() {
88 MockitoAnnotations.initMocks(this);
89
90 LocalServices.removeServiceForTest(StatusBarManagerInternal.class);
91 LocalServices.addService(StatusBarManagerInternal.class, mStatusBarManagerInternal);
92
93 final Context originalContext = InstrumentationRegistry.getContext();
94 when(mContext.getApplicationInfo()).thenReturn(originalContext.getApplicationInfo());
95 when(mContext.getResources()).thenReturn(mResources);
96 mContentResolver = new MockContentResolver(mContext);
97 mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
98 when(mContext.getContentResolver()).thenReturn(mContentResolver);
99
Juan Lang36f46242017-04-19 11:58:28 -0700100 mGestureLauncherService = new GestureLauncherService(mContext, mMetricsLogger);
Juan Langacf62e62017-04-18 16:35:39 -0700101 }
102
103 @Test
104 public void testIsCameraDoubleTapPowerEnabled_configFalse() {
105 withCameraDoubleTapPowerEnableConfigValue(false);
106 assertFalse(mGestureLauncherService.isCameraDoubleTapPowerEnabled(mResources));
107 }
108
109 @Test
110 public void testIsCameraDoubleTapPowerEnabled_configTrue() {
111 withCameraDoubleTapPowerEnableConfigValue(true);
112 assertTrue(mGestureLauncherService.isCameraDoubleTapPowerEnabled(mResources));
113 }
114
115 @Test
116 public void testIsCameraDoubleTapPowerSettingEnabled_configFalseSettingDisabled() {
117 withCameraDoubleTapPowerEnableConfigValue(false);
118 withCameraDoubleTapPowerDisableSettingValue(1);
119 assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
120 mContext, FAKE_USER_ID));
121 }
122
123 @Test
124 public void testIsCameraDoubleTapPowerSettingEnabled_configFalseSettingEnabled() {
125 withCameraDoubleTapPowerEnableConfigValue(false);
126 withCameraDoubleTapPowerDisableSettingValue(0);
127 assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
128 mContext, FAKE_USER_ID));
129 }
130
131 @Test
132 public void testIsCameraDoubleTapPowerSettingEnabled_configTrueSettingDisabled() {
133 withCameraDoubleTapPowerEnableConfigValue(true);
134 withCameraDoubleTapPowerDisableSettingValue(1);
135 assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
136 mContext, FAKE_USER_ID));
137 }
138
139 @Test
140 public void testIsCameraDoubleTapPowerSettingEnabled_configTrueSettingEnabled() {
141 withCameraDoubleTapPowerEnableConfigValue(true);
142 withCameraDoubleTapPowerDisableSettingValue(0);
143 assertTrue(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
144 mContext, FAKE_USER_ID));
145 }
146
147 @Test
148 public void testHandleCameraLaunchGesture_userSetupComplete() {
149 withUserSetupCompleteValue(true);
150
151 boolean useWakeLock = false;
152 assertTrue(mGestureLauncherService.handleCameraLaunchGesture(useWakeLock, FAKE_SOURCE));
153 verify(mStatusBarManagerInternal).onCameraLaunchGestureDetected(FAKE_SOURCE);
154 }
155
156 @Test
157 public void testHandleCameraLaunchGesture_userSetupNotComplete() {
158 withUserSetupCompleteValue(false);
159
160 boolean useWakeLock = false;
161 assertFalse(mGestureLauncherService.handleCameraLaunchGesture(useWakeLock, FAKE_SOURCE));
162 }
163
164 @Test
165 public void testInterceptPowerKeyDown_firstPowerDownCameraPowerGestureOnInteractive() {
166 withCameraDoubleTapPowerEnableConfigValue(true);
167 withCameraDoubleTapPowerDisableSettingValue(0);
168 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
169
170 long eventTime = INITIAL_EVENT_TIME_MILLIS +
171 GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
172 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
173 IGNORED_REPEAT);
174 boolean interactive = true;
175 MutableBoolean outLaunched = new MutableBoolean(true);
176 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
177 outLaunched);
178 assertFalse(intercepted);
179 assertFalse(outLaunched.value);
180 }
181
182 @Test
183 public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOffInteractive() {
184 withCameraDoubleTapPowerEnableConfigValue(false);
185 withCameraDoubleTapPowerDisableSettingValue(1);
186 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
187
188 long eventTime = INITIAL_EVENT_TIME_MILLIS;
189 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
190 IGNORED_REPEAT);
191 boolean interactive = true;
192 MutableBoolean outLaunched = new MutableBoolean(true);
193 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
194 outLaunched);
195 assertFalse(intercepted);
196 assertFalse(outLaunched.value);
197
Juan Lang36f46242017-04-19 11:58:28 -0700198 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
199 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700200 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
201 IGNORED_REPEAT);
202 outLaunched.value = true;
203 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
204 outLaunched);
205 assertFalse(intercepted);
206 assertFalse(outLaunched.value);
Juan Lang36f46242017-04-19 11:58:28 -0700207 verify(mMetricsLogger, never())
208 .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
209 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700210 }
211
212 @Test
213 public void testInterceptPowerKeyDown_intervalOutOfBoundsCameraPowerGestureOffInteractive() {
214 withCameraDoubleTapPowerEnableConfigValue(false);
215 withCameraDoubleTapPowerDisableSettingValue(1);
216 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
217
218 long eventTime = INITIAL_EVENT_TIME_MILLIS;
219 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
220 IGNORED_REPEAT);
221 boolean interactive = true;
222 MutableBoolean outLaunched = new MutableBoolean(true);
223 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
224 outLaunched);
225 assertFalse(intercepted);
226 assertFalse(outLaunched.value);
227
Juan Lang36f46242017-04-19 11:58:28 -0700228 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
229 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700230 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
231 IGNORED_REPEAT);
232 outLaunched.value = true;
233 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
234 outLaunched);
235 assertFalse(intercepted);
236 assertFalse(outLaunched.value);
Juan Lang36f46242017-04-19 11:58:28 -0700237 verify(mMetricsLogger, never())
238 .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
239 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700240 }
241
242 @Test
243 public void
244 testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupComplete() {
245 withCameraDoubleTapPowerEnableConfigValue(true);
246 withCameraDoubleTapPowerDisableSettingValue(0);
247 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
248 withUserSetupCompleteValue(true);
249
250 long eventTime = INITIAL_EVENT_TIME_MILLIS;
251 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
252 IGNORED_REPEAT);
253 boolean interactive = true;
254 MutableBoolean outLaunched = new MutableBoolean(true);
255 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
256 outLaunched);
257 assertFalse(intercepted);
258 assertFalse(outLaunched.value);
259
Juan Lang36f46242017-04-19 11:58:28 -0700260 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
261 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700262 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
263 IGNORED_REPEAT);
264 outLaunched.value = false;
265 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
266 outLaunched);
267 assertTrue(intercepted);
268 assertTrue(outLaunched.value);
269 verify(mStatusBarManagerInternal).onCameraLaunchGestureDetected(
270 StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP);
Juan Lang36f46242017-04-19 11:58:28 -0700271 verify(mMetricsLogger)
272 .action(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE, (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700273 }
274
275 @Test
276 public void
277 testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupIncomplete() {
278 withCameraDoubleTapPowerEnableConfigValue(true);
279 withCameraDoubleTapPowerDisableSettingValue(0);
280 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
281 withUserSetupCompleteValue(false);
282
283 long eventTime = INITIAL_EVENT_TIME_MILLIS;
284 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
285 IGNORED_REPEAT);
286 boolean interactive = true;
287 MutableBoolean outLaunched = new MutableBoolean(true);
288 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
289 outLaunched);
290 assertFalse(intercepted);
291 assertFalse(outLaunched.value);
292
Juan Lang36f46242017-04-19 11:58:28 -0700293 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
294 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700295 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
296 IGNORED_REPEAT);
297 outLaunched.value = true;
298 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
299 outLaunched);
300 assertFalse(intercepted);
301 assertFalse(outLaunched.value);
Juan Lang36f46242017-04-19 11:58:28 -0700302 verify(mMetricsLogger, never())
303 .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
304 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700305 }
306
307 @Test
308 public void testInterceptPowerKeyDown_intervalOutOfBoundsCameraPowerGestureOnInteractive() {
309 withCameraDoubleTapPowerEnableConfigValue(true);
310 withCameraDoubleTapPowerDisableSettingValue(0);
311 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
312
313 long eventTime = INITIAL_EVENT_TIME_MILLIS;
314 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
315 IGNORED_REPEAT);
316 boolean interactive = true;
317 MutableBoolean outLaunched = new MutableBoolean(true);
318 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
319 outLaunched);
320 assertFalse(intercepted);
321 assertFalse(outLaunched.value);
322
Juan Lang36f46242017-04-19 11:58:28 -0700323 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
324 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700325 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
326 IGNORED_REPEAT);
327 outLaunched.value = true;
328 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
329 outLaunched);
330 assertFalse(intercepted);
331 assertFalse(outLaunched.value);
Juan Lang36f46242017-04-19 11:58:28 -0700332 verify(mMetricsLogger, never())
333 .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
334 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700335 }
336
337 @Test
338 public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOffNotInteractive() {
339 withCameraDoubleTapPowerEnableConfigValue(false);
340 withCameraDoubleTapPowerDisableSettingValue(1);
341 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
342
343 long eventTime = INITIAL_EVENT_TIME_MILLIS;
344 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
345 IGNORED_REPEAT);
346 boolean interactive = false;
347 MutableBoolean outLaunched = new MutableBoolean(true);
348 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
349 outLaunched);
350 assertFalse(intercepted);
351 assertFalse(outLaunched.value);
352
Juan Lang36f46242017-04-19 11:58:28 -0700353 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
354 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700355 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
356 IGNORED_REPEAT);
357 outLaunched.value = true;
358 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
359 outLaunched);
360 assertFalse(intercepted);
361 assertFalse(outLaunched.value);
Juan Lang36f46242017-04-19 11:58:28 -0700362 verify(mMetricsLogger, never())
363 .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
364 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700365 }
366
367 @Test
368 public void testInterceptPowerKeyDown_intervalOutOfBoundsCameraPowerGestureOffNotInteractive() {
369 withCameraDoubleTapPowerEnableConfigValue(false);
370 withCameraDoubleTapPowerDisableSettingValue(1);
371 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
372
373 long eventTime = INITIAL_EVENT_TIME_MILLIS;
374 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
375 IGNORED_REPEAT);
376 boolean interactive = false;
377 MutableBoolean outLaunched = new MutableBoolean(true);
378 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
379 outLaunched);
380 assertFalse(intercepted);
381 assertFalse(outLaunched.value);
382
Juan Lang36f46242017-04-19 11:58:28 -0700383 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
384 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700385 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
386 IGNORED_REPEAT);
387 outLaunched.value = true;
388 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
389 outLaunched);
390 assertFalse(intercepted);
391 assertFalse(outLaunched.value);
Juan Lang36f46242017-04-19 11:58:28 -0700392 verify(mMetricsLogger, never())
393 .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
394 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700395 }
396
397 @Test
398 public void
399 testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnNotInteractiveSetupComplete() {
400 withCameraDoubleTapPowerEnableConfigValue(true);
401 withCameraDoubleTapPowerDisableSettingValue(0);
402 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
403 withUserSetupCompleteValue(true);
404
405 long eventTime = INITIAL_EVENT_TIME_MILLIS;
406 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
407 IGNORED_REPEAT);
408 boolean interactive = false;
409 MutableBoolean outLaunched = new MutableBoolean(true);
410 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
411 outLaunched);
412 assertFalse(intercepted);
413 assertFalse(outLaunched.value);
414
Juan Lang36f46242017-04-19 11:58:28 -0700415 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
416 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700417 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
418 IGNORED_REPEAT);
419 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
420 outLaunched);
421 assertFalse(intercepted);
422 assertTrue(outLaunched.value);
423 verify(mStatusBarManagerInternal).onCameraLaunchGestureDetected(
424 StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP);
Juan Lang36f46242017-04-19 11:58:28 -0700425 verify(mMetricsLogger)
426 .action(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE, (int) interval);
427 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700428 }
429
430 @Test
431 public void
432 testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnNotInteractiveSetupIncomplete() {
433 withCameraDoubleTapPowerEnableConfigValue(true);
434 withCameraDoubleTapPowerDisableSettingValue(0);
435 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
436 withUserSetupCompleteValue(false);
437
438 long eventTime = INITIAL_EVENT_TIME_MILLIS;
439 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
440 IGNORED_REPEAT);
441 boolean interactive = false;
442 MutableBoolean outLaunched = new MutableBoolean(true);
443 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
444 outLaunched);
445 assertFalse(intercepted);
446 assertFalse(outLaunched.value);
447
Juan Lang36f46242017-04-19 11:58:28 -0700448 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
449 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700450 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
451 IGNORED_REPEAT);
452 outLaunched.value = true;
453 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
454 outLaunched);
455 assertFalse(intercepted);
456 assertFalse(outLaunched.value);
Juan Lang36f46242017-04-19 11:58:28 -0700457 verify(mMetricsLogger, never())
458 .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
459 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700460 }
461
462 @Test
463 public void testInterceptPowerKeyDown_intervalOutOfBoundsCameraPowerGestureOnNotInteractive() {
464 withCameraDoubleTapPowerEnableConfigValue(true);
465 withCameraDoubleTapPowerDisableSettingValue(0);
466 mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
467
468 long eventTime = INITIAL_EVENT_TIME_MILLIS;
469 KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
470 IGNORED_REPEAT);
471 boolean interactive = false;
472 MutableBoolean outLaunched = new MutableBoolean(true);
473 boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
474 outLaunched);
475 assertFalse(intercepted);
476 assertFalse(outLaunched.value);
477
Juan Lang36f46242017-04-19 11:58:28 -0700478 final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
479 eventTime += interval;
Juan Langacf62e62017-04-18 16:35:39 -0700480 keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
481 IGNORED_REPEAT);
482 outLaunched.value = true;
483 intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive,
484 outLaunched);
485 assertFalse(intercepted);
486 assertFalse(outLaunched.value);
Juan Lang36f46242017-04-19 11:58:28 -0700487 verify(mMetricsLogger, never())
488 .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
489 verify(mMetricsLogger).histogram("power_double_tap_interval", (int) interval);
Juan Langacf62e62017-04-18 16:35:39 -0700490 }
491
492 private void withCameraDoubleTapPowerEnableConfigValue(boolean enableConfigValue) {
493 when(mResources.getBoolean(
494 com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled))
495 .thenReturn(enableConfigValue);
496 }
497
498 private void withCameraDoubleTapPowerDisableSettingValue(int disableSettingValue) {
499 Settings.Secure.putIntForUser(
500 mContentResolver,
501 Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED,
502 disableSettingValue,
503 UserHandle.USER_CURRENT);
504 }
505
506 private void withUserSetupCompleteValue(boolean userSetupComplete) {
507 int userSetupCompleteValue = userSetupComplete ? 1 : 0;
508 Settings.Secure.putIntForUser(
509 mContentResolver,
510 Settings.Secure.USER_SETUP_COMPLETE,
511 userSetupCompleteValue,
512 UserHandle.USER_CURRENT);
513 }
514}