@@ -77,9 +77,26 @@ class MockProtoKey {
7777 MOCK_METHOD (void , set_meta_state, (uint32_t ));
7878};
7979
80- using TestProtoConverter = AndroidInputEventProtoConverter<MockProtoMotion, MockProtoKey,
81- proto::AndroidWindowInputDispatchEvent,
82- proto::AndroidInputEventConfig::Decoder>;
80+ class MockProtoDispatchPointer {
81+ public:
82+ MOCK_METHOD (void , set_pointer_id, (uint32_t ));
83+ MOCK_METHOD (void , set_x_in_display, (float ));
84+ MOCK_METHOD (void , set_y_in_display, (float ));
85+ MOCK_METHOD (MockProtoAxisValue*, add_axis_value_in_window, ());
86+ };
87+
88+ class MockProtoDispatch {
89+ public:
90+ MOCK_METHOD (void , set_event_id, (uint32_t ));
91+ MOCK_METHOD (void , set_vsync_id, (uint32_t ));
92+ MOCK_METHOD (void , set_window_id, (uint32_t ));
93+ MOCK_METHOD (void , set_resolved_flags, (uint32_t ));
94+ MOCK_METHOD (MockProtoDispatchPointer*, add_dispatched_pointer, ());
95+ };
96+
97+ using TestProtoConverter =
98+ AndroidInputEventProtoConverter<MockProtoMotion, MockProtoKey, MockProtoDispatch,
99+ proto::AndroidInputEventConfig::Decoder>;
83100
84101TEST (AndroidInputEventProtoConverterTest, ToProtoMotionEvent) {
85102 TracedMotionEvent event{};
@@ -435,6 +452,135 @@ TEST(AndroidInputEventProtoConverterTest, ToProtoKeyEvent_Redacted) {
435452 TestProtoConverter::toProtoKeyEvent (event, proto, /* isRedacted=*/ true );
436453}
437454
455+ TEST (AndroidInputEventProtoConverterTest, ToProtoWindowDispatchEvent_Motion_IdentityTransform) {
456+ TracedMotionEvent motion{};
457+ motion.pointerProperties .emplace_back (PointerProperties{
458+ .id = 4 ,
459+ .toolType = ToolType::MOUSE,
460+ });
461+ motion.pointerCoords .emplace_back ();
462+ motion.pointerCoords .back ().setAxisValue (AMOTION_EVENT_AXIS_X, 5 .0f );
463+ motion.pointerCoords .back ().setAxisValue (AMOTION_EVENT_AXIS_Y, 6 .0f );
464+
465+ WindowDispatchArgs args{};
466+ args.eventEntry = motion;
467+ args.vsyncId = 1 ;
468+ args.windowId = 2 ;
469+ args.resolvedFlags = 3 ;
470+ args.rawTransform = ui::Transform{};
471+ args.transform = ui::Transform{};
472+
473+ testing::StrictMock<MockProtoDispatch> proto;
474+ testing::StrictMock<MockProtoDispatchPointer> pointer;
475+
476+ EXPECT_CALL (proto, set_event_id (0 ));
477+ EXPECT_CALL (proto, set_vsync_id (1 ));
478+ EXPECT_CALL (proto, set_window_id (2 ));
479+ EXPECT_CALL (proto, set_resolved_flags (3 ));
480+ EXPECT_CALL (proto, add_dispatched_pointer ()).WillOnce (Return (&pointer));
481+ EXPECT_CALL (pointer, set_pointer_id (4 ));
482+
483+ // Since we are using identity transforms, the axis values will be identical to those in the
484+ // traced event, so they should not be traced here.
485+ EXPECT_CALL (pointer, add_axis_value_in_window ()).Times (0 );
486+ EXPECT_CALL (pointer, set_x_in_display (_)).Times (0 );
487+ EXPECT_CALL (pointer, set_y_in_display (_)).Times (0 );
488+
489+ TestProtoConverter::toProtoWindowDispatchEvent (args, proto, /* isRedacted=*/ false );
490+ }
491+
492+ TEST (AndroidInputEventProtoConverterTest, ToProtoWindowDispatchEvent_Motion_CustomTransform) {
493+ TracedMotionEvent motion{};
494+ motion.pointerProperties .emplace_back (PointerProperties{
495+ .id = 4 ,
496+ .toolType = ToolType::MOUSE,
497+ });
498+ motion.pointerCoords .emplace_back ();
499+ motion.pointerCoords .back ().setAxisValue (AMOTION_EVENT_AXIS_X, 8 .0f );
500+ motion.pointerCoords .back ().setAxisValue (AMOTION_EVENT_AXIS_Y, 6 .0f );
501+
502+ WindowDispatchArgs args{};
503+ args.eventEntry = motion;
504+ args.vsyncId = 1 ;
505+ args.windowId = 2 ;
506+ args.resolvedFlags = 3 ;
507+ args.rawTransform .set (2 , 0 , 0 , 0.5 );
508+ args.transform .set (1.0 , 0 , 0 , 0.5 );
509+
510+ testing::StrictMock<MockProtoDispatch> proto;
511+ testing::StrictMock<MockProtoDispatchPointer> pointer;
512+ testing::StrictMock<MockProtoAxisValue> axisValue1;
513+
514+ EXPECT_CALL (proto, set_event_id (0 ));
515+ EXPECT_CALL (proto, set_vsync_id (1 ));
516+ EXPECT_CALL (proto, set_window_id (2 ));
517+ EXPECT_CALL (proto, set_resolved_flags (3 ));
518+ EXPECT_CALL (proto, add_dispatched_pointer ()).WillOnce (Return (&pointer));
519+ EXPECT_CALL (pointer, set_pointer_id (4 ));
520+
521+ // Only the transformed axis-values that differ from the traced event will be traced.
522+ EXPECT_CALL (pointer, add_axis_value_in_window ()).WillOnce (Return (&axisValue1));
523+ EXPECT_CALL (pointer, set_x_in_display (16 .0f )); // MotionEvent::getRawX
524+ EXPECT_CALL (pointer, set_y_in_display (3 .0f )); // MotionEvent::getRawY
525+
526+ EXPECT_CALL (axisValue1, set_axis (AMOTION_EVENT_AXIS_Y));
527+ EXPECT_CALL (axisValue1, set_value (3 .0f ));
528+
529+ TestProtoConverter::toProtoWindowDispatchEvent (args, proto, /* isRedacted=*/ false );
530+ }
531+
532+ TEST (AndroidInputEventProtoConverterTest, ToProtoWindowDispatchEvent_Motion_Redacted) {
533+ TracedMotionEvent motion{};
534+ motion.pointerProperties .emplace_back (PointerProperties{
535+ .id = 4 ,
536+ .toolType = ToolType::MOUSE,
537+ });
538+ motion.pointerCoords .emplace_back ();
539+ motion.pointerCoords .back ().setAxisValue (AMOTION_EVENT_AXIS_X, 5 .0f );
540+ motion.pointerCoords .back ().setAxisValue (AMOTION_EVENT_AXIS_Y, 6 .0f );
541+
542+ WindowDispatchArgs args{};
543+ args.eventEntry = motion;
544+ args.vsyncId = 1 ;
545+ args.windowId = 2 ;
546+ args.resolvedFlags = 3 ;
547+ args.rawTransform = ui::Transform{};
548+ args.transform = ui::Transform{};
549+
550+ testing::StrictMock<MockProtoDispatch> proto;
551+
552+ EXPECT_CALL (proto, set_event_id (0 ));
553+ EXPECT_CALL (proto, set_vsync_id (1 ));
554+ EXPECT_CALL (proto, set_window_id (2 ));
555+ EXPECT_CALL (proto, set_resolved_flags (3 ));
556+
557+ // Redacted fields
558+ EXPECT_CALL (proto, add_dispatched_pointer ()).Times (0 );
559+
560+ TestProtoConverter::toProtoWindowDispatchEvent (args, proto, /* isRedacted=*/ true );
561+ }
562+
563+ TEST (AndroidInputEventProtoConverterTest, ToProtoWindowDispatchEvent_Key) {
564+ TracedKeyEvent key{};
565+
566+ WindowDispatchArgs args{};
567+ args.eventEntry = key;
568+ args.vsyncId = 1 ;
569+ args.windowId = 2 ;
570+ args.resolvedFlags = 3 ;
571+ args.rawTransform = ui::Transform{};
572+ args.transform = ui::Transform{};
573+
574+ testing::StrictMock<MockProtoDispatch> proto;
575+
576+ EXPECT_CALL (proto, set_event_id (0 ));
577+ EXPECT_CALL (proto, set_vsync_id (1 ));
578+ EXPECT_CALL (proto, set_window_id (2 ));
579+ EXPECT_CALL (proto, set_resolved_flags (3 ));
580+
581+ TestProtoConverter::toProtoWindowDispatchEvent (args, proto, /* isRedacted=*/ true );
582+ }
583+
438584} // namespace
439585
440586} // namespace android::inputdispatcher::trace
0 commit comments