diff --git a/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewController.mm b/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewController.mm index 917ee5def5a52..64b83cd80d348 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewController.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewController.mm @@ -116,11 +116,45 @@ - (void)handleMethodCall:(nonnull FlutterMethodCall*)call result:(nonnull Flutte NSNumber* arg = [call arguments]; int64_t viewId = [arg longLongValue]; [self onDisposeWithViewID:viewId result:result]; + } else if ([[call method] isEqualToString:@"acceptGesture"]) { + [self handleAcceptGesture:call result:result]; + } else if ([[call method] isEqualToString:@"rejectGesture"]) { + [self handleRejectGesture:call result:result]; } else { result(FlutterMethodNotImplemented); } } +- (void)handleAcceptGesture:(FlutterMethodCall*)call result:(FlutterResult)result { + NSDictionary* args = [call arguments]; + NSAssert(args && args[@"id"], @"id argument is required"); + int64_t viewId = [args[@"id"] longLongValue]; + if (_platformViews.count(viewId) == 0) { + result([FlutterError errorWithCode:@"unknown_view" + message:@"trying to set gesture state for an unknown view" + details:[NSString stringWithFormat:@"view id: '%lld'", viewId]]); + return; + } + + // TODO(cbracken): Implement. https://github.com/flutter/flutter/issues/124492 + result(nil); +} + +- (void)handleRejectGesture:(FlutterMethodCall*)call result:(FlutterResult)result { + NSDictionary* args = [call arguments]; + NSAssert(args && args[@"id"], @"id argument is required"); + int64_t viewId = [args[@"id"] longLongValue]; + if (_platformViews.count(viewId) == 0) { + result([FlutterError errorWithCode:@"unknown_view" + message:@"trying to set gesture state for an unknown view" + details:[NSString stringWithFormat:@"view id: '%lld'", viewId]]); + return; + } + + // TODO(cbracken): Implement. https://github.com/flutter/flutter/issues/124492 + result(nil); +} + - (void)disposePlatformViews { if (_platformViewsToDispose.empty()) { return; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewControllerTest.mm index f8880ba69d3fb..65f59ddaf2167 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewControllerTest.mm @@ -161,4 +161,120 @@ EXPECT_TRUE(errored); } +TEST(FlutterPlatformViewController, TestAcceptGesture) { + FlutterPlatformViewController* platformViewController = + [[FlutterPlatformViewController alloc] init]; + [platformViewController registerViewFactory:[TestFlutterPlatformViewFactory alloc] + withId:@"MockPlatformView"]; + + // Create the PlatformView. + const NSNumber* viewId = [NSNumber numberWithLongLong:2]; + FlutterMethodCall* methodCallOnCreate = [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"id" : viewId, @"viewType" : @"MockPlatformView"}]; + __block bool created = false; + FlutterResult resultOnCreate = ^(id result) { + // If a platform view is successfully created, the result is nil. + if (result == nil) { + created = true; + } + }; + [platformViewController handleMethodCall:methodCallOnCreate result:resultOnCreate]; + + // Call acceptGesture. + FlutterMethodCall* methodCallAcceptGesture = + [FlutterMethodCall methodCallWithMethodName:@"acceptGesture" arguments:@{@"id" : viewId}]; + __block bool acceptGestureCalled = false; + FlutterResult resultAcceptGesture = ^(id result) { + // If a acceptGesture is successful, the result is nil. + if (result == nil) { + acceptGestureCalled = true; + } + }; + [platformViewController handleMethodCall:methodCallAcceptGesture result:resultAcceptGesture]; + + EXPECT_TRUE(created); + EXPECT_TRUE(acceptGestureCalled); +} + +TEST(FlutterPlatformViewController, TestAcceptGestureOnMissingViewId) { + FlutterPlatformViewController* platformViewController = + [[FlutterPlatformViewController alloc] init]; + [platformViewController registerViewFactory:[TestFlutterPlatformViewFactory alloc] + withId:@"MockPlatformView"]; + + // Call rejectGesture. + FlutterMethodCall* methodCallAcceptGesture = + [FlutterMethodCall methodCallWithMethodName:@"acceptGesture" arguments:@{ + @"id" : @20 + }]; + __block bool errored = false; + FlutterResult result = ^(id result) { + if ([result isKindOfClass:[FlutterError class]]) { + errored = true; + } + }; + [platformViewController handleMethodCall:methodCallAcceptGesture result:result]; + + EXPECT_TRUE(errored); +} + +TEST(FlutterPlatformViewController, TestRejectGesture) { + FlutterPlatformViewController* platformViewController = + [[FlutterPlatformViewController alloc] init]; + [platformViewController registerViewFactory:[TestFlutterPlatformViewFactory alloc] + withId:@"MockPlatformView"]; + + // Create the PlatformView. + const NSNumber* viewId = [NSNumber numberWithLongLong:2]; + FlutterMethodCall* methodCallOnCreate = [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"id" : viewId, @"viewType" : @"MockPlatformView"}]; + __block bool created = false; + FlutterResult resultOnCreate = ^(id result) { + // If a platform view is successfully created, the result is nil. + if (result == nil) { + created = true; + } + }; + [platformViewController handleMethodCall:methodCallOnCreate result:resultOnCreate]; + + // Call rejectGesture. + FlutterMethodCall* methodCallRejectGesture = + [FlutterMethodCall methodCallWithMethodName:@"rejectGesture" arguments:@{@"id" : viewId}]; + __block bool rejectGestureCalled = false; + FlutterResult resultRejectGesture = ^(id result) { + // If a rejectGesture is successful, the result is nil. + if (result == nil) { + rejectGestureCalled = true; + } + }; + [platformViewController handleMethodCall:methodCallRejectGesture result:resultRejectGesture]; + + EXPECT_TRUE(created); + EXPECT_TRUE(rejectGestureCalled); +} + +TEST(FlutterPlatformViewController, TestRejectGestureOnMissingViewId) { + FlutterPlatformViewController* platformViewController = + [[FlutterPlatformViewController alloc] init]; + [platformViewController registerViewFactory:[TestFlutterPlatformViewFactory alloc] + withId:@"MockPlatformView"]; + + // Call rejectGesture. + FlutterMethodCall* methodCallRejectGesture = + [FlutterMethodCall methodCallWithMethodName:@"rejectGesture" arguments:@{ + @"id" : @20 + }]; + __block bool errored = false; + FlutterResult result = ^(id result) { + if ([result isKindOfClass:[FlutterError class]]) { + errored = true; + } + }; + [platformViewController handleMethodCall:methodCallRejectGesture result:result]; + + EXPECT_TRUE(errored); +} + } // namespace flutter::testing