Loading services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterInputTest.kt +200 −37 Original line number Diff line number Diff line Loading @@ -17,9 +17,10 @@ package com.android.server.accessibility import android.hardware.display.DisplayManagerGlobal import android.os.SystemClock import android.platform.test.annotations.RequiresFlagsEnabled import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.CheckFlagsRule import android.platform.test.flag.junit.DeviceFlagsValueProvider import android.platform.test.flag.junit.SetFlagsRule import android.view.Display import android.view.Display.DEFAULT_DISPLAY import android.view.DisplayAdjustments Loading @@ -45,6 +46,7 @@ import com.android.cts.input.inputeventmatchers.withMotionAction import com.android.cts.input.inputeventmatchers.withSource import com.android.cts.input.BlockingQueueEventVerifier import com.android.server.LocalServices import com.android.server.accessibility.gestures.EventDispatcher import com.android.server.accessibility.magnification.MagnificationProcessor import com.android.server.wm.WindowManagerInternal import java.util.concurrent.LinkedBlockingQueue Loading Loading @@ -80,8 +82,10 @@ fun createMotionEvent(action: Int, downTime: Long, eventTime: Long, source: Int, val yPrecision = 0f val edgeFlags = 0 val displayId = 0 return MotionEvent.obtain(downTime, eventTime, action, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags, source, displayId) return MotionEvent.obtain( downTime, eventTime, action, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags, source, displayId ) } /** Loading Loading @@ -112,6 +116,10 @@ class AccessibilityInputFilterInputTest { @JvmField val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() @Rule @JvmField val mSetFlagsRule: SetFlagsRule = SetFlagsRule() @Mock private lateinit var mockA11yController: WindowManagerInternal.AccessibilityControllerInternal Loading @@ -130,8 +138,18 @@ class AccessibilityInputFilterInputTest { private lateinit var a11yInputFilter: AccessibilityInputFilter private val touchDeviceId = 1 private val fromTouchScreen = allOf(withDeviceId(touchDeviceId), withSource(SOURCE_TOUCHSCREEN)) private val fromInjectedTouchScreen = allOf( withDeviceId(EventDispatcher.VIRTUAL_TOUCHSCREEN_DEVICE_ID), withSource(SOURCE_TOUCHSCREEN) ) private val stylusDeviceId = 2 private val fromStylus = allOf(withDeviceId(stylusDeviceId), withSource(STYLUS_SOURCE)) private val fromInjectedStylus = allOf( withDeviceId(EventDispatcher.VIRTUAL_TOUCHSCREEN_DEVICE_ID), withSource(STYLUS_SOURCE) ) private val joystickDeviceId = 3 private val fromJoystick = allOf(withDeviceId(joystickDeviceId), withSource(SOURCE_JOYSTICK)) Loading @@ -143,8 +161,10 @@ class AccessibilityInputFilterInputTest { whenever(mockA11yController.isAccessibilityTracingEnabled).thenReturn(false) whenever( mockWindowManagerService.accessibilityController).thenReturn( mockA11yController) mockWindowManagerService.accessibilityController ).thenReturn( mockA11yController ) ams = Mockito.spy(AccessibilityManagerService(context)) val displayList = arrayListOf(createStubDisplay(DEFAULT_DISPLAY, DisplayInfo())) Loading Loading @@ -192,21 +212,37 @@ class AccessibilityInputFilterInputTest { * These get converted into HOVER_ENTER -> HOVER_MOVE -> HOVER_EXIT events by the input filter. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testSingleDeviceTouchEventsWithAllA11yFeatures() { enableFeatures(ALL_A11Y_FEATURES) val downTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) // MOVE becomes HOVER_MOVE sendTouchEvent(ACTION_MOVE, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_MOVE))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_MOVE) ) ) // UP becomes HOVER_EXIT sendTouchEvent(ACTION_UP, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) verifier.assertNoEvents() } Loading @@ -216,22 +252,38 @@ class AccessibilityInputFilterInputTest { * These get converted into HOVER_ENTER -> HOVER_EXIT -> HOVER_ENTER events by the input filter. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testTouchDownCancelDownWithAllA11yFeatures() { enableFeatures(ALL_A11Y_FEATURES) val downTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) // CANCEL becomes HOVER_EXIT sendTouchEvent(ACTION_CANCEL, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) // DOWN again! New hover is expected val newDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, newDownTime, newDownTime) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -242,22 +294,38 @@ class AccessibilityInputFilterInputTest { * This test is the same as above, but for stylus events. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testStylusDownCancelDownWithAllA11yFeatures() { enableFeatures(ALL_A11Y_FEATURES) val downTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) // CANCEL becomes HOVER_EXIT sendStylusEvent(ACTION_CANCEL, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_EXIT) ) ) // DOWN again! New hover is expected val newDownTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, newDownTime, newDownTime) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -266,21 +334,37 @@ class AccessibilityInputFilterInputTest { * Enable all a11y features and send a stylus stream and then a touch stream. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testStylusThenTouch() { enableFeatures(ALL_A11Y_FEATURES) val downTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) // CANCEL becomes HOVER_EXIT sendStylusEvent(ACTION_CANCEL, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_EXIT) ) ) val newDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, newDownTime, newDownTime) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -292,6 +376,7 @@ class AccessibilityInputFilterInputTest { * from the dispatcher. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testSingleDeviceTouchEventsDisableFeaturesMidGesture() { enableFeatures(ALL_A11Y_FEATURES) Loading @@ -299,11 +384,21 @@ class AccessibilityInputFilterInputTest { sendTouchEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() enableFeatures(0) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) verifier.assertNoEvents() sendTouchEvent(ACTION_MOVE, downTime, SystemClock.uptimeMillis()) Loading @@ -329,7 +424,7 @@ class AccessibilityInputFilterInputTest { * interleaved. */ @Test @RequiresFlagsEnabled(Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT) @EnableFlags(Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT) fun testMultiDeviceEventsWithoutA11yFeatures() { enableFeatures(0) Loading Loading @@ -374,21 +469,39 @@ class AccessibilityInputFilterInputTest { * interleaved. */ @Test @RequiresFlagsEnabled(Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT) @EnableFlags( Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT, Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID ) fun testMultiDeviceEventsWithAllA11yFeatures() { enableFeatures(ALL_A11Y_FEATURES) // Touch device - ACTION_DOWN val touchDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, touchDownTime, touchDownTime) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) // Stylus device - ACTION_DOWN val stylusDownTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, stylusDownTime, stylusDownTime) // Touch is canceled and stylus is started verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) // Touch device - ACTION_MOVE sendTouchEvent(ACTION_MOVE, touchDownTime, SystemClock.uptimeMillis()) Loading @@ -397,7 +510,12 @@ class AccessibilityInputFilterInputTest { // Stylus device - ACTION_MOVE sendStylusEvent(ACTION_MOVE, stylusDownTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_MOVE))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_MOVE) ) ) // Touch device - ACTION_UP sendTouchEvent(ACTION_UP, touchDownTime, SystemClock.uptimeMillis()) Loading @@ -405,12 +523,22 @@ class AccessibilityInputFilterInputTest { verifier.assertNoEvents() sendStylusEvent(ACTION_UP, stylusDownTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_EXIT) ) ) // Now stylus is done, and a new touch gesture will work! val newTouchDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, newTouchDownTime, newTouchDownTime) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -422,32 +550,60 @@ class AccessibilityInputFilterInputTest { * while stylus is active. Check that the latest device is always given preference. */ @Test @RequiresFlagsEnabled(Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT) @EnableFlags( Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT, Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID ) fun testStylusWithTouchInTheMiddle() { enableFeatures(ALL_A11Y_FEATURES) // Stylus device - ACTION_DOWN val stylusDownTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, stylusDownTime, stylusDownTime) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) // Touch device - ACTION_DOWN val touchDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, touchDownTime, touchDownTime) // Touch DOWN causes stylus to get canceled verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_EXIT) ) ) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) // Touch device - ACTION_MOVE sendTouchEvent(ACTION_MOVE, touchDownTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_MOVE))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_MOVE) ) ) sendStylusEvent(ACTION_MOVE, stylusDownTime, SystemClock.uptimeMillis()) // Stylus is ignored because touch is active now verifier.assertNoEvents() sendTouchEvent(ACTION_UP, touchDownTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) sendStylusEvent(ACTION_UP, stylusDownTime, SystemClock.uptimeMillis()) // The UP stylus event is also ignored Loading @@ -456,7 +612,12 @@ class AccessibilityInputFilterInputTest { // Now stylus works again, because touch gesture is finished val newStylusDownTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, newStylusDownTime, newStylusDownTime) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -479,8 +640,10 @@ class AccessibilityInputFilterInputTest { } private fun createStubDisplay(displayId: Int, displayInfo: DisplayInfo): Display { val display = Display(DisplayManagerGlobal.getInstance(), displayId, displayInfo, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS) val display = Display( DisplayManagerGlobal.getInstance(), displayId, displayInfo, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS ) return display } Loading Loading
services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterInputTest.kt +200 −37 Original line number Diff line number Diff line Loading @@ -17,9 +17,10 @@ package com.android.server.accessibility import android.hardware.display.DisplayManagerGlobal import android.os.SystemClock import android.platform.test.annotations.RequiresFlagsEnabled import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.CheckFlagsRule import android.platform.test.flag.junit.DeviceFlagsValueProvider import android.platform.test.flag.junit.SetFlagsRule import android.view.Display import android.view.Display.DEFAULT_DISPLAY import android.view.DisplayAdjustments Loading @@ -45,6 +46,7 @@ import com.android.cts.input.inputeventmatchers.withMotionAction import com.android.cts.input.inputeventmatchers.withSource import com.android.cts.input.BlockingQueueEventVerifier import com.android.server.LocalServices import com.android.server.accessibility.gestures.EventDispatcher import com.android.server.accessibility.magnification.MagnificationProcessor import com.android.server.wm.WindowManagerInternal import java.util.concurrent.LinkedBlockingQueue Loading Loading @@ -80,8 +82,10 @@ fun createMotionEvent(action: Int, downTime: Long, eventTime: Long, source: Int, val yPrecision = 0f val edgeFlags = 0 val displayId = 0 return MotionEvent.obtain(downTime, eventTime, action, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags, source, displayId) return MotionEvent.obtain( downTime, eventTime, action, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags, source, displayId ) } /** Loading Loading @@ -112,6 +116,10 @@ class AccessibilityInputFilterInputTest { @JvmField val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() @Rule @JvmField val mSetFlagsRule: SetFlagsRule = SetFlagsRule() @Mock private lateinit var mockA11yController: WindowManagerInternal.AccessibilityControllerInternal Loading @@ -130,8 +138,18 @@ class AccessibilityInputFilterInputTest { private lateinit var a11yInputFilter: AccessibilityInputFilter private val touchDeviceId = 1 private val fromTouchScreen = allOf(withDeviceId(touchDeviceId), withSource(SOURCE_TOUCHSCREEN)) private val fromInjectedTouchScreen = allOf( withDeviceId(EventDispatcher.VIRTUAL_TOUCHSCREEN_DEVICE_ID), withSource(SOURCE_TOUCHSCREEN) ) private val stylusDeviceId = 2 private val fromStylus = allOf(withDeviceId(stylusDeviceId), withSource(STYLUS_SOURCE)) private val fromInjectedStylus = allOf( withDeviceId(EventDispatcher.VIRTUAL_TOUCHSCREEN_DEVICE_ID), withSource(STYLUS_SOURCE) ) private val joystickDeviceId = 3 private val fromJoystick = allOf(withDeviceId(joystickDeviceId), withSource(SOURCE_JOYSTICK)) Loading @@ -143,8 +161,10 @@ class AccessibilityInputFilterInputTest { whenever(mockA11yController.isAccessibilityTracingEnabled).thenReturn(false) whenever( mockWindowManagerService.accessibilityController).thenReturn( mockA11yController) mockWindowManagerService.accessibilityController ).thenReturn( mockA11yController ) ams = Mockito.spy(AccessibilityManagerService(context)) val displayList = arrayListOf(createStubDisplay(DEFAULT_DISPLAY, DisplayInfo())) Loading Loading @@ -192,21 +212,37 @@ class AccessibilityInputFilterInputTest { * These get converted into HOVER_ENTER -> HOVER_MOVE -> HOVER_EXIT events by the input filter. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testSingleDeviceTouchEventsWithAllA11yFeatures() { enableFeatures(ALL_A11Y_FEATURES) val downTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) // MOVE becomes HOVER_MOVE sendTouchEvent(ACTION_MOVE, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_MOVE))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_MOVE) ) ) // UP becomes HOVER_EXIT sendTouchEvent(ACTION_UP, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) verifier.assertNoEvents() } Loading @@ -216,22 +252,38 @@ class AccessibilityInputFilterInputTest { * These get converted into HOVER_ENTER -> HOVER_EXIT -> HOVER_ENTER events by the input filter. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testTouchDownCancelDownWithAllA11yFeatures() { enableFeatures(ALL_A11Y_FEATURES) val downTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) // CANCEL becomes HOVER_EXIT sendTouchEvent(ACTION_CANCEL, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) // DOWN again! New hover is expected val newDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, newDownTime, newDownTime) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -242,22 +294,38 @@ class AccessibilityInputFilterInputTest { * This test is the same as above, but for stylus events. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testStylusDownCancelDownWithAllA11yFeatures() { enableFeatures(ALL_A11Y_FEATURES) val downTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) // CANCEL becomes HOVER_EXIT sendStylusEvent(ACTION_CANCEL, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_EXIT) ) ) // DOWN again! New hover is expected val newDownTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, newDownTime, newDownTime) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -266,21 +334,37 @@ class AccessibilityInputFilterInputTest { * Enable all a11y features and send a stylus stream and then a touch stream. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testStylusThenTouch() { enableFeatures(ALL_A11Y_FEATURES) val downTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) // CANCEL becomes HOVER_EXIT sendStylusEvent(ACTION_CANCEL, downTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_EXIT) ) ) val newDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, newDownTime, newDownTime) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -292,6 +376,7 @@ class AccessibilityInputFilterInputTest { * from the dispatcher. */ @Test @EnableFlags(Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID) fun testSingleDeviceTouchEventsDisableFeaturesMidGesture() { enableFeatures(ALL_A11Y_FEATURES) Loading @@ -299,11 +384,21 @@ class AccessibilityInputFilterInputTest { sendTouchEvent(ACTION_DOWN, downTime, downTime) // DOWN event gets transformed to HOVER_ENTER verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() enableFeatures(0) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) verifier.assertNoEvents() sendTouchEvent(ACTION_MOVE, downTime, SystemClock.uptimeMillis()) Loading @@ -329,7 +424,7 @@ class AccessibilityInputFilterInputTest { * interleaved. */ @Test @RequiresFlagsEnabled(Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT) @EnableFlags(Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT) fun testMultiDeviceEventsWithoutA11yFeatures() { enableFeatures(0) Loading Loading @@ -374,21 +469,39 @@ class AccessibilityInputFilterInputTest { * interleaved. */ @Test @RequiresFlagsEnabled(Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT) @EnableFlags( Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT, Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID ) fun testMultiDeviceEventsWithAllA11yFeatures() { enableFeatures(ALL_A11Y_FEATURES) // Touch device - ACTION_DOWN val touchDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, touchDownTime, touchDownTime) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) // Stylus device - ACTION_DOWN val stylusDownTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, stylusDownTime, stylusDownTime) // Touch is canceled and stylus is started verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) // Touch device - ACTION_MOVE sendTouchEvent(ACTION_MOVE, touchDownTime, SystemClock.uptimeMillis()) Loading @@ -397,7 +510,12 @@ class AccessibilityInputFilterInputTest { // Stylus device - ACTION_MOVE sendStylusEvent(ACTION_MOVE, stylusDownTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_MOVE))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_MOVE) ) ) // Touch device - ACTION_UP sendTouchEvent(ACTION_UP, touchDownTime, SystemClock.uptimeMillis()) Loading @@ -405,12 +523,22 @@ class AccessibilityInputFilterInputTest { verifier.assertNoEvents() sendStylusEvent(ACTION_UP, stylusDownTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_EXIT) ) ) // Now stylus is done, and a new touch gesture will work! val newTouchDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, newTouchDownTime, newTouchDownTime) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -422,32 +550,60 @@ class AccessibilityInputFilterInputTest { * while stylus is active. Check that the latest device is always given preference. */ @Test @RequiresFlagsEnabled(Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT) @EnableFlags( Flags.FLAG_HANDLE_MULTI_DEVICE_INPUT, Flags.FLAG_TOUCH_EXPLORER_USE_VIRTUAL_DEVICE_ID ) fun testStylusWithTouchInTheMiddle() { enableFeatures(ALL_A11Y_FEATURES) // Stylus device - ACTION_DOWN val stylusDownTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, stylusDownTime, stylusDownTime) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) // Touch device - ACTION_DOWN val touchDownTime = SystemClock.uptimeMillis() sendTouchEvent(ACTION_DOWN, touchDownTime, touchDownTime) // Touch DOWN causes stylus to get canceled verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_EXIT) ) ) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_ENTER) ) ) // Touch device - ACTION_MOVE sendTouchEvent(ACTION_MOVE, touchDownTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_MOVE))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_MOVE) ) ) sendStylusEvent(ACTION_MOVE, stylusDownTime, SystemClock.uptimeMillis()) // Stylus is ignored because touch is active now verifier.assertNoEvents() sendTouchEvent(ACTION_UP, touchDownTime, SystemClock.uptimeMillis()) verifier.assertReceivedMotion(allOf(fromTouchScreen, withMotionAction(ACTION_HOVER_EXIT))) verifier.assertReceivedMotion( allOf( fromInjectedTouchScreen, withMotionAction(ACTION_HOVER_EXIT) ) ) sendStylusEvent(ACTION_UP, stylusDownTime, SystemClock.uptimeMillis()) // The UP stylus event is also ignored Loading @@ -456,7 +612,12 @@ class AccessibilityInputFilterInputTest { // Now stylus works again, because touch gesture is finished val newStylusDownTime = SystemClock.uptimeMillis() sendStylusEvent(ACTION_DOWN, newStylusDownTime, newStylusDownTime) verifier.assertReceivedMotion(allOf(fromStylus, withMotionAction(ACTION_HOVER_ENTER))) verifier.assertReceivedMotion( allOf( fromInjectedStylus, withMotionAction(ACTION_HOVER_ENTER) ) ) verifier.assertNoEvents() } Loading @@ -479,8 +640,10 @@ class AccessibilityInputFilterInputTest { } private fun createStubDisplay(displayId: Int, displayInfo: DisplayInfo): Display { val display = Display(DisplayManagerGlobal.getInstance(), displayId, displayInfo, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS) val display = Display( DisplayManagerGlobal.getInstance(), displayId, displayInfo, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS ) return display } Loading