diff --git a/shell/platform/android/platform_view_android.cc b/shell/platform/android/platform_view_android.cc index 8ecba33be57f4..0fc9af5c59b51 100644 --- a/shell/platform/android/platform_view_android.cc +++ b/shell/platform/android/platform_view_android.cc @@ -30,31 +30,28 @@ namespace flutter { AndroidSurfaceFactoryImpl::AndroidSurfaceFactoryImpl( std::shared_ptr context, - std::shared_ptr jni_facade) { - android_context_ = context; - jni_facade_ = jni_facade; -} + std::shared_ptr jni_facade, + std::weak_ptr external_view_embedder) + : android_context_(context), jni_facade_(jni_facade), + external_view_embedder_(external_view_embedder) {} AndroidSurfaceFactoryImpl::~AndroidSurfaceFactoryImpl() = default; -void AndroidSurfaceFactoryImpl::SetExternalViewEmbedder( - std::shared_ptr external_view_embedder) { - external_view_embedder_ = external_view_embedder; -} - std::unique_ptr AndroidSurfaceFactoryImpl::CreateSurface() { - FML_CHECK(external_view_embedder_); + std::shared_ptr external_view_embedder = + external_view_embedder_.lock(); + FML_CHECK(external_view_embedder); switch (android_context_->RenderingApi()) { case AndroidRenderingAPI::kSoftware: return std::make_unique( - android_context_, jni_facade_, external_view_embedder_); + android_context_, jni_facade_, external_view_embedder); case AndroidRenderingAPI::kOpenGLES: return std::make_unique(android_context_, jni_facade_, - external_view_embedder_); + external_view_embedder); case AndroidRenderingAPI::kVulkan: #if SHELL_ENABLE_VULKAN return std::make_unique( - android_context_, jni_facade_, external_view_embedder_); + android_context_, jni_facade_, external_view_embedder); #endif // SHELL_ENABLE_VULKAN default: return nullptr; @@ -87,11 +84,12 @@ PlatformViewAndroid::PlatformViewAndroid( FML_CHECK(android_context && android_context->IsValid()) << "Could not create an Android context."; + external_view_embedder_ = + std::make_shared(android_context, jni_facade, + surface_factory_); surface_factory_ = - std::make_shared(android_context, jni_facade); - surface_factory_->SetExternalViewEmbedder( - std::make_shared(android_context, jni_facade, - surface_factory_)); + std::make_shared(android_context, jni_facade, + external_view_embedder_); android_surface_ = surface_factory_->CreateSurface(); FML_CHECK(android_surface_ && android_surface_->IsValid()) diff --git a/shell/platform/android/platform_view_android.h b/shell/platform/android/platform_view_android.h index 317784c729a96..2ae51464df3c2 100644 --- a/shell/platform/android/platform_view_android.h +++ b/shell/platform/android/platform_view_android.h @@ -25,20 +25,17 @@ namespace flutter { class AndroidSurfaceFactoryImpl : public AndroidSurfaceFactory { public: AndroidSurfaceFactoryImpl(std::shared_ptr context, - std::shared_ptr jni_facade); + std::shared_ptr jni_facade, + std::weak_ptr external_view_embedder); ~AndroidSurfaceFactoryImpl() override; std::unique_ptr CreateSurface() override; - void SetExternalViewEmbedder( - std::shared_ptr external_view_embedder); - private: std::shared_ptr android_context_; std::shared_ptr jni_facade_; - std::shared_ptr external_view_embedder_; - + std::weak_ptr external_view_embedder_; }; class PlatformViewAndroid final : public PlatformView { @@ -99,6 +96,7 @@ class PlatformViewAndroid final : public PlatformView { private: const std::shared_ptr jni_facade_; + std::shared_ptr external_view_embedder_; std::shared_ptr surface_factory_; PlatformViewAndroidDelegate platform_view_android_delegate_;