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

#include <external_view_embedder.h>

Inheritance diagram for flutter::AndroidExternalViewEmbedder:
flutter::ExternalViewEmbedder

Public Member Functions

 AndroidExternalViewEmbedder (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
 
DlRect GetViewRect (int64_t view_id) const
 
- 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)
 

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|.

Definition at line 29 of file external_view_embedder.h.

Constructor & Destructor Documentation

◆ AndroidExternalViewEmbedder()

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

Definition at line 14 of file external_view_embedder.cc.

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

Member Function Documentation

◆ BeginFrame()

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

Implements flutter::ExternalViewEmbedder.

Definition at line 209 of file external_view_embedder.cc.

211 {
212 // JNI method must be called on the platform thread.
213 if (raster_thread_merger->IsOnPlatformThread()) {
214 jni_facade_->FlutterViewBeginFrame();
215 }
216}

◆ CancelFrame()

void flutter::AndroidExternalViewEmbedder::CancelFrame ( )
overridevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 244 of file external_view_embedder.cc.

244 {
245 Reset();
246}

Referenced by PostPrerollAction().

◆ CompositeEmbeddedView()

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

Implements flutter::ExternalViewEmbedder.

Definition at line 49 of file external_view_embedder.cc.

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

References view_id.

◆ EndFrame()

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

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 249 of file external_view_embedder.cc.

251 {
252 surface_pool_->RecycleLayers();
253 // JNI method must be called on the platform thread.
254 if (raster_thread_merger->IsOnPlatformThread()) {
255 jni_facade_->FlutterViewEndFrame();
256 }
257}

◆ GetRootCanvas()

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

Implements flutter::ExternalViewEmbedder.

Definition at line 196 of file external_view_embedder.cc.

196 {
197 // On Android, the root surface is created from the on-screen render target.
198 return nullptr;
199}

◆ GetViewRect()

DlRect flutter::AndroidExternalViewEmbedder::GetViewRect ( int64_t  view_id) const

Definition at line 56 of file external_view_embedder.cc.

56 {
57 const EmbeddedViewParams& params = view_params_.at(view_id);
58 // TODO(egarciad): The rect should be computed from the mutator stack.
59 // (Clipping is missing)
60 // https://github.com/flutter/flutter/issues/59821
61 return params.finalBoundingRect();
62}
const EmbeddedViewParams * params

References params, and view_id.

Referenced by SubmitFlutterView().

◆ PostPrerollAction()

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

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 164 of file external_view_embedder.cc.

165 {
166 if (!FrameHasPlatformLayers()) {
168 }
169 if (!raster_thread_merger->IsMerged()) {
170 // The raster thread merger may be disabled if the rasterizer is being
171 // created or teared down.
172 //
173 // In such cases, the current frame is dropped, and a new frame is attempted
174 // with the same layer tree.
175 //
176 // Eventually, the frame is submitted once this method returns `kSuccess`.
177 // At that point, the raster tasks are handled on the platform thread.
178 CancelFrame();
179 raster_thread_merger->MergeWithLease(kDefaultMergedLeaseDuration);
181 }
182 raster_thread_merger->ExtendLeaseTo(kDefaultMergedLeaseDuration);
183 // Surface switch requires to resubmit the frame.
184 // TODO(egarciad): https://github.com/flutter/flutter/issues/65652
185 if (previous_frame_view_count_ == 0) {
187 }
189}
void ExtendLeaseTo(size_t lease_term)
void MergeWithLease(size_t lease_term)

References CancelFrame(), flutter::kResubmitFrame, flutter::kSkipAndRetryFrame, and flutter::kSuccess.

◆ PrepareFlutterView()

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

Implements flutter::ExternalViewEmbedder.

Definition at line 219 of file external_view_embedder.cc.

221 {
222 Reset();
223
224 // The surface size changed. Therefore, destroy existing surfaces as
225 // the existing surfaces in the pool can't be recycled.
226 if (frame_size_ != frame_size) {
227 DestroySurfaces();
228
229 // This should not block to prevent deadlocks with
230 // setViewportMetrics.
232 [jni_facade = jni_facade_, frame_size = frame_size]() {
233 jni_facade->MaybeResizeSurfaceView(frame_size.width,
234 frame_size.height);
235 }));
236 }
237 surface_pool_->SetFrameSize(frame_size);
238
239 frame_size_ = frame_size;
240 device_pixel_ratio_ = device_pixel_ratio;
241}
fml::RefPtr< fml::TaskRunner > GetPlatformTaskRunner() const
virtual void PostTask(const fml::closure &task) override
internal::CopyableLambda< T > MakeCopyable(T lambda)

References flutter::TaskRunners::GetPlatformTaskRunner(), impeller::TSize< T >::height, fml::MakeCopyable(), fml::TaskRunner::PostTask(), and impeller::TSize< T >::width.

◆ PrerollCompositeEmbeddedView()

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

Definition at line 28 of file external_view_embedder.cc.

30 {
31 TRACE_EVENT0("flutter",
32 "AndroidExternalViewEmbedder::PrerollCompositeEmbeddedView");
33
34 DlRect view_bounds = DlRect::MakeSize(frame_size_);
35 std::unique_ptr<EmbedderViewSlice> view;
36 view = std::make_unique<DisplayListEmbedderViewSlice>(view_bounds);
37 slices_.insert_or_assign(view_id, std::move(view));
38
39 composition_order_.push_back(view_id);
40 // Update params only if they changed.
41 if (view_params_.count(view_id) == 1 &&
42 view_params_.at(view_id) == *params.get()) {
43 return;
44 }
45 view_params_.insert_or_assign(view_id, EmbeddedViewParams(*params.get()));
46}
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::AndroidExternalViewEmbedder::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 65 of file external_view_embedder.cc.

69 {
70 TRACE_EVENT0("flutter", "AndroidExternalViewEmbedder::SubmitFlutterView");
71 // TODO(dkwingsmt): This class only supports rendering into the implicit view.
72 // Properly support multi-view in the future.
73 FML_DCHECK(flutter_view_id == kFlutterImplicitViewId);
74
75 if (!FrameHasPlatformLayers()) {
76 frame->Submit();
77 return;
78 }
79
80 std::unordered_map<int64_t, DlRect> view_rects;
81 for (auto platform_id : composition_order_) {
82 view_rects[platform_id] = GetViewRect(platform_id);
83 }
84
85 std::unordered_map<int64_t, DlRect> overlay_layers =
86 SliceViews(frame->Canvas(), //
87 composition_order_, //
88 slices_, //
89 view_rects, //
90 {} //
91 );
92
93 // Submit the background canvas frame before switching the GL context to
94 // the overlay surfaces.
95 //
96 // Skip a frame if the embedding is switching surfaces, and indicate in
97 // `PostPrerollAction` that this frame must be resubmitted.
98 auto should_submit_current_frame = previous_frame_view_count_ > 0;
99 if (should_submit_current_frame) {
100 frame->Submit();
101 }
102
103 for (int64_t view_id : composition_order_) {
104 DlRect view_rect = GetViewRect(view_id);
105 const EmbeddedViewParams& params = view_params_.at(view_id);
106 // Display the platform view. If it's already displayed, then it's
107 // just positioned and sized.
108 jni_facade_->FlutterViewOnDisplayPlatformView(
109 view_id, //
110 view_rect.GetX(), //
111 view_rect.GetY(), //
112 view_rect.GetWidth(), //
113 view_rect.GetHeight(), //
114 params.sizePoints().width * device_pixel_ratio_,
115 params.sizePoints().height * device_pixel_ratio_,
116 params.mutatorsStack() //
117 );
118 std::unordered_map<int64_t, DlRect>::const_iterator overlay =
119 overlay_layers.find(view_id);
120 if (overlay == overlay_layers.end()) {
121 continue;
122 }
123 std::unique_ptr<SurfaceFrame> frame =
124 CreateSurfaceIfNeeded(context, //
125 view_id, //
126 slices_.at(view_id).get(), //
127 overlay->second //
128 );
129 if (should_submit_current_frame) {
130 frame->Submit();
131 }
132 }
133}
DlRect GetViewRect(int64_t view_id) const
#define FML_DCHECK(condition)
Definition logging.h:122
constexpr int64_t kFlutterImplicitViewId
Definition constants.h:35
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, const std::unordered_set< int64_t > &views_with_underlay_preserved)
Compute the required overlay layers and clip the view slices according to the size and position of th...

References FML_DCHECK, impeller::TRect< T >::GetHeight(), GetViewRect(), impeller::TRect< T >::GetWidth(), impeller::TRect< T >::GetX(), impeller::TRect< T >::GetY(), flutter::kFlutterImplicitViewId, params, flutter::SliceViews(), TRACE_EVENT0, and view_id.

◆ SupportsDynamicThreadMerging()

bool flutter::AndroidExternalViewEmbedder::SupportsDynamicThreadMerging ( )
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 260 of file external_view_embedder.cc.

260 {
261 return true;
262}

◆ Teardown()

void flutter::AndroidExternalViewEmbedder::Teardown ( )
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 265 of file external_view_embedder.cc.

265 {
266 DestroySurfaces();
267}

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