diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 577922f42133f..10740f6d0e23d 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -6,11 +6,15 @@ #define FLUTTER_FLOW_EMBEDDED_VIEWS_H_ #include "flutter/fml/memory/ref_counted.h" +#include "third_party/skia/include/core/SkPoint.h" +#include "third_party/skia/include/core/SkSize.h" namespace flow { class EmbeddedViewParams { public: + SkPoint offsetPixels; + SkSize sizePoints; }; // This is only used on iOS when running in a non headless mode, diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index 42fdd91954b62..19057fbfd4b9c 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -23,6 +23,11 @@ void PlatformViewLayer::Paint(PaintContext& context) const { return; } EmbeddedViewParams params; + SkMatrix transform = context.canvas.getTotalMatrix(); + params.offsetPixels = + SkPoint::Make(transform.getTranslateX(), transform.getTranslateY()); + params.sizePoints = size_; + context.view_embedder->CompositeEmbeddedView(view_id_, params); } } // namespace flow diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 9b63070c6f9d9..48e175ef04e80 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -13,7 +13,9 @@ namespace shell { FlutterPlatformViewsController::FlutterPlatformViewsController( - NSObject* messenger) { + NSObject* messenger, + FlutterView* flutter_view) + : flutter_view_([flutter_view retain]) { channel_.reset([[FlutterMethodChannel alloc] initWithName:@"flutter/platform_views" binaryMessenger:messenger @@ -58,6 +60,9 @@ views_[viewId] = fml::scoped_nsobject([[factory createWithFrame:CGRectZero viewIdentifier:viewId arguments:nil] retain]); + + FlutterView* flutter_view = flutter_view_.get(); + [flutter_view addSubview:views_[viewId].get()]; result(nil); } @@ -72,6 +77,8 @@ return; } + UIView* view = views_[viewId].get(); + [view removeFromSuperview]; views_.erase(viewId); result(nil); } @@ -87,7 +94,16 @@ void FlutterPlatformViewsController::CompositeEmbeddedView(int view_id, const flow::EmbeddedViewParams& params) { - // TODO(amirh): implement this. + // TODO(amirh): assert that this is running on the platform thread once we support the iOS + // embedded views thread configuration. + // TODO(amirh): do nothing if the params didn't change. + CGFloat screenScale = [[UIScreen mainScreen] scale]; + CGRect rect = + CGRectMake(params.offsetPixels.x() / screenScale, params.offsetPixels.y() / screenScale, + params.sizePoints.width(), params.sizePoints.height()); + + UIView* view = views_[view_id]; + [view setFrame:rect]; } } // namespace shell diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index 9c9d80435606d..494d1fe5f1c16 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -5,6 +5,7 @@ #ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMVIEWS_INTERNAL_H_ #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMVIEWS_INTERNAL_H_ +#include "FlutterView.h" #include "flutter/flow/embedded_views.h" #include "flutter/fml/platform/darwin/scoped_nsobject.h" #include "flutter/shell/common/shell.h" @@ -16,7 +17,8 @@ namespace shell { class FlutterPlatformViewsController : public flow::ExternalViewEmbedder { public: - FlutterPlatformViewsController(NSObject* messenger); + FlutterPlatformViewsController(NSObject* messenger, + FlutterView* flutter_view); void RegisterViewFactory(NSObject* factory, NSString* factoryId); @@ -24,6 +26,7 @@ class FlutterPlatformViewsController : public flow::ExternalViewEmbedder { private: fml::scoped_nsobject channel_; + fml::scoped_nsobject flutter_view_; std::map>> factories_; std::map> views_; diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index 3636899fa4700..31c91871f88f0 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -113,7 +113,8 @@ - (void)performCommonViewControllerInitialization { _statusBarStyle = UIStatusBarStyleDefault; [self setupNotificationCenterObservers]; - _platformViewsController.reset(new shell::FlutterPlatformViewsController(_engine.get())); + _platformViewsController.reset( + new shell::FlutterPlatformViewsController(_engine.get(), _flutterView.get())); } - (fml::scoped_nsobject)engine {