Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 787b9c5

Browse files
Break the reference cycle between the surface factory and the external view embedder (#21918)
See flutter/flutter#68315
1 parent 5bd7260 commit 787b9c5

File tree

2 files changed

+19
-23
lines changed

2 files changed

+19
-23
lines changed

shell/platform/android/platform_view_android.cc

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,28 @@ namespace flutter {
3030

3131
AndroidSurfaceFactoryImpl::AndroidSurfaceFactoryImpl(
3232
std::shared_ptr<AndroidContext> context,
33-
std::shared_ptr<PlatformViewAndroidJNI> jni_facade) {
34-
android_context_ = context;
35-
jni_facade_ = jni_facade;
36-
}
33+
std::shared_ptr<PlatformViewAndroidJNI> jni_facade,
34+
std::weak_ptr<AndroidExternalViewEmbedder> external_view_embedder)
35+
: android_context_(context), jni_facade_(jni_facade),
36+
external_view_embedder_(external_view_embedder) {}
3737

3838
AndroidSurfaceFactoryImpl::~AndroidSurfaceFactoryImpl() = default;
3939

40-
void AndroidSurfaceFactoryImpl::SetExternalViewEmbedder(
41-
std::shared_ptr<AndroidExternalViewEmbedder> external_view_embedder) {
42-
external_view_embedder_ = external_view_embedder;
43-
}
44-
4540
std::unique_ptr<AndroidSurface> AndroidSurfaceFactoryImpl::CreateSurface() {
46-
FML_CHECK(external_view_embedder_);
41+
std::shared_ptr<AndroidExternalViewEmbedder> external_view_embedder =
42+
external_view_embedder_.lock();
43+
FML_CHECK(external_view_embedder);
4744
switch (android_context_->RenderingApi()) {
4845
case AndroidRenderingAPI::kSoftware:
4946
return std::make_unique<AndroidSurfaceSoftware>(
50-
android_context_, jni_facade_, external_view_embedder_);
47+
android_context_, jni_facade_, external_view_embedder);
5148
case AndroidRenderingAPI::kOpenGLES:
5249
return std::make_unique<AndroidSurfaceGL>(android_context_, jni_facade_,
53-
external_view_embedder_);
50+
external_view_embedder);
5451
case AndroidRenderingAPI::kVulkan:
5552
#if SHELL_ENABLE_VULKAN
5653
return std::make_unique<AndroidSurfaceVulkan>(
57-
android_context_, jni_facade_, external_view_embedder_);
54+
android_context_, jni_facade_, external_view_embedder);
5855
#endif // SHELL_ENABLE_VULKAN
5956
default:
6057
return nullptr;
@@ -87,11 +84,12 @@ PlatformViewAndroid::PlatformViewAndroid(
8784
FML_CHECK(android_context && android_context->IsValid())
8885
<< "Could not create an Android context.";
8986

87+
external_view_embedder_ =
88+
std::make_shared<AndroidExternalViewEmbedder>(android_context, jni_facade,
89+
surface_factory_);
9090
surface_factory_ =
91-
std::make_shared<AndroidSurfaceFactoryImpl>(android_context, jni_facade);
92-
surface_factory_->SetExternalViewEmbedder(
93-
std::make_shared<AndroidExternalViewEmbedder>(android_context, jni_facade,
94-
surface_factory_));
91+
std::make_shared<AndroidSurfaceFactoryImpl>(android_context, jni_facade,
92+
external_view_embedder_);
9593

9694
android_surface_ = surface_factory_->CreateSurface();
9795
FML_CHECK(android_surface_ && android_surface_->IsValid())

shell/platform/android/platform_view_android.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,17 @@ namespace flutter {
2525
class AndroidSurfaceFactoryImpl : public AndroidSurfaceFactory {
2626
public:
2727
AndroidSurfaceFactoryImpl(std::shared_ptr<AndroidContext> context,
28-
std::shared_ptr<PlatformViewAndroidJNI> jni_facade);
28+
std::shared_ptr<PlatformViewAndroidJNI> jni_facade,
29+
std::weak_ptr<AndroidExternalViewEmbedder> external_view_embedder);
2930

3031
~AndroidSurfaceFactoryImpl() override;
3132

3233
std::unique_ptr<AndroidSurface> CreateSurface() override;
3334

34-
void SetExternalViewEmbedder(
35-
std::shared_ptr<AndroidExternalViewEmbedder> external_view_embedder);
36-
3735
private:
3836
std::shared_ptr<AndroidContext> android_context_;
3937
std::shared_ptr<PlatformViewAndroidJNI> jni_facade_;
40-
std::shared_ptr<AndroidExternalViewEmbedder> external_view_embedder_;
41-
38+
std::weak_ptr<AndroidExternalViewEmbedder> external_view_embedder_;
4239
};
4340

4441
class PlatformViewAndroid final : public PlatformView {
@@ -99,6 +96,7 @@ class PlatformViewAndroid final : public PlatformView {
9996

10097
private:
10198
const std::shared_ptr<PlatformViewAndroidJNI> jni_facade_;
99+
std::shared_ptr<AndroidExternalViewEmbedder> external_view_embedder_;
102100
std::shared_ptr<AndroidSurfaceFactoryImpl> surface_factory_;
103101

104102
PlatformViewAndroidDelegate platform_view_android_delegate_;

0 commit comments

Comments
 (0)