Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit edbf5734 authored by Daniel Norman's avatar Daniel Norman
Browse files

fix(touchexplorer): Update test for new device ID for injected events

Also update these tests to use EnableFlags so that they always
run regardless of the flag values in the server.

Bug: 364408887
Test: atest AccessibilityInputFilterInputTest
Flag: com.android.server.accessibility.touch_explorer_use_virtual_device_id
Change-Id: I95ee03115fcb17171ff685ce9ad124db22e7c9b0
parent e73e867d
Loading
Loading
Loading
Loading
+200 −37
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
    )
}

/**
@@ -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

@@ -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))

@@ -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()))
@@ -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()
    }
@@ -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()
    }
@@ -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()
    }
@@ -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()
    }
@@ -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)

@@ -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())
@@ -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)

@@ -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())
@@ -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())
@@ -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()
    }
@@ -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
@@ -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()
    }
@@ -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
    }