From d6ed6aa04c61fd23e934b8e9088e4b9d4115f727 Mon Sep 17 00:00:00 2001 From: "wangying.666" Date: Wed, 9 Mar 2022 23:43:14 +0800 Subject: [PATCH 1/2] fix time_stamp bug --- .../framework/Source/FlutterViewController.mm | 23 +++++++++++-------- .../Source/FlutterViewControllerTest.mm | 12 ++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index 08f44786fb04e..42b704df854a8 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -414,16 +414,24 @@ - (void)loadView { _scrollView.reset(scrollView); } +- (flutter::PointerData)generatePointerDataForFake { + flutter::PointerData pointer_data; + pointer_data.Clear(); + pointer_data.kind = flutter::PointerData::DeviceKind::kTouch; + // `UITouch.timestamp` is defined as seconds since system startup. Synthesized events can get this + // time with `NSProcessInfo.systemUptime`. See + // https://developer.apple.com/documentation/uikit/uitouch/1618144-timestamp?language=objc + pointer_data.time_stamp = [[NSProcessInfo processInfo] systemUptime] * kMicrosecondsPerSecond; + return pointer_data; +} + static void SendFakeTouchEvent(FlutterEngine* engine, CGPoint location, flutter::PointerData::Change change) { const CGFloat scale = [UIScreen mainScreen].scale; - flutter::PointerData pointer_data; - pointer_data.Clear(); + flutter::PointerData pointer_data = [[engine viewController] generatePointerDataForFake]; pointer_data.physical_x = location.x * scale; pointer_data.physical_y = location.y * scale; - pointer_data.kind = flutter::PointerData::DeviceKind::kTouch; - pointer_data.time_stamp = [[NSDate date] timeIntervalSince1970] * kMicrosecondsPerSecond; auto packet = std::make_unique(/*count=*/1); pointer_data.change = change; packet->SetPointerData(0, pointer_data); @@ -752,14 +760,9 @@ - (void)flushOngoingTouches { // touches to the framework so nothing gets orphaned. for (NSNumber* device in _ongoingTouches.get()) { // Create fake PointerData to balance out each previously started one for the framework. - flutter::PointerData pointer_data; - pointer_data.Clear(); - - // Use current time. - pointer_data.time_stamp = [[NSDate date] timeIntervalSince1970] * kMicrosecondsPerSecond; + flutter::PointerData pointer_data = [self generatePointerDataForFake]; pointer_data.change = flutter::PointerData::Change::kCancel; - pointer_data.kind = flutter::PointerData::DeviceKind::kTouch; pointer_data.device = device.longLongValue; pointer_data.pointer_identifier = 0; diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm index a91101c36807b..a5a45b8418fdd 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm @@ -141,6 +141,7 @@ - (void)startKeyBoardAnimation:(NSTimeInterval)duration; - (void)ensureViewportMetricsIsCorrect; - (void)invalidateDisplayLink; - (void)addInternalPlugins; +- (flutter::PointerData)generatePointerDataForFake; @end @interface FlutterViewControllerTest : XCTestCase @@ -1055,4 +1056,15 @@ - (void)testMouseSupport API_AVAILABLE(ios(13.4)) { dispatchPointerDataPacket:std::make_unique()]; } +- (void)testFakeEventTimeStamp { + FlutterViewController* vc = [[FlutterViewController alloc] initWithEngine:self.mockEngine + nibName:nil + bundle:nil]; + XCTAssertNotNil(vc); + + flutter::PointerData pointer_data = [vc generatePointerDataForFake]; + int64_t current_time = [[NSProcessInfo processInfo] systemUptime] * kMicrosecondsPerSecond; + XCTAssertTrue(current_time == pointer_data.time_stamp, + @"PointerData.time_stamp should be equal to NSProcessInfo.systemUptime"); +} @end From 34dd7dbed20363a4aec9e1bbb3c4532d85466b13 Mon Sep 17 00:00:00 2001 From: "wangying.666" Date: Thu, 10 Mar 2022 16:47:14 +0800 Subject: [PATCH 2/2] fix time_stamp compare exception --- .../darwin/ios/framework/Source/FlutterViewControllerTest.mm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm index a5a45b8418fdd..98d8de6596b01 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm @@ -6,6 +6,7 @@ #import #include "flutter/fml/platform/darwin/message_loop_darwin.h" +#include "flutter/lib/ui/window/pointer_data.h" #import "flutter/lib/ui/window/viewport_metrics.h" #import "flutter/shell/platform/darwin/common/framework/Headers/FlutterBinaryMessenger.h" #import "flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h" @@ -1063,8 +1064,8 @@ - (void)testFakeEventTimeStamp { XCTAssertNotNil(vc); flutter::PointerData pointer_data = [vc generatePointerDataForFake]; - int64_t current_time = [[NSProcessInfo processInfo] systemUptime] * kMicrosecondsPerSecond; - XCTAssertTrue(current_time == pointer_data.time_stamp, + int64_t current_time = [[NSProcessInfo processInfo] systemUptime]; + XCTAssertTrue(current_time == pointer_data.time_stamp / 1000 / 1000, @"PointerData.time_stamp should be equal to NSProcessInfo.systemUptime"); } @end