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 208 of file external_view_embedder.cc.

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

◆ CancelFrame()

void flutter::AndroidExternalViewEmbedder::CancelFrame ( )
overridevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 240 of file external_view_embedder.cc.

240 {
241 Reset();
242}

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 245 of file external_view_embedder.cc.

247 {
248 surface_pool_->RecycleLayers();
249 // JNI method must be called on the platform thread.
250 if (raster_thread_merger->IsOnPlatformThread()) {
251 jni_facade_->FlutterViewEndFrame();
252 }
253}

◆ GetRootCanvas()

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

Implements flutter::ExternalViewEmbedder.

Definition at line 195 of file external_view_embedder.cc.

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

◆ 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 163 of file external_view_embedder.cc.

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

220 {
221 Reset();
222
223 // The surface size changed. Therefore, destroy existing surfaces as
224 // the existing surfaces in the pool can't be recycled.
225 if (frame_size_ != frame_size) {
226 DestroySurfaces();
227 }
228 surface_pool_->SetFrameSize(frame_size);
229
230 task_runners_.GetPlatformTaskRunner()->PostTask(
231 fml::MakeCopyable([jni_facade = jni_facade_, frame_size = frame_size]() {
232 jni_facade->MaybeResizeSurfaceView(frame_size.width, frame_size.height);
233 }));
234
235 frame_size_ = frame_size;
236 device_pixel_ratio_ = device_pixel_ratio;
237}
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 // Submit the background canvas frame before switching the GL context to
93 // the overlay surfaces.
94 //
95 // Skip a frame if the embedding is switching surfaces, and indicate in
96 // `PostPrerollAction` that this frame must be resubmitted.
97 auto should_submit_current_frame = previous_frame_view_count_ > 0;
98 if (should_submit_current_frame) {
99 frame->Submit();
100 }
101
102 for (int64_t view_id : composition_order_) {
103 DlRect view_rect = GetViewRect(view_id);
104 const EmbeddedViewParams& params = view_params_.at(view_id);
105 // Display the platform view. If it's already displayed, then it's
106 // just positioned and sized.
107 jni_facade_->FlutterViewOnDisplayPlatformView(
108 view_id, //
109 view_rect.GetX(), //
110 view_rect.GetY(), //
111 view_rect.GetWidth(), //
112 view_rect.GetHeight(), //
113 params.sizePoints().width * device_pixel_ratio_,
114 params.sizePoints().height * device_pixel_ratio_,
115 params.mutatorsStack() //
116 );
117 std::unordered_map<int64_t, DlRect>::const_iterator overlay =
118 overlay_layers.find(view_id);
119 if (overlay == overlay_layers.end()) {
120 continue;
121 }
122 std::unique_ptr<SurfaceFrame> frame =
123 CreateSurfaceIfNeeded(context, //
124 view_id, //
125 slices_.at(view_id).get(), //
126 overlay->second //
127 );
128 if (should_submit_current_frame) {
129 frame->Submit();
130 }
131 }
132}
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)
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 256 of file external_view_embedder.cc.

256 {
257 return true;
258}

◆ Teardown()

void flutter::AndroidExternalViewEmbedder::Teardown ( )
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 261 of file external_view_embedder.cc.

261 {
262 DestroySurfaces();
263}

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