Loading services/core/java/com/android/server/GestureLauncherService.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -356,6 +356,12 @@ public class GestureLauncherService extends SystemService { public boolean interceptPowerKeyDown(KeyEvent event, boolean interactive, public boolean interceptPowerKeyDown(KeyEvent event, boolean interactive, MutableBoolean outLaunched) { MutableBoolean outLaunched) { if (event.isLongPress()) { // Long presses are sent as a second key down. If the long press threshold is set lower // than the double tap of sequence interval thresholds, this could cause false double // taps or consecutive taps, so we want to ignore the long press event. return false; } boolean launched = false; boolean launched = false; boolean intercept = false; boolean intercept = false; long powerTapInterval; long powerTapInterval; Loading services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java +47 −0 Original line number Original line Diff line number Diff line Loading @@ -73,6 +73,9 @@ public class GestureLauncherServiceTest { private static final int IGNORED_ACTION = 13; private static final int IGNORED_ACTION = 13; private static final int IGNORED_CODE = 1999; private static final int IGNORED_CODE = 1999; private static final int IGNORED_REPEAT = 42; private static final int IGNORED_REPEAT = 42; private static final int IGNORED_META_STATE = 0; private static final int IGNORED_DEVICE_ID = 0; private static final int IGNORED_SCANCODE = 0; private @Mock Context mContext; private @Mock Context mContext; private @Mock Resources mResources; private @Mock Resources mResources; Loading Loading @@ -368,6 +371,50 @@ public class GestureLauncherServiceTest { assertEquals(2, tapCounts.get(1).intValue()); assertEquals(2, tapCounts.get(1).intValue()); } } @Test public void testInterceptPowerKeyDown_longpress() { withCameraDoubleTapPowerEnableConfigValue(true); withCameraDoubleTapPowerDisableSettingValue(0); mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); withUserSetupCompleteValue(true); long eventTime = INITIAL_EVENT_TIME_MILLIS; KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); boolean interactive = true; MutableBoolean outLaunched = new MutableBoolean(true); boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive, outLaunched); assertFalse(intercepted); assertFalse(outLaunched.value); final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT, IGNORED_META_STATE, IGNORED_DEVICE_ID, IGNORED_SCANCODE, KeyEvent.FLAG_LONG_PRESS); outLaunched.value = false; intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive, outLaunched); assertFalse(intercepted); assertFalse(outLaunched.value); verify(mMetricsLogger, never()) .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt()); final ArgumentCaptor<Integer> intervalCaptor = ArgumentCaptor.forClass(Integer.class); verify(mMetricsLogger, times(1)).histogram( eq("power_double_tap_interval"), intervalCaptor.capture()); List<Integer> intervals = intervalCaptor.getAllValues(); assertEquals((int) INITIAL_EVENT_TIME_MILLIS, intervals.get(0).intValue()); final ArgumentCaptor<Integer> tapCountCaptor = ArgumentCaptor.forClass(Integer.class); verify(mMetricsLogger, times(1)).histogram( eq("power_consecutive_short_tap_count"), tapCountCaptor.capture()); List<Integer> tapCounts = tapCountCaptor.getAllValues(); assertEquals(1, tapCounts.get(0).intValue()); } @Test @Test public void public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupIncomplete() { testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupIncomplete() { Loading Loading
services/core/java/com/android/server/GestureLauncherService.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -356,6 +356,12 @@ public class GestureLauncherService extends SystemService { public boolean interceptPowerKeyDown(KeyEvent event, boolean interactive, public boolean interceptPowerKeyDown(KeyEvent event, boolean interactive, MutableBoolean outLaunched) { MutableBoolean outLaunched) { if (event.isLongPress()) { // Long presses are sent as a second key down. If the long press threshold is set lower // than the double tap of sequence interval thresholds, this could cause false double // taps or consecutive taps, so we want to ignore the long press event. return false; } boolean launched = false; boolean launched = false; boolean intercept = false; boolean intercept = false; long powerTapInterval; long powerTapInterval; Loading
services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java +47 −0 Original line number Original line Diff line number Diff line Loading @@ -73,6 +73,9 @@ public class GestureLauncherServiceTest { private static final int IGNORED_ACTION = 13; private static final int IGNORED_ACTION = 13; private static final int IGNORED_CODE = 1999; private static final int IGNORED_CODE = 1999; private static final int IGNORED_REPEAT = 42; private static final int IGNORED_REPEAT = 42; private static final int IGNORED_META_STATE = 0; private static final int IGNORED_DEVICE_ID = 0; private static final int IGNORED_SCANCODE = 0; private @Mock Context mContext; private @Mock Context mContext; private @Mock Resources mResources; private @Mock Resources mResources; Loading Loading @@ -368,6 +371,50 @@ public class GestureLauncherServiceTest { assertEquals(2, tapCounts.get(1).intValue()); assertEquals(2, tapCounts.get(1).intValue()); } } @Test public void testInterceptPowerKeyDown_longpress() { withCameraDoubleTapPowerEnableConfigValue(true); withCameraDoubleTapPowerDisableSettingValue(0); mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); withUserSetupCompleteValue(true); long eventTime = INITIAL_EVENT_TIME_MILLIS; KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); boolean interactive = true; MutableBoolean outLaunched = new MutableBoolean(true); boolean intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive, outLaunched); assertFalse(intercepted); assertFalse(outLaunched.value); final long interval = GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT, IGNORED_META_STATE, IGNORED_DEVICE_ID, IGNORED_SCANCODE, KeyEvent.FLAG_LONG_PRESS); outLaunched.value = false; intercepted = mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive, outLaunched); assertFalse(intercepted); assertFalse(outLaunched.value); verify(mMetricsLogger, never()) .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt()); final ArgumentCaptor<Integer> intervalCaptor = ArgumentCaptor.forClass(Integer.class); verify(mMetricsLogger, times(1)).histogram( eq("power_double_tap_interval"), intervalCaptor.capture()); List<Integer> intervals = intervalCaptor.getAllValues(); assertEquals((int) INITIAL_EVENT_TIME_MILLIS, intervals.get(0).intValue()); final ArgumentCaptor<Integer> tapCountCaptor = ArgumentCaptor.forClass(Integer.class); verify(mMetricsLogger, times(1)).histogram( eq("power_consecutive_short_tap_count"), tapCountCaptor.capture()); List<Integer> tapCounts = tapCountCaptor.getAllValues(); assertEquals(1, tapCounts.get(0).intValue()); } @Test @Test public void public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupIncomplete() { testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupIncomplete() { Loading