Flutter Engine
 
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)
 

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

19 android_context_(android_context),
20 jni_facade_(std::move(jni_facade)),
21 surface_factory_(std::move(surface_factory)),
22 surface_pool_(
23 std::make_unique<SurfacePool>(/*use_new_surface_methods=*/false)),
24 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 207 of file external_view_embedder.cc.

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

◆ CancelFrame()

void flutter::AndroidExternalViewEmbedder::CancelFrame ( )
overridevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 234 of file external_view_embedder.cc.

234 {
235 Reset();
236}

Referenced by PostPrerollAction().

◆ CompositeEmbeddedView()

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

Implements flutter::ExternalViewEmbedder.

Definition at line 48 of file external_view_embedder.cc.

48 {
49 if (slices_.count(view_id) == 1) {
50 return slices_.at(view_id)->canvas();
51 }
52 return nullptr;
53}
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 239 of file external_view_embedder.cc.

241 {
242 surface_pool_->RecycleLayers();
243 // JNI method must be called on the platform thread.
244 if (raster_thread_merger->IsOnPlatformThread()) {
245 jni_facade_->FlutterViewEndFrame();
246 }
247}

◆ GetRootCanvas()

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

Implements flutter::ExternalViewEmbedder.

Definition at line 194 of file external_view_embedder.cc.

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

◆ GetViewRect()

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

Definition at line 55 of file external_view_embedder.cc.

55 {
56 const EmbeddedViewParams& params = view_params_.at(view_id);
57 // TODO(egarciad): The rect should be computed from the mutator stack.
58 // (Clipping is missing)
59 // https://github.com/flutter/flutter/issues/59821
60 return params.finalBoundingRect();
61}
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 162 of file external_view_embedder.cc.

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

219 {
220 Reset();
221
222 // The surface size changed. Therefore, destroy existing surfaces as
223 // the existing surfaces in the pool can't be recycled.
224 if (frame_size_ != frame_size) {
225 DestroySurfaces();
226 }
227 surface_pool_->SetFrameSize(frame_size);
228
229 frame_size_ = frame_size;
230 device_pixel_ratio_ = device_pixel_ratio;
231}

◆ PrerollCompositeEmbeddedView()

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

Definition at line 27 of file external_view_embedder.cc.

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

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

250 {
251 return true;
252}

◆ Teardown()

void flutter::AndroidExternalViewEmbedder::Teardown ( )
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 255 of file external_view_embedder.cc.

255 {
256 DestroySurfaces();
257}

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