Flutter Engine
 
Loading...
Searching...
No Matches
flutter::PlatformConfiguration Class Referencefinal

A class for holding and distributing platform-level information to and from the Dart code in Flutter's framework. More...

#include <platform_configuration.h>

Public Member Functions

 PlatformConfiguration (PlatformConfigurationClient *client)
 Creates a new PlatformConfiguration, typically created by the RuntimeController.
 
 PlatformConfiguration (const PlatformConfiguration &)=delete
 
PlatformConfigurationoperator= (const PlatformConfiguration &)=delete
 
 ~PlatformConfiguration ()
 
PlatformConfigurationClientclient () const
 Access to the platform configuration client (which typically is implemented by the RuntimeController).
 
void DidCreateIsolate ()
 Called by the RuntimeController once it has created the root isolate, so that the PlatformController can get a handle to the 'dart:ui' library.
 
bool AddView (int64_t view_id, const ViewportMetrics &view_metrics)
 Notify the framework that a new view is available.
 
bool RemoveView (int64_t view_id)
 Notify the framework that a view is no longer available.
 
bool SendFocusEvent (const ViewFocusEvent &event)
 Notify the isolate that the focus state of a native view has changed.
 
bool SetEngineId (int64_t engine_id)
 Sets the opaque identifier of the engine.
 
bool UpdateViewMetrics (int64_t view_id, const ViewportMetrics &metrics)
 Update the view metrics for the specified view.
 
void UpdateDisplays (const std::vector< DisplayData > &displays)
 Update the specified display data in the framework.
 
void UpdateLocales (const std::vector< std::string > &locales)
 Update the specified locale data in the framework.
 
void UpdateUserSettingsData (const std::string &data)
 Update the user settings data in the framework.
 
void UpdateInitialLifecycleState (const std::string &data)
 Updates the lifecycle state data in the framework.
 
void UpdateSemanticsEnabled (bool enabled)
 Notifies the PlatformConfiguration that the embedder has expressed an opinion about whether the accessibility tree should be generated or not. This call originates in the platform view and is forwarded to the PlatformConfiguration here by the engine.
 
void UpdateAccessibilityFeatures (int32_t flags)
 Forward the preference of accessibility features that must be enabled in the semantics tree to the framwork.
 
void DispatchPlatformMessage (std::unique_ptr< PlatformMessage > message)
 Notifies the PlatformConfiguration that the client has sent it a message. This call originates in the platform view and has been forwarded through the engine to here.
 
void DispatchPointerDataPacket (const PointerDataPacket &packet)
 Notifies the PlatformConfiguration that the client has sent it pointer events. This call originates in the platform view and has been forwarded through the engine to here.
 
void DispatchSemanticsAction (int64_t view_id, int32_t node_id, SemanticsAction action, fml::MallocMapping args)
 Notifies the framework that the embedder encountered an accessibility related action on the specified node. This call originates on the platform view and has been forwarded to the platform configuration here by the engine.
 
void BeginFrame (fml::TimePoint frame_time, uint64_t frame_number)
 Notifies the framework that it is time to begin working on a new frame previously scheduled via a call to PlatformConfigurationClient::ScheduleFrame. This call originates in the animator.
 
void ReportTimings (std::vector< int64_t > timings)
 Dart code cannot fully measure the time it takes for a specific frame to be rendered. This is because Dart code only runs on the UI task runner. That is only a small part of the overall frame workload. The raster task runner frame workload is executed on a thread where Dart code cannot run (and hence instrument). Besides, due to the pipelined nature of rendering in Flutter, there may be multiple frame workloads being processed at any given time. However, for non-Timeline based profiling, it is useful for trace collection and processing to happen in Dart. To do this, the raster task runner frame workloads need to be instrumented separately. After a set number of these profiles have been gathered, they need to be reported back to Dart code. The engine reports this extra instrumentation information back to the framework by invoking this method at predefined intervals.
 
const ViewportMetricsGetMetrics (int view_id)
 Retrieves the viewport metrics with the given ID managed by the PlatformConfiguration.
 
void CompletePlatformMessageResponse (int response_id, std::vector< uint8_t > data)
 Responds to a previous platform message to the engine from the framework.
 
void CompletePlatformMessageEmptyResponse (int response_id)
 Responds to a previous platform message to the engine from the framework with an empty response.
 
Dart_Handle on_error ()
 

Detailed Description

A class for holding and distributing platform-level information to and from the Dart code in Flutter's framework.

It handles communication between the engine and the framework.

It communicates with the RuntimeController through the use of a PlatformConfigurationClient interface, which the RuntimeController defines.

Definition at line 302 of file platform_configuration.h.

Constructor & Destructor Documentation

◆ PlatformConfiguration() [1/2]

flutter::PlatformConfiguration::PlatformConfiguration ( PlatformConfigurationClient client)
explicit

Creates a new PlatformConfiguration, typically created by the RuntimeController.

Parameters
[in]clientThe PlatformConfigurationClient to be injected into the PlatformConfiguration. This client is used to forward requests to the RuntimeController.

Definition at line 34 of file platform_configuration.cc.

36 : client_(client) {}
PlatformConfigurationClient * client() const
Access to the platform configuration client (which typically is implemented by the RuntimeController)...

◆ PlatformConfiguration() [2/2]

flutter::PlatformConfiguration::PlatformConfiguration ( const PlatformConfiguration )
delete

◆ ~PlatformConfiguration()

flutter::PlatformConfiguration::~PlatformConfiguration ( )

Definition at line 38 of file platform_configuration.cc.

38{}

Member Function Documentation

◆ AddView()

bool flutter::PlatformConfiguration::AddView ( int64_t  view_id,
const ViewportMetrics view_metrics 
)

Notify the framework that a new view is available.

        A view must be added before other methods can refer to it,
        including the implicit view. Adding a view that already exists
        triggers an assertion.
Parameters
[in]view_idThe ID of the new view.
[in]viewport_metricsThe initial viewport metrics for the view.
Returns
Whether the view was added.

Definition at line 91 of file platform_configuration.cc.

92 {
93 auto [view_iterator, insertion_happened] =
94 metrics_.emplace(view_id, view_metrics);
95 if (!insertion_happened) {
96 FML_LOG(ERROR) << "View #" << view_id << " already exists.";
97 return false;
98 }
99
100 std::shared_ptr<tonic::DartState> dart_state = add_view_.dart_state().lock();
101 if (!dart_state) {
102 return false;
103 }
104 tonic::DartState::Scope scope(dart_state);
106 add_view_.Get(),
107 {
108 tonic::ToDart(view_id),
109 tonic::ToDart(view_metrics.device_pixel_ratio),
110 tonic::ToDart(view_metrics.physical_width),
111 tonic::ToDart(view_metrics.physical_height),
112 tonic::ToDart(view_metrics.physical_padding_top),
113 tonic::ToDart(view_metrics.physical_padding_right),
114 tonic::ToDart(view_metrics.physical_padding_bottom),
115 tonic::ToDart(view_metrics.physical_padding_left),
116 tonic::ToDart(view_metrics.physical_view_inset_top),
117 tonic::ToDart(view_metrics.physical_view_inset_right),
118 tonic::ToDart(view_metrics.physical_view_inset_bottom),
119 tonic::ToDart(view_metrics.physical_view_inset_left),
120 tonic::ToDart(view_metrics.physical_system_gesture_inset_top),
121 tonic::ToDart(view_metrics.physical_system_gesture_inset_right),
122 tonic::ToDart(view_metrics.physical_system_gesture_inset_bottom),
123 tonic::ToDart(view_metrics.physical_system_gesture_inset_left),
124 tonic::ToDart(view_metrics.physical_touch_slop),
125 tonic::ToDart(view_metrics.physical_display_features_bounds),
126 tonic::ToDart(view_metrics.physical_display_features_type),
127 tonic::ToDart(view_metrics.physical_display_features_state),
128 tonic::ToDart(view_metrics.display_id),
129 tonic::ToDart(view_metrics.physical_min_width_constraint),
130 tonic::ToDart(view_metrics.physical_max_width_constraint),
131 tonic::ToDart(view_metrics.physical_min_height_constraint),
132 tonic::ToDart(view_metrics.physical_max_height_constraint),
133 }));
134 return true;
135}
const std::weak_ptr< DartState > & dart_state() const
G_BEGIN_DECLS FlutterViewId view_id
#define FML_LOG(severity)
Definition logging.h:101
Dart_Handle DartInvoke(Dart_Handle closure, std::initializer_list< Dart_Handle > args)
bool CheckAndHandleError(Dart_Handle handle)
Definition dart_error.cc:33

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), FML_LOG, tonic::DartPersistentValue::Get(), and view_id.

◆ BeginFrame()

void flutter::PlatformConfiguration::BeginFrame ( fml::TimePoint  frame_time,
uint64_t  frame_number 
)

Notifies the framework that it is time to begin working on a new frame previously scheduled via a call to PlatformConfigurationClient::ScheduleFrame. This call originates in the animator.

The frame time given as the argument indicates the point at which the current frame interval began. It is very slightly (because of scheduling overhead) in the past. If a new layer tree is not produced and given to the raster task runner within one frame interval from this point, the Flutter application will jank.

This method calls the ::_beginFrame method in hooks.dart.

Parameters
[in]frame_timeThe point at which the current frame interval began. May be used by animation interpolators, physics simulations, etc..
[in]frame_numberThe frame number recorded by the animator. Used by the framework to associate frame specific debug information with frame timings and timeline events.

Definition at line 415 of file platform_configuration.cc.

416 {
417 std::shared_ptr<tonic::DartState> dart_state =
418 begin_frame_.dart_state().lock();
419 if (!dart_state) {
420 return;
421 }
422 tonic::DartState::Scope scope(dart_state);
423
424 if (last_frame_number_ > frame_number) {
425 FML_LOG(ERROR) << "Frame number is out of order: " << frame_number << " < "
426 << last_frame_number_;
427 }
428 last_frame_number_ = frame_number;
429
430 // frameTime is not a delta; its the timestamp of the presentation.
431 // This is just a type conversion.
432 int64_t microseconds = frameTime.ToEpochDelta().ToMicroseconds();
433 if (last_microseconds_ > microseconds) {
434 // Do not allow time traveling frametimes
435 // github.com/flutter/flutter/issues/106277
436 FML_LOG(ERROR)
437 << "Reported frame time is older than the last one; clamping. "
438 << microseconds << " < " << last_microseconds_
439 << " ~= " << last_microseconds_ - microseconds;
440 microseconds = last_microseconds_;
441 }
442 last_microseconds_ = microseconds;
443
445 tonic::DartInvoke(begin_frame_.Get(), {
446 Dart_NewInteger(microseconds),
447 Dart_NewInteger(frame_number),
448 }));
449
451
453}
static UIDartState * Current()
Dart_Handle DartInvokeVoid(Dart_Handle closure)

References tonic::CheckAndHandleError(), flutter::UIDartState::Current(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), tonic::DartInvokeVoid(), flutter::UIDartState::FlushMicrotasksNow(), FML_LOG, tonic::DartPersistentValue::Get(), fml::TimePoint::ToEpochDelta(), and fml::TimeDelta::ToMicroseconds().

◆ client()

◆ CompletePlatformMessageEmptyResponse()

void flutter::PlatformConfiguration::CompletePlatformMessageEmptyResponse ( int  response_id)

Responds to a previous platform message to the engine from the framework with an empty response.

Parameters
[in]response_idThe unique id that identifies the original platform message to respond to.

Definition at line 491 of file platform_configuration.cc.

492 {
493 if (!response_id) {
494 return;
495 }
496 auto it = pending_responses_.find(response_id);
497 if (it == pending_responses_.end()) {
498 return;
499 }
500 auto response = std::move(it->second);
501 pending_responses_.erase(it);
502 response->CompleteEmpty();
503}

Referenced by flutter::PlatformConfigurationNativeApi::RespondToPlatformMessage().

◆ CompletePlatformMessageResponse()

void flutter::PlatformConfiguration::CompletePlatformMessageResponse ( int  response_id,
std::vector< uint8_t >  data 
)

Responds to a previous platform message to the engine from the framework.

Parameters
[in]response_idThe unique id that identifies the original platform message to respond to.
[in]dataThe data to send back in the response.

Definition at line 505 of file platform_configuration.cc.

507 {
508 if (!response_id) {
509 return;
510 }
511 auto it = pending_responses_.find(response_id);
512 if (it == pending_responses_.end()) {
513 return;
514 }
515 auto response = std::move(it->second);
516 pending_responses_.erase(it);
517 response->Complete(std::make_unique<fml::DataMapping>(std::move(data)));
518}
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switch_defs.h:36

References flutter::data.

Referenced by flutter::PlatformConfigurationNativeApi::RespondToPlatformMessage().

◆ DidCreateIsolate()

void flutter::PlatformConfiguration::DidCreateIsolate ( )

Called by the RuntimeController once it has created the root isolate, so that the PlatformController can get a handle to the 'dart:ui' library.

It uses the handle to call the hooks in hooks.dart.

Definition at line 40 of file platform_configuration.cc.

40 {
41 Dart_Handle library = Dart_LookupLibrary(tonic::ToDart("dart:ui"));
42
44 Dart_GetField(library, tonic::ToDart("_onError")));
46 Dart_GetField(library, tonic::ToDart("_addView")));
47 remove_view_.Set(tonic::DartState::Current(),
48 Dart_GetField(library, tonic::ToDart("_removeView")));
49 send_view_focus_event_.Set(
51 Dart_GetField(library, tonic::ToDart("_sendViewFocusEvent")));
52 set_engine_id_.Set(tonic::DartState::Current(),
53 Dart_GetField(library, tonic::ToDart("_setEngineId")));
54 update_window_metrics_.Set(
56 Dart_GetField(library, tonic::ToDart("_updateWindowMetrics")));
57 update_displays_.Set(
59 Dart_GetField(library, tonic::ToDart("_updateDisplays")));
60 update_locales_.Set(tonic::DartState::Current(),
61 Dart_GetField(library, tonic::ToDart("_updateLocales")));
62 update_user_settings_data_.Set(
64 Dart_GetField(library, tonic::ToDart("_updateUserSettingsData")));
65 update_initial_lifecycle_state_.Set(
67 Dart_GetField(library, tonic::ToDart("_updateInitialLifecycleState")));
68 update_semantics_enabled_.Set(
70 Dart_GetField(library, tonic::ToDart("_updateSemanticsEnabled")));
71 update_accessibility_features_.Set(
73 Dart_GetField(library, tonic::ToDart("_updateAccessibilityFeatures")));
74 dispatch_platform_message_.Set(
76 Dart_GetField(library, tonic::ToDart("_dispatchPlatformMessage")));
77 dispatch_pointer_data_packet_.Set(
79 Dart_GetField(library, tonic::ToDart("_dispatchPointerDataPacket")));
80 dispatch_semantics_action_.Set(
82 Dart_GetField(library, tonic::ToDart("_dispatchSemanticsAction")));
83 begin_frame_.Set(tonic::DartState::Current(),
84 Dart_GetField(library, tonic::ToDart("_beginFrame")));
85 draw_frame_.Set(tonic::DartState::Current(),
86 Dart_GetField(library, tonic::ToDart("_drawFrame")));
87 report_timings_.Set(tonic::DartState::Current(),
88 Dart_GetField(library, tonic::ToDart("_reportTimings")));
89}
void Set(DartState *dart_state, Dart_Handle value)
static DartState * Current()
Definition dart_state.cc:56
Dart_Handle ToDart(const T &object)

References tonic::DartState::Current(), tonic::DartPersistentValue::Set(), and tonic::ToDart().

◆ DispatchPlatformMessage()

void flutter::PlatformConfiguration::DispatchPlatformMessage ( std::unique_ptr< PlatformMessage message)

Notifies the PlatformConfiguration that the client has sent it a message. This call originates in the platform view and has been forwarded through the engine to here.

Parameters
[in]messageThe message sent from the embedder to the Dart application.

Definition at line 339 of file platform_configuration.cc.

340 {
341 std::shared_ptr<tonic::DartState> dart_state =
342 dispatch_platform_message_.dart_state().lock();
343 if (!dart_state) {
344 FML_DLOG(WARNING)
345 << "Dropping platform message for lack of DartState on channel: "
346 << message->channel();
347 return;
348 }
349 tonic::DartState::Scope scope(dart_state);
350 Dart_Handle data_handle =
351 (message->hasData()) ? ToByteData(message->data()) : Dart_Null();
352 if (Dart_IsError(data_handle)) {
353 FML_DLOG(WARNING)
354 << "Dropping platform message because of a Dart error on channel: "
355 << message->channel();
356 return;
357 }
358
359 int response_id = 0;
360 if (auto response = message->response()) {
361 response_id = next_response_id_++;
362 pending_responses_[response_id] = response;
363 }
364
366 tonic::DartInvoke(dispatch_platform_message_.Get(),
367 {tonic::ToDart(message->channel()), data_handle,
368 tonic::ToDart(response_id)}));
369}
G_BEGIN_DECLS GBytes * message
#define FML_DLOG(severity)
Definition logging.h:121

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), FML_DLOG, tonic::DartPersistentValue::Get(), and message.

◆ DispatchPointerDataPacket()

void flutter::PlatformConfiguration::DispatchPointerDataPacket ( const PointerDataPacket packet)

Notifies the PlatformConfiguration that the client has sent it pointer events. This call originates in the platform view and has been forwarded through the engine to here.

Parameters
[in]packetThe pointer event(s) serialized into a packet.

Definition at line 371 of file platform_configuration.cc.

372 {
373 std::shared_ptr<tonic::DartState> dart_state =
374 dispatch_pointer_data_packet_.dart_state().lock();
375 if (!dart_state) {
376 return;
377 }
378 tonic::DartState::Scope scope(dart_state);
379
380 const std::vector<uint8_t>& buffer = packet.data();
381 Dart_Handle data_handle =
383 if (Dart_IsError(data_handle)) {
384 return;
385 }
386
388 tonic::DartInvoke(dispatch_pointer_data_packet_.Get(), {data_handle}));
389}
static Dart_Handle Create(const void *data, size_t length)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set profile Make the profiler discard new samples once the profiler sample buffer is full When this flag is not the profiler sample buffer is used as a ring buffer
Definition switch_defs.h:98

References flutter::buffer, tonic::CheckAndHandleError(), tonic::DartByteData::Create(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), flutter::PointerDataPacket::data(), and tonic::DartPersistentValue::Get().

◆ DispatchSemanticsAction()

void flutter::PlatformConfiguration::DispatchSemanticsAction ( int64_t  view_id,
int32_t  node_id,
SemanticsAction  action,
fml::MallocMapping  args 
)

Notifies the framework that the embedder encountered an accessibility related action on the specified node. This call originates on the platform view and has been forwarded to the platform configuration here by the engine.

Parameters
[in]view_idThe identifier of the view.
[in]node_idThe identifier of the accessibility node.
[in]actionThe accessibility related action performed on the node of the specified ID.
[in]argsOptional data that applies to the specified action.

Definition at line 391 of file platform_configuration.cc.

394 {
395 std::shared_ptr<tonic::DartState> dart_state =
396 dispatch_semantics_action_.dart_state().lock();
397 if (!dart_state) {
398 return;
399 }
400 tonic::DartState::Scope scope(dart_state);
401
402 Dart_Handle args_handle =
403 (args.GetSize() <= 0) ? Dart_Null() : ToByteData(args);
404
405 if (Dart_IsError(args_handle)) {
406 return;
407 }
408
410 dispatch_semantics_action_.Get(),
411 {tonic::ToDart(view_id), tonic::ToDart(node_id),
412 tonic::ToDart(static_cast<int32_t>(action)), args_handle}));
413}
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args

References args, tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), and tonic::DartPersistentValue::Get().

◆ GetMetrics()

const ViewportMetrics * flutter::PlatformConfiguration::GetMetrics ( int  view_id)

Retrieves the viewport metrics with the given ID managed by the PlatformConfiguration.

Parameters
[in]view_idThe id of the view's viewport metrics to return.
Returns
a pointer to the ViewportMetrics. Returns nullptr if the ID is not found.

Definition at line 482 of file platform_configuration.cc.

482 {
483 auto found = metrics_.find(view_id);
484 if (found != metrics_.end()) {
485 return &found->second;
486 } else {
487 return nullptr;
488 }
489}

References view_id.

Referenced by flutter::testing::TEST_F(), flutter::testing::TEST_F(), and flutter::testing::TEST_F().

◆ on_error()

Dart_Handle flutter::PlatformConfiguration::on_error ( )
inline

Definition at line 567 of file platform_configuration.h.

567{ return on_error_.Get(); }

References tonic::DartPersistentValue::Get().

◆ operator=()

PlatformConfiguration & flutter::PlatformConfiguration::operator= ( const PlatformConfiguration )
delete

◆ RemoveView()

bool flutter::PlatformConfiguration::RemoveView ( int64_t  view_id)

Notify the framework that a view is no longer available.

        Removing a view that does not exist triggers an assertion.

        The implicit view (kFlutterImplicitViewId) should never be
        removed. Doing so triggers an assertion.
Parameters
[in]view_idThe ID of the view.
Returns
Whether the view was removed.

Definition at line 137 of file platform_configuration.cc.

137 {
139 FML_LOG(FATAL) << "The implicit view #" << view_id << " cannot be removed.";
140 return false;
141 }
142 size_t erased_elements = metrics_.erase(view_id);
143 if (erased_elements == 0) {
144 FML_LOG(ERROR) << "View #" << view_id << " doesn't exist.";
145 return false;
146 }
147
148 std::shared_ptr<tonic::DartState> dart_state =
149 remove_view_.dart_state().lock();
150 if (!dart_state) {
151 return false;
152 }
153 tonic::DartState::Scope scope(dart_state);
155 tonic::DartInvoke(remove_view_.Get(), {
156 tonic::ToDart(view_id),
157 }));
158 return true;
159}
constexpr int64_t kFlutterImplicitViewId
Definition constants.h:35

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), FML_LOG, tonic::DartPersistentValue::Get(), flutter::kFlutterImplicitViewId, and view_id.

◆ ReportTimings()

void flutter::PlatformConfiguration::ReportTimings ( std::vector< int64_t >  timings)

Dart code cannot fully measure the time it takes for a specific frame to be rendered. This is because Dart code only runs on the UI task runner. That is only a small part of the overall frame workload. The raster task runner frame workload is executed on a thread where Dart code cannot run (and hence instrument). Besides, due to the pipelined nature of rendering in Flutter, there may be multiple frame workloads being processed at any given time. However, for non-Timeline based profiling, it is useful for trace collection and processing to happen in Dart. To do this, the raster task runner frame workloads need to be instrumented separately. After a set number of these profiles have been gathered, they need to be reported back to Dart code. The engine reports this extra instrumentation information back to the framework by invoking this method at predefined intervals.

See also
FrameTiming
Parameters
[in]timingsCollection of FrameTiming::kStatisticsCount * 'n' values for n frames whose timings have not been reported yet. Many of the values are timestamps, but a collection of integers is reported here for easier conversions to Dart objects. The timestamps are measured against the system monotonic clock measured in microseconds.

Definition at line 455 of file platform_configuration.cc.

455 {
456 std::shared_ptr<tonic::DartState> dart_state =
457 report_timings_.dart_state().lock();
458 if (!dart_state) {
459 return;
460 }
461 tonic::DartState::Scope scope(dart_state);
462
463 Dart_Handle data_handle =
464 Dart_NewTypedData(Dart_TypedData_kInt64, timings.size());
465
466 Dart_TypedData_Type type;
467 void* data = nullptr;
468 intptr_t num_acquired = 0;
469 FML_CHECK(!Dart_IsError(
470 Dart_TypedDataAcquireData(data_handle, &type, &data, &num_acquired)));
471 FML_DCHECK(num_acquired == static_cast<int>(timings.size()));
472
473 memcpy(data, timings.data(), sizeof(int64_t) * timings.size());
474 FML_CHECK(Dart_TypedDataReleaseData(data_handle));
475
477 tonic::DartInvoke(report_timings_.Get(), {
478 data_handle,
479 }));
480}
GLenum type
#define FML_CHECK(condition)
Definition logging.h:104
#define FML_DCHECK(condition)
Definition logging.h:122

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), flutter::data, FML_CHECK, FML_DCHECK, tonic::DartPersistentValue::Get(), and type.

◆ SendFocusEvent()

bool flutter::PlatformConfiguration::SendFocusEvent ( const ViewFocusEvent event)

Notify the isolate that the focus state of a native view has changed.

Parameters
[in]eventThe focus event describing the change.
Returns
Whether the focus event was sent.

Definition at line 161 of file platform_configuration.cc.

161 {
162 std::shared_ptr<tonic::DartState> dart_state =
163 remove_view_.dart_state().lock();
164 if (!dart_state) {
165 return false;
166 }
167 tonic::DartState::Scope scope(dart_state);
169 send_view_focus_event_.Get(), {
170 tonic::ToDart(event.view_id()),
171 tonic::ToDart(event.state()),
172 tonic::ToDart(event.direction()),
173 }));
174 return true;
175}

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), and tonic::DartPersistentValue::Get().

◆ SetEngineId()

bool flutter::PlatformConfiguration::SetEngineId ( int64_t  engine_id)

Sets the opaque identifier of the engine.

       The identifier can be passed from Dart to native code to
       retrieve the engine instance.
Returns
Whether the identifier was set.

Definition at line 177 of file platform_configuration.cc.

177 {
178 std::shared_ptr<tonic::DartState> dart_state =
179 set_engine_id_.dart_state().lock();
180 if (!dart_state) {
181 return false;
182 }
183 tonic::DartState::Scope scope(dart_state);
185 tonic::DartInvoke(set_engine_id_.Get(), {
186 tonic::ToDart(engine_id),
187 }));
188 return true;
189}

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), and tonic::DartPersistentValue::Get().

◆ UpdateAccessibilityFeatures()

void flutter::PlatformConfiguration::UpdateAccessibilityFeatures ( int32_t  flags)

Forward the preference of accessibility features that must be enabled in the semantics tree to the framwork.

Parameters
[in]flagsThe accessibility features that must be generated in the semantics tree.

Definition at line 327 of file platform_configuration.cc.

327 {
328 std::shared_ptr<tonic::DartState> dart_state =
329 update_accessibility_features_.dart_state().lock();
330 if (!dart_state) {
331 return;
332 }
333 tonic::DartState::Scope scope(dart_state);
334
336 update_accessibility_features_.Get(), {tonic::ToDart(values)}));
337}

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), and tonic::DartPersistentValue::Get().

◆ UpdateDisplays()

void flutter::PlatformConfiguration::UpdateDisplays ( const std::vector< DisplayData > &  displays)

Update the specified display data in the framework.

Parameters
[in]displaysThe display data to send to Dart.

Definition at line 239 of file platform_configuration.cc.

240 {
241 std::vector<DisplayId> ids;
242 std::vector<double> widths;
243 std::vector<double> heights;
244 std::vector<double> device_pixel_ratios;
245 std::vector<double> refresh_rates;
246 for (const auto& display : displays) {
247 ids.push_back(display.id);
248 widths.push_back(display.width);
249 heights.push_back(display.height);
250 device_pixel_ratios.push_back(display.pixel_ratio);
251 refresh_rates.push_back(display.refresh_rate);
252 }
253 std::shared_ptr<tonic::DartState> dart_state =
254 update_displays_.dart_state().lock();
255 if (!dart_state) {
256 return;
257 }
258 tonic::DartState::Scope scope(dart_state);
260 update_displays_.Get(),
261 {
262 tonic::ToDart<std::vector<DisplayId>>(ids),
263 tonic::ToDart<std::vector<double>>(widths),
264 tonic::ToDart<std::vector<double>>(heights),
265 tonic::ToDart<std::vector<double>>(device_pixel_ratios),
266 tonic::ToDart<std::vector<double>>(refresh_rates),
267 }));
268}
std::vector< FlutterEngineDisplay > * displays

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), displays, and tonic::DartPersistentValue::Get().

◆ UpdateInitialLifecycleState()

void flutter::PlatformConfiguration::UpdateInitialLifecycleState ( const std::string &  data)

Updates the lifecycle state data in the framework.

Parameters
[in]dataThe lifecycle state data.

Definition at line 300 of file platform_configuration.cc.

301 {
302 std::shared_ptr<tonic::DartState> dart_state =
303 update_initial_lifecycle_state_.dart_state().lock();
304 if (!dart_state) {
305 return;
306 }
307 tonic::DartState::Scope scope(dart_state);
309 update_initial_lifecycle_state_.Get(), {
310 tonic::StdStringToDart(data),
311 }));
312}

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), and tonic::DartPersistentValue::Get().

◆ UpdateLocales()

void flutter::PlatformConfiguration::UpdateLocales ( const std::vector< std::string > &  locales)

Update the specified locale data in the framework.

Parameters
[in]locale_dataThe locale data. This should consist of groups of 4 strings, each group representing a single locale.

Definition at line 270 of file platform_configuration.cc.

271 {
272 std::shared_ptr<tonic::DartState> dart_state =
273 update_locales_.dart_state().lock();
274 if (!dart_state) {
275 return;
276 }
277
278 tonic::DartState::Scope scope(dart_state);
280 tonic::DartInvoke(update_locales_.Get(),
281 {
282 tonic::ToDart<std::vector<std::string>>(locales),
283 }));
284}

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), and tonic::DartPersistentValue::Get().

◆ UpdateSemanticsEnabled()

void flutter::PlatformConfiguration::UpdateSemanticsEnabled ( bool  enabled)

Notifies the PlatformConfiguration that the embedder has expressed an opinion about whether the accessibility tree should be generated or not. This call originates in the platform view and is forwarded to the PlatformConfiguration here by the engine.

Parameters
[in]enabledWhether the accessibility tree is enabled or disabled.

Definition at line 314 of file platform_configuration.cc.

314 {
315 std::shared_ptr<tonic::DartState> dart_state =
316 update_semantics_enabled_.dart_state().lock();
317 if (!dart_state) {
318 return;
319 }
320 tonic::DartState::Scope scope(dart_state);
322
323 tonic::CheckAndHandleError(tonic::DartInvoke(update_semantics_enabled_.Get(),
324 {tonic::ToDart(enabled)}));
325}
static void ThrowIfUIOperationsProhibited()

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), tonic::DartPersistentValue::Get(), and flutter::UIDartState::ThrowIfUIOperationsProhibited().

◆ UpdateUserSettingsData()

void flutter::PlatformConfiguration::UpdateUserSettingsData ( const std::string &  data)

Update the user settings data in the framework.

Parameters
[in]dataThe user settings data.

Definition at line 286 of file platform_configuration.cc.

286 {
287 std::shared_ptr<tonic::DartState> dart_state =
288 update_user_settings_data_.dart_state().lock();
289 if (!dart_state) {
290 return;
291 }
292 tonic::DartState::Scope scope(dart_state);
293
294 tonic::CheckAndHandleError(tonic::DartInvoke(update_user_settings_data_.Get(),
295 {
296 tonic::StdStringToDart(data),
297 }));
298}

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), and tonic::DartPersistentValue::Get().

◆ UpdateViewMetrics()

bool flutter::PlatformConfiguration::UpdateViewMetrics ( int64_t  view_id,
const ViewportMetrics metrics 
)

Update the view metrics for the specified view.

        If the view is not found, silently return false.
Parameters
[in]view_idThe ID of the view.
[in]metricsThe new metrics of the view.
Returns
Whether the view is found.

Definition at line 191 of file platform_configuration.cc.

193 {
194 auto found_iter = metrics_.find(view_id);
195 if (found_iter == metrics_.end()) {
196 return false;
197 }
198
199 found_iter->second = view_metrics;
200
201 std::shared_ptr<tonic::DartState> dart_state =
202 update_window_metrics_.dart_state().lock();
203 if (!dart_state) {
204 return false;
205 }
206 tonic::DartState::Scope scope(dart_state);
208 update_window_metrics_.Get(),
209 {
210 tonic::ToDart(view_id),
211 tonic::ToDart(view_metrics.device_pixel_ratio),
212 tonic::ToDart(view_metrics.physical_width),
213 tonic::ToDart(view_metrics.physical_height),
214 tonic::ToDart(view_metrics.physical_padding_top),
215 tonic::ToDart(view_metrics.physical_padding_right),
216 tonic::ToDart(view_metrics.physical_padding_bottom),
217 tonic::ToDart(view_metrics.physical_padding_left),
218 tonic::ToDart(view_metrics.physical_view_inset_top),
219 tonic::ToDart(view_metrics.physical_view_inset_right),
220 tonic::ToDart(view_metrics.physical_view_inset_bottom),
221 tonic::ToDart(view_metrics.physical_view_inset_left),
222 tonic::ToDart(view_metrics.physical_system_gesture_inset_top),
223 tonic::ToDart(view_metrics.physical_system_gesture_inset_right),
224 tonic::ToDart(view_metrics.physical_system_gesture_inset_bottom),
225 tonic::ToDart(view_metrics.physical_system_gesture_inset_left),
226 tonic::ToDart(view_metrics.physical_touch_slop),
227 tonic::ToDart(view_metrics.physical_display_features_bounds),
228 tonic::ToDart(view_metrics.physical_display_features_type),
229 tonic::ToDart(view_metrics.physical_display_features_state),
230 tonic::ToDart(view_metrics.display_id),
231 tonic::ToDart(view_metrics.physical_min_width_constraint),
232 tonic::ToDart(view_metrics.physical_max_width_constraint),
233 tonic::ToDart(view_metrics.physical_min_height_constraint),
234 tonic::ToDart(view_metrics.physical_max_height_constraint),
235 }));
236 return true;
237}

References tonic::CheckAndHandleError(), tonic::DartPersistentValue::dart_state(), tonic::DartInvoke(), tonic::DartPersistentValue::Get(), and view_id.

Referenced by flutter::testing::TEST_F().


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