@@ -421,16 +421,24 @@ - (void)loadView {
421421 _scrollView.reset (scrollView);
422422}
423423
424+ - (flutter::PointerData)generatePointerDataForFake {
425+ flutter::PointerData pointer_data;
426+ pointer_data.Clear ();
427+ pointer_data.kind = flutter::PointerData::DeviceKind::kTouch ;
428+ // `UITouch.timestamp` is defined as seconds since system startup. Synthesized events can get this
429+ // time with `NSProcessInfo.systemUptime`. See
430+ // https://developer.apple.com/documentation/uikit/uitouch/1618144-timestamp?language=objc
431+ pointer_data.time_stamp = [[NSProcessInfo processInfo ] systemUptime ] * kMicrosecondsPerSecond ;
432+ return pointer_data;
433+ }
434+
424435static void SendFakeTouchEvent (FlutterEngine* engine,
425436 CGPoint location,
426437 flutter::PointerData::Change change) {
427438 const CGFloat scale = [UIScreen mainScreen ].scale ;
428- flutter::PointerData pointer_data;
429- pointer_data.Clear ();
439+ flutter::PointerData pointer_data = [[engine viewController ] generatePointerDataForFake ];
430440 pointer_data.physical_x = location.x * scale;
431441 pointer_data.physical_y = location.y * scale;
432- pointer_data.kind = flutter::PointerData::DeviceKind::kTouch ;
433- pointer_data.time_stamp = [[NSDate date ] timeIntervalSince1970 ] * kMicrosecondsPerSecond ;
434442 auto packet = std::make_unique<flutter::PointerDataPacket>(/* count=*/ 1 );
435443 pointer_data.change = change;
436444 packet->SetPointerData (0 , pointer_data);
@@ -759,14 +767,9 @@ - (void)flushOngoingTouches {
759767 // touches to the framework so nothing gets orphaned.
760768 for (NSNumber * device in _ongoingTouches.get ()) {
761769 // Create fake PointerData to balance out each previously started one for the framework.
762- flutter::PointerData pointer_data;
763- pointer_data.Clear ();
764-
765- // Use current time.
766- pointer_data.time_stamp = [[NSDate date ] timeIntervalSince1970 ] * kMicrosecondsPerSecond ;
770+ flutter::PointerData pointer_data = [self generatePointerDataForFake ];
767771
768772 pointer_data.change = flutter::PointerData::Change::kCancel ;
769- pointer_data.kind = flutter::PointerData::DeviceKind::kTouch ;
770773 pointer_data.device = device.longLongValue ;
771774 pointer_data.pointer_identifier = 0 ;
772775
0 commit comments