Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
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 305 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 tonic::ToDart(view_metrics.physical_display_corner_radius_top_left),
134 tonic::ToDart(view_metrics.physical_display_corner_radius_top_right),
135 tonic::ToDart(
136 view_metrics.physical_display_corner_radius_bottom_right),
137 tonic::ToDart(
138 view_metrics.physical_display_corner_radius_bottom_left),
139 }));
140 return true;
141}
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 427 of file platform_configuration.cc.

428 {
429 std::shared_ptr<tonic::DartState> dart_state =
430 begin_frame_.dart_state().lock();
431 if (!dart_state) {
432 return;
433 }
434 tonic::DartState::Scope scope(dart_state);
435
436 if (last_frame_number_ > frame_number) {
437 FML_LOG(ERROR) << "Frame number is out of order: " << frame_number << " < "
438 << last_frame_number_;
439 }
440 last_frame_number_ = frame_number;
441
442 // frameTime is not a delta; its the timestamp of the presentation.
443 // This is just a type conversion.
444 int64_t microseconds = frameTime.ToEpochDelta().ToMicroseconds();
445 if (last_microseconds_ > microseconds) {
446 // Do not allow time traveling frametimes
447 // github.com/flutter/flutter/issues/106277
448 FML_LOG(ERROR)
449 << "Reported frame time is older than the last one; clamping. "
450 << microseconds << " < " << last_microseconds_
451 << " ~= " << last_microseconds_ - microseconds;
452 microseconds = last_microseconds_;
453 }
454 last_microseconds_ = microseconds;
455
457 tonic::DartInvoke(begin_frame_.Get(), {
458 Dart_NewInteger(microseconds),
459 Dart_NewInteger(frame_number),
460 }));
461
463
465}
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 503 of file platform_configuration.cc.

504 {
505 if (!response_id) {
506 return;
507 }
508 auto it = pending_responses_.find(response_id);
509 if (it == pending_responses_.end()) {
510 return;
511 }
512 auto response = std::move(it->second);
513 pending_responses_.erase(it);
514 response->CompleteEmpty();
515}

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 517 of file platform_configuration.cc.

519 {
520 if (!response_id) {
521 return;
522 }
523 auto it = pending_responses_.find(response_id);
524 if (it == pending_responses_.end()) {
525 return;
526 }
527 auto response = std::move(it->second);
528 pending_responses_.erase(it);
529 response->Complete(std::make_unique<fml::DataMapping>(std::move(data)));
530}
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 351 of file platform_configuration.cc.

352 {
353 std::shared_ptr<tonic::DartState> dart_state =
354 dispatch_platform_message_.dart_state().lock();
355 if (!dart_state) {
356 FML_DLOG(WARNING)
357 << "Dropping platform message for lack of DartState on channel: "
358 << message->channel();
359 return;
360 }
361 tonic::DartState::Scope scope(dart_state);
362 Dart_Handle data_handle =
363 (message->hasData()) ? ToByteData(message->data()) : Dart_Null();
364 if (Dart_IsError(data_handle)) {
365 FML_DLOG(WARNING)
366 << "Dropping platform message because of a Dart error on channel: "
367 << message->channel();
368 return;
369 }
370
371 int response_id = 0;
372 if (auto response = message->response()) {
373 response_id = next_response_id_++;
374 pending_responses_[response_id] = response;
375 }
376
378 tonic::DartInvoke(dispatch_platform_message_.Get(),
379 {tonic::ToDart(message->channel()), data_handle,
380 tonic::ToDart(response_id)}));
381}
const char * 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 383 of file platform_configuration.cc.

384 {
385 std::shared_ptr<tonic::DartState> dart_state =
386 dispatch_pointer_data_packet_.dart_state().lock();
387 if (!dart_state) {
388 return;
389 }
390 tonic::DartState::Scope scope(dart_state);
391
392 const std::vector<uint8_t>& buffer = packet.data();
393 Dart_Handle data_handle =
395 if (Dart_IsError(data_handle)) {
396 return;
397 }
398
400 tonic::DartInvoke(dispatch_pointer_data_packet_.Get(), {data_handle}));
401}
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 403 of file platform_configuration.cc.

406 {
407 std::shared_ptr<tonic::DartState> dart_state =
408 dispatch_semantics_action_.dart_state().lock();
409 if (!dart_state) {
410 return;
411 }
412 tonic::DartState::Scope scope(dart_state);
413
414 Dart_Handle args_handle =
415 (args.GetSize() <= 0) ? Dart_Null() : ToByteData(args);
416
417 if (Dart_IsError(args_handle)) {
418 return;
419 }
420
422 dispatch_semantics_action_.Get(),
423 {tonic::ToDart(view_id), tonic::ToDart(node_id),
424 tonic::ToDart(static_cast<int32_t>(action)), args_handle}));
425}
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 494 of file platform_configuration.cc.

494 {
495 auto found = metrics_.find(view_id);
496 if (found != metrics_.end()) {
497 return &found->second;
498 } else {
499 return nullptr;
500 }
501}

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 570 of file platform_configuration.h.

570{ 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 143 of file platform_configuration.cc.

143 {
145 FML_LOG(FATAL) << "The implicit view #" << view_id << " cannot be removed.";
146 return false;
147 }
148 size_t erased_elements = metrics_.erase(view_id);
149 if (erased_elements == 0) {
150 FML_LOG(ERROR) << "View #" << view_id << " doesn't exist.";
151 return false;
152 }
153
154 std::shared_ptr<tonic::DartState> dart_state =
155 remove_view_.dart_state().lock();
156 if (!dart_state) {
157 return false;
158 }
159 tonic::DartState::Scope scope(dart_state);
161 tonic::DartInvoke(remove_view_.Get(), {
162 tonic::ToDart(view_id),
163 }));
164 return true;
165}
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 467 of file platform_configuration.cc.

467 {
468 std::shared_ptr<tonic::DartState> dart_state =
469 report_timings_.dart_state().lock();
470 if (!dart_state) {
471 return;
472 }
473 tonic::DartState::Scope scope(dart_state);
474
475 Dart_Handle data_handle =
476 Dart_NewTypedData(Dart_TypedData_kInt64, timings.size());
477
478 Dart_TypedData_Type type;
479 void* data = nullptr;
480 intptr_t num_acquired = 0;
481 FML_CHECK(!Dart_IsError(
482 Dart_TypedDataAcquireData(data_handle, &type, &data, &num_acquired)));
483 FML_DCHECK(num_acquired == static_cast<int>(timings.size()));
484
485 memcpy(data, timings.data(), sizeof(int64_t) * timings.size());
486 FML_CHECK(Dart_TypedDataReleaseData(data_handle));
487
489 tonic::DartInvoke(report_timings_.Get(), {
490 data_handle,
491 }));
492}
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 167 of file platform_configuration.cc.

167 {
168 std::shared_ptr<tonic::DartState> dart_state =
169 remove_view_.dart_state().lock();
170 if (!dart_state) {
171 return false;
172 }
173 tonic::DartState::Scope scope(dart_state);
175 send_view_focus_event_.Get(), {
176 tonic::ToDart(event.view_id()),
177 tonic::ToDart(event.state()),
178 tonic::ToDart(event.direction()),
179 }));
180 return true;
181}

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 183 of file platform_configuration.cc.

183 {
184 std::shared_ptr<tonic::DartState> dart_state =
185 set_engine_id_.dart_state().lock();
186 if (!dart_state) {
187 return false;
188 }
189 tonic::DartState::Scope scope(dart_state);
191 tonic::DartInvoke(set_engine_id_.Get(), {
192 tonic::ToDart(engine_id),
193 }));
194 return true;
195}

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 339 of file platform_configuration.cc.

339 {
340 std::shared_ptr<tonic::DartState> dart_state =
341 update_accessibility_features_.dart_state().lock();
342 if (!dart_state) {
343 return;
344 }
345 tonic::DartState::Scope scope(dart_state);
346
348 update_accessibility_features_.Get(), {tonic::ToDart(values)}));
349}

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 251 of file platform_configuration.cc.

252 {
253 std::vector<DisplayId> ids;
254 std::vector<double> widths;
255 std::vector<double> heights;
256 std::vector<double> device_pixel_ratios;
257 std::vector<double> refresh_rates;
258 for (const auto& display : displays) {
259 ids.push_back(display.id);
260 widths.push_back(display.width);
261 heights.push_back(display.height);
262 device_pixel_ratios.push_back(display.pixel_ratio);
263 refresh_rates.push_back(display.refresh_rate);
264 }
265 std::shared_ptr<tonic::DartState> dart_state =
266 update_displays_.dart_state().lock();
267 if (!dart_state) {
268 return;
269 }
270 tonic::DartState::Scope scope(dart_state);
272 update_displays_.Get(),
273 {
274 tonic::ToDart<std::vector<DisplayId>>(ids),
275 tonic::ToDart<std::vector<double>>(widths),
276 tonic::ToDart<std::vector<double>>(heights),
277 tonic::ToDart<std::vector<double>>(device_pixel_ratios),
278 tonic::ToDart<std::vector<double>>(refresh_rates),
279 }));
280}
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 312 of file platform_configuration.cc.

313 {
314 std::shared_ptr<tonic::DartState> dart_state =
315 update_initial_lifecycle_state_.dart_state().lock();
316 if (!dart_state) {
317 return;
318 }
319 tonic::DartState::Scope scope(dart_state);
321 update_initial_lifecycle_state_.Get(), {
322 tonic::StdStringToDart(data),
323 }));
324}

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 282 of file platform_configuration.cc.

283 {
284 std::shared_ptr<tonic::DartState> dart_state =
285 update_locales_.dart_state().lock();
286 if (!dart_state) {
287 return;
288 }
289
290 tonic::DartState::Scope scope(dart_state);
292 tonic::DartInvoke(update_locales_.Get(),
293 {
294 tonic::ToDart<std::vector<std::string>>(locales),
295 }));
296}

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 326 of file platform_configuration.cc.

326 {
327 std::shared_ptr<tonic::DartState> dart_state =
328 update_semantics_enabled_.dart_state().lock();
329 if (!dart_state) {
330 return;
331 }
332 tonic::DartState::Scope scope(dart_state);
334
335 tonic::CheckAndHandleError(tonic::DartInvoke(update_semantics_enabled_.Get(),
336 {tonic::ToDart(enabled)}));
337}
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 298 of file platform_configuration.cc.

298 {
299 std::shared_ptr<tonic::DartState> dart_state =
300 update_user_settings_data_.dart_state().lock();
301 if (!dart_state) {
302 return;
303 }
304 tonic::DartState::Scope scope(dart_state);
305
306 tonic::CheckAndHandleError(tonic::DartInvoke(update_user_settings_data_.Get(),
307 {
308 tonic::StdStringToDart(data),
309 }));
310}

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 197 of file platform_configuration.cc.

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

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: