@@ -89,6 +89,7 @@ MotionEvent mockEvent(int action, float x, float y, int buttonState) {
8989 when (event .getX (0 )).thenReturn (x );
9090 when (event .getY (0 )).thenReturn (y );
9191 when (event .getToolType (0 )).thenReturn (toolType );
92+ when (event .isFromSource (InputDevice .SOURCE_CLASS_POINTER )).thenReturn (true );
9293 return event ;
9394 }
9495 }
@@ -218,4 +219,59 @@ public void unexpectedMaskedAction() {
218219 touchProcessor .onTouchEvent (mocker .mockEvent (MotionEvent .ACTION_BUTTON_PRESS , 0.0f , 0.0f , 0 ));
219220 verify (mockRenderer , never ()).dispatchPointerDataPacket (ByteBuffer .allocate (0 ), 0 );
220221 }
222+
223+ @ Test
224+ public void unexpectedPointerChange () {
225+ // Regression test for https://github.com/flutter/flutter/issues/129765
226+
227+ MotionEventMocker mocker =
228+ new MotionEventMocker (0 , InputDevice .SOURCE_MOUSE , MotionEvent .TOOL_TYPE_MOUSE );
229+
230+ touchProcessor .onTouchEvent (mocker .mockEvent (MotionEvent .ACTION_DOWN , 0.0f , 0.0f , 0 ));
231+ InOrder inOrder = inOrder (mockRenderer );
232+ inOrder
233+ .verify (mockRenderer )
234+ .dispatchPointerDataPacket (packetCaptor .capture (), packetSizeCaptor .capture ());
235+ ByteBuffer packet = packetCaptor .getValue ();
236+ assertEquals (AndroidTouchProcessor .PointerChange .PAN_ZOOM_START , readPointerChange (packet ));
237+ assertEquals (AndroidTouchProcessor .PointerDeviceKind .TRACKPAD , readPointerDeviceKind (packet ));
238+ assertEquals (AndroidTouchProcessor .PointerSignalKind .NONE , readPointerSignalKind (packet ));
239+ assertEquals (0.0 , readPointerPhysicalX (packet ));
240+ assertEquals (0.0 , readPointerPhysicalY (packet ));
241+
242+ touchProcessor .onTouchEvent (mocker .mockEvent (MotionEvent .ACTION_MOVE , 10.0f , 5.0f , 0 ));
243+ inOrder
244+ .verify (mockRenderer )
245+ .dispatchPointerDataPacket (packetCaptor .capture (), packetSizeCaptor .capture ());
246+ packet = packetCaptor .getValue ();
247+ assertEquals (AndroidTouchProcessor .PointerChange .PAN_ZOOM_UPDATE , readPointerChange (packet ));
248+ assertEquals (AndroidTouchProcessor .PointerDeviceKind .TRACKPAD , readPointerDeviceKind (packet ));
249+ assertEquals (AndroidTouchProcessor .PointerSignalKind .NONE , readPointerSignalKind (packet ));
250+ assertEquals (0.0 , readPointerPhysicalX (packet ));
251+ assertEquals (0.0 , readPointerPhysicalY (packet ));
252+ assertEquals (10.0 , readPointerPanX (packet ));
253+ assertEquals (5.0 , readPointerPanY (packet ));
254+
255+ touchProcessor .onGenericMotionEvent (mocker .mockEvent (MotionEvent .ACTION_SCROLL , 0.0f , 0.0f , 0 ));
256+ inOrder
257+ .verify (mockRenderer )
258+ .dispatchPointerDataPacket (packetCaptor .capture (), packetSizeCaptor .capture ());
259+ packet = packetCaptor .getValue ();
260+ packet .rewind ();
261+ while (packet .hasRemaining ()) {
262+ assertEquals (0 , packet .get ());
263+ }
264+
265+ touchProcessor .onTouchEvent (mocker .mockEvent (MotionEvent .ACTION_UP , 10.0f , 5.0f , 0 ));
266+ inOrder
267+ .verify (mockRenderer )
268+ .dispatchPointerDataPacket (packetCaptor .capture (), packetSizeCaptor .capture ());
269+ packet = packetCaptor .getValue ();
270+ assertEquals (AndroidTouchProcessor .PointerChange .PAN_ZOOM_END , readPointerChange (packet ));
271+ assertEquals (AndroidTouchProcessor .PointerDeviceKind .TRACKPAD , readPointerDeviceKind (packet ));
272+ assertEquals (AndroidTouchProcessor .PointerSignalKind .NONE , readPointerSignalKind (packet ));
273+ assertEquals (0.0 , readPointerPhysicalX (packet ));
274+ assertEquals (0.0 , readPointerPhysicalY (packet ));
275+ inOrder .verifyNoMoreInteractions ();
276+ }
221277}
0 commit comments