Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
flutter::AndroidExternalViewEmbedder2 Class Referencefinal

#include <external_view_embedder_2.h>

Inheritance diagram for flutter::AndroidExternalViewEmbedder2:
flutter::ExternalViewEmbedder

Public Member Functions

 AndroidExternalViewEmbedder2 (const AndroidContext &android_context, std::shared_ptr< PlatformViewAndroidJNI > jni_facade, std::shared_ptr< AndroidSurfaceFactory > surface_factory, const TaskRunners &task_runners)
 
void PrerollCompositeEmbeddedView (int64_t view_id, std::unique_ptr< flutter::EmbeddedViewParams > params) override
 
DlCanvasCompositeEmbeddedView (int64_t view_id) override
 
void SubmitFlutterView (int64_t flutter_view_id, GrDirectContext *context, const std::shared_ptr< impeller::AiksContext > &aiks_context, std::unique_ptr< SurfaceFrame > frame) override
 
PostPrerollResult PostPrerollAction (const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger) override
 
DlCanvasGetRootCanvas () override
 
void BeginFrame (GrDirectContext *context, const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger) override
 
void PrepareFlutterView (DlISize frame_size, double device_pixel_ratio) override
 
void CancelFrame () override
 
void EndFrame (bool should_resubmit_frame, const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger) override
 
bool SupportsDynamicThreadMerging () override
 
void Teardown () override
 
- Public Member Functions inherited from flutter::ExternalViewEmbedder
 ExternalViewEmbedder ()=default
 
virtual ~ExternalViewEmbedder ()=default
 
virtual void CollectView (int64_t view_id)
 
virtual void PrerollCompositeEmbeddedView (int64_t platform_view_id, std::unique_ptr< EmbeddedViewParams > params)=0
 
void SetUsedThisFrame (bool used_this_frame)
 
bool GetUsedThisFrame () const
 
virtual void PushVisitedPlatformView (int64_t platform_view_id)
 
virtual void PushFilterToVisitedPlatformViews (const std::shared_ptr< DlImageFilter > &filter, const DlRect &filter_rect)
 
virtual void PushClipRectToVisitedPlatformViews (const DlRect &clip_rect)
 
virtual void PushClipRRectToVisitedPlatformViews (const DlRoundRect &clip_rrect)
 
virtual void PushClipRSuperellipseToVisitedPlatformViews (const DlRoundSuperellipse &clip_rse)
 
virtual void PushClipPathToVisitedPlatformViews (const DlPath &clip_path)
 

Static Public Member Functions

static DlRect GetViewRect (int64_t view_id, const std::unordered_map< int64_t, EmbeddedViewParams > &view_params)
 

Detailed Description

Allows to embed Android views into a Flutter application.

This class calls Java methods via |PlatformViewAndroidJNI| to manage the lifecycle of the Android view corresponding to |flutter::PlatformViewLayer|.

It also orchestrates overlay surfaces. These are Android views that render above (by Z order) the Android view corresponding to |flutter::PlatformViewLayer|.

This implementation of the external view embedder is designed only to use HC++ mode. Mixing old HC modes is not supported, but either of the texture composition based platform views can be used with either mode.

Definition at line 34 of file external_view_embedder_2.h.

Constructor & Destructor Documentation

◆ AndroidExternalViewEmbedder2()

flutter::AndroidExternalViewEmbedder2::AndroidExternalViewEmbedder2 ( const AndroidContext android_context,
std::shared_ptr< PlatformViewAndroidJNI jni_facade,
std::shared_ptr< AndroidSurfaceFactory surface_factory,
const TaskRunners task_runners 
)

Definition at line 15 of file external_view_embedder_2.cc.

21 android_context_(android_context),
22 jni_facade_(std::move(jni_facade)),
23 surface_factory_(std::move(surface_factory)),
24 surface_pool_(
25 std::make_unique<SurfacePool>(/*use_new_surface_methods=*/true)),
26 task_runners_(task_runners) {}

Member Function Documentation

◆ BeginFrame()

void flutter::AndroidExternalViewEmbedder2::BeginFrame ( GrDirectContext *  context,
const fml::RefPtr< fml::RasterThreadMerger > &  raster_thread_merger 
)
overridevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 232 of file external_view_embedder_2.cc.

234 {}

◆ CancelFrame()

void flutter::AndroidExternalViewEmbedder2::CancelFrame ( )
overridevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 255 of file external_view_embedder_2.cc.

255 {
256 Reset();
257}

◆ CompositeEmbeddedView()

DlCanvas * flutter::AndroidExternalViewEmbedder2::CompositeEmbeddedView ( int64_t  view_id)
overridevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 50 of file external_view_embedder_2.cc.

50 {
51 if (slices_.count(view_id) == 1) {
52 return slices_.at(view_id)->canvas();
53 }
54 return nullptr;
55}
G_BEGIN_DECLS FlutterViewId view_id

References view_id.

◆ EndFrame()

void flutter::AndroidExternalViewEmbedder2::EndFrame ( bool  should_resubmit_frame,
const fml::RefPtr< fml::RasterThreadMerger > &  raster_thread_merger 
)
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 260 of file external_view_embedder_2.cc.

262 {}

◆ GetRootCanvas()

DlCanvas * flutter::AndroidExternalViewEmbedder2::GetRootCanvas ( )
overridevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 221 of file external_view_embedder_2.cc.

221 {
222 // On Android, the root surface is created from the on-screen render target.
223 return nullptr;
224}

◆ GetViewRect()

DlRect flutter::AndroidExternalViewEmbedder2::GetViewRect ( int64_t  view_id,
const std::unordered_map< int64_t, EmbeddedViewParams > &  view_params 
)
static

Definition at line 57 of file external_view_embedder_2.cc.

59 {
60 const EmbeddedViewParams& params = view_params.at(view_id);
61 // https://github.com/flutter/flutter/issues/59821
62 return params.finalBoundingRect();
63}
const EmbeddedViewParams * params

References flutter::EmbeddedViewParams::finalBoundingRect(), params, and view_id.

Referenced by SubmitFlutterView().

◆ PostPrerollAction()

PostPrerollResult flutter::AndroidExternalViewEmbedder2::PostPrerollAction ( const fml::RefPtr< fml::RasterThreadMerger > &  raster_thread_merger)
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 211 of file external_view_embedder_2.cc.

References flutter::kSuccess.

◆ PrepareFlutterView()

void flutter::AndroidExternalViewEmbedder2::PrepareFlutterView ( DlISize  frame_size,
double  device_pixel_ratio 
)
overridevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 237 of file external_view_embedder_2.cc.

239 {
240 Reset();
241
242 // The surface size changed. Therefore, destroy existing surfaces as
243 // the existing surfaces in the pool can't be recycled.
244 if (frame_size_ != frame_size) {
245 DestroySurfaces();
246 }
247 surface_pool_->SetFrameSize(frame_size);
248 jni_facade_->MaybeResizeSurfaceView(frame_size.width, frame_size.height);
249
250 frame_size_ = frame_size;
251 device_pixel_ratio_ = device_pixel_ratio;
252}

References impeller::TSize< T >::height, and impeller::TSize< T >::width.

◆ PrerollCompositeEmbeddedView()

void flutter::AndroidExternalViewEmbedder2::PrerollCompositeEmbeddedView ( int64_t  view_id,
std::unique_ptr< flutter::EmbeddedViewParams params 
)
override

Definition at line 29 of file external_view_embedder_2.cc.

31 {
32 TRACE_EVENT0("flutter",
33 "AndroidExternalViewEmbedder2::PrerollCompositeEmbeddedView");
34
35 DlRect view_bounds = DlRect::MakeSize(frame_size_);
36 std::unique_ptr<EmbedderViewSlice> view;
37 view = std::make_unique<DisplayListEmbedderViewSlice>(view_bounds);
38 slices_.insert_or_assign(view_id, std::move(view));
39
40 composition_order_.push_back(view_id);
41 // Update params only if they changed.
42 if (view_params_.count(view_id) == 1 &&
43 view_params_.at(view_id) == *params.get()) {
44 return;
45 }
46 view_params_.insert_or_assign(view_id, EmbeddedViewParams(*params.get()));
47}
FlView * view
impeller::Rect DlRect
static constexpr TRect MakeSize(const TSize< U > &size)
Definition rect.h:150
#define TRACE_EVENT0(category_group, name)

References impeller::TRect< Scalar >::MakeSize(), params, TRACE_EVENT0, view, and view_id.

◆ SubmitFlutterView()

void flutter::AndroidExternalViewEmbedder2::SubmitFlutterView ( int64_t  flutter_view_id,
GrDirectContext *  context,
const std::shared_ptr< impeller::AiksContext > &  aiks_context,
std::unique_ptr< SurfaceFrame frame 
)
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 66 of file external_view_embedder_2.cc.

70 {
71 TRACE_EVENT0("flutter", "AndroidExternalViewEmbedder2::SubmitFlutterView");
72
73 if (!FrameHasPlatformLayers()) {
74 frame->Submit();
76 [this, jni_facade = jni_facade_,
77 views_visible_last_frame = views_visible_last_frame_]() {
78 // This pointer is guaranteed to not be dangling as long as
79 // DestroySurfaces is called before the embedder is deleted. See
80 // https://github.com/flutter/flutter/pull/176742#discussion_r2415229396.
81 this->HideOverlayLayerIfNeeded();
82 for (int64_t view_id : views_visible_last_frame) {
83 jni_facade->hidePlatformView2(view_id);
84 }
85
86 jni_facade->swapTransaction();
87 jni_facade->onEndFrame2();
88 }));
89 views_visible_last_frame_.clear();
90 return;
91 }
92
93 std::unordered_map<int64_t, DlRect> view_rects;
94 for (auto platform_id : composition_order_) {
95 view_rects[platform_id] = GetViewRect(platform_id, view_params_);
96 }
97
98 std::unordered_map<int64_t, DlRect> overlay_layers =
99 SliceViews(frame->Canvas(), //
100 composition_order_, //
101 slices_, //
102 view_rects //
103 );
104
105 // If there is no overlay Surface, initialize one on the platform thread. This
106 // will only be done once per application launch, as the singular overlay
107 // surface is never released.
108 if (!surface_pool_->HasLayers()) {
109 std::shared_ptr<fml::CountDownLatch> latch =
110 std::make_shared<fml::CountDownLatch>(1u);
111 task_runners_.GetPlatformTaskRunner()->PostTask(
112 fml::MakeCopyable([&, latch]() {
113 surface_pool_->GetLayer(context, android_context_, jni_facade_,
114 surface_factory_);
115 latch->CountDown();
116 }));
117 latch->Wait();
118 }
119 surface_pool_->ResetLayers();
120
121 // Create Overlay frame. If overlay surface creation failed,
122 // all this work must be skipped.
123 std::unique_ptr<SurfaceFrame> overlay_frame;
124 if (surface_pool_->HasLayers()) {
125 for (size_t i = 0; i < composition_order_.size(); i++) {
126 int64_t view_id = composition_order_[i];
127 std::unordered_map<int64_t, DlRect>::const_iterator overlay =
128 overlay_layers.find(view_id);
129
130 if (overlay == overlay_layers.end()) {
131 continue;
132 }
133 if (overlay_frame == nullptr) {
134 std::shared_ptr<OverlayLayer> layer = surface_pool_->GetLayer(
135 context, android_context_, jni_facade_, surface_factory_);
136 overlay_frame = layer->surface->AcquireFrame(frame_size_);
137 overlay_frame->Canvas()->Clear(flutter::DlColor::kTransparent());
138 }
139
140 DlCanvas* overlay_canvas = overlay_frame->Canvas();
141 int restore_count = overlay_canvas->GetSaveCount();
142 overlay_canvas->Save();
143 overlay_canvas->ClipRect(overlay->second);
144
145 // For all following platform views that would cover this overlay,
146 // emulate the effect by adding a difference clip. This makes the
147 // overlays appear as if they are under the platform view, when in
148 // reality there is only a single layer.
149 for (size_t j = i + 1; j < composition_order_.size(); j++) {
150 DlRect view_rect = GetViewRect(composition_order_[j], view_params_);
151 overlay_canvas->ClipRect(view_rect, DlClipOp::kDifference);
152 }
153
154 slices_[view_id]->render_into(overlay_canvas);
155 overlay_canvas->RestoreToCount(restore_count);
156 }
157 }
158 bool overlay_layer_has_content_this_frame_;
159 if (overlay_frame != nullptr) {
160 overlay_frame->set_submit_info({.frame_boundary = false});
161 overlay_frame->Submit();
162 overlay_layer_has_content_this_frame_ = true;
163 } else {
164 overlay_layer_has_content_this_frame_ = false;
165 }
166
167 frame->Submit();
169 [&, composition_order = composition_order_, view_params = view_params_,
170 jni_facade = jni_facade_, device_pixel_ratio = device_pixel_ratio_,
171 slices = std::move(slices_),
172 views_visible_last_frame = views_visible_last_frame_,
173 overlay_layer_has_content_this_frame_]() mutable -> void {
174 if (overlay_layer_has_content_this_frame_) {
175 ShowOverlayLayerIfNeeded();
176 } else {
177 HideOverlayLayerIfNeeded();
178 }
179 jni_facade->swapTransaction();
180
181 for (int64_t view_id : composition_order) {
182 DlRect view_rect = GetViewRect(view_id, view_params);
183 const EmbeddedViewParams& params = view_params.at(view_id);
184 jni_facade->onDisplayPlatformView2(
185 view_id, //
186 view_rect.GetX(), //
187 view_rect.GetY(), //
188 view_rect.GetWidth(), //
189 view_rect.GetHeight(), //
190 params.sizePoints().width * device_pixel_ratio,
191 params.sizePoints().height * device_pixel_ratio,
192 params.mutatorsStack() //
193 );
194 // Remove from views visible last frame, so we can hide the rest.
195 views_visible_last_frame.erase(view_id);
196 }
197 // Hide views that were visible last frame, but not in this frame.
198 for (int64_t view_id : views_visible_last_frame) {
199 jni_facade->hidePlatformView2(view_id);
200 }
201
202 jni_facade_->onEndFrame2();
203 }));
204
205 views_visible_last_frame_.clear();
206 views_visible_last_frame_.insert(composition_order_.begin(),
207 composition_order_.end());
208}
static DlRect GetViewRect(int64_t view_id, const std::unordered_map< int64_t, EmbeddedViewParams > &view_params)
virtual int GetSaveCount() const =0
fml::RefPtr< fml::TaskRunner > GetPlatformTaskRunner() const
virtual void PostTask(const fml::closure &task) override
std::unordered_map< int64_t, DlRect > SliceViews(DlCanvas *background_canvas, const std::vector< int64_t > &composition_order, const std::unordered_map< int64_t, std::unique_ptr< EmbedderViewSlice > > &slices, const std::unordered_map< int64_t, DlRect > &view_rects)
Compute the required overlay layers and clip the view slices according to the size and position of th...
internal::CopyableLambda< T > MakeCopyable(T lambda)
flutter::DlCanvas DlCanvas
static constexpr DlColor kTransparent()
Definition dl_color.h:68

References flutter::DlCanvas::ClipRect(), impeller::TRect< T >::GetHeight(), flutter::TaskRunners::GetPlatformTaskRunner(), flutter::DlCanvas::GetSaveCount(), GetViewRect(), impeller::TRect< T >::GetWidth(), impeller::TRect< T >::GetX(), impeller::TRect< T >::GetY(), i, flutter::kDifference, flutter::DlColor::kTransparent(), fml::MakeCopyable(), params, fml::TaskRunner::PostTask(), flutter::DlCanvas::RestoreToCount(), flutter::DlCanvas::Save(), flutter::SliceViews(), TRACE_EVENT0, and view_id.

◆ SupportsDynamicThreadMerging()

bool flutter::AndroidExternalViewEmbedder2::SupportsDynamicThreadMerging ( )
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 265 of file external_view_embedder_2.cc.

265 {
266 return false;
267}

◆ Teardown()

void flutter::AndroidExternalViewEmbedder2::Teardown ( )
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 270 of file external_view_embedder_2.cc.

270 {
271 DestroySurfaces();
272}

The documentation for this class was generated from the following files: