Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
flutter_runner::PointerInjectorDelegate Class Reference

#include <pointer_injector_delegate.h>

Public Member Functions

 PointerInjectorDelegate (fuchsia::ui::pointerinjector::RegistryHandle registry, fuchsia::ui::views::ViewRef host_view_ref)
 
bool HandlePlatformMessage (const rapidjson::Document &request, fml::RefPtr< flutter::PlatformMessageResponse > response)
 
void OnCreateView (uint64_t view_id, std::optional< fuchsia::ui::views::ViewRef > view_ref=std::nullopt)
 
void OnDestroyView (uint64_t view_id)
 

Static Public Attributes

static constexpr auto kPointerInjectorMethodPrefix
 

Detailed Description

Definition at line 25 of file pointer_injector_delegate.h.

Constructor & Destructor Documentation

◆ PointerInjectorDelegate()

flutter_runner::PointerInjectorDelegate::PointerInjectorDelegate ( fuchsia::ui::pointerinjector::RegistryHandle  registry,
fuchsia::ui::views::ViewRef  host_view_ref 
)
inline

Definition at line 30 of file pointer_injector_delegate.h.

32 : registry_(std::make_shared<fuchsia::ui::pointerinjector::RegistryPtr>(
33 registry.Bind())),
34 host_view_ref_(std::make_shared<fuchsia::ui::views::ViewRef>(
35 std::move(host_view_ref))) {}

Member Function Documentation

◆ HandlePlatformMessage()

bool flutter_runner::PointerInjectorDelegate::HandlePlatformMessage ( const rapidjson::Document &  request,
fml::RefPtr< flutter::PlatformMessageResponse response 
)

Definition at line 36 of file pointer_injector_delegate.cc.

38 {
39 if (!registry_->is_bound()) {
40 FML_LOG(WARNING)
41 << "Lost connection to fuchsia.ui.pointerinjector.Registry";
42 return false;
43 }
44
45 auto method = request.FindMember("method");
46 if (method == request.MemberEnd() || !method->value.IsString()) {
47 FML_LOG(ERROR) << "No method found in platform message.";
48 return false;
49 }
50
51 if (method->value != kPointerInjectorMethodPrefix) {
52 FML_LOG(ERROR) << "Unexpected platform message method, expected "
53 "View.pointerinjector.inject.";
54 return false;
55 }
56
57 auto args_it = request.FindMember("args");
58 if (args_it == request.MemberEnd() || !args_it->value.IsObject()) {
59 FML_LOG(ERROR) << "No arguments found in platform message's method";
60 return false;
61 }
62
63 const auto& args = args_it->value;
64
65 auto view_id = args.FindMember("viewId");
66 if (!view_id->value.IsUint64()) {
67 FML_LOG(ERROR) << "Argument 'viewId' is not a uint64";
68 return false;
69 }
70
71 auto id = view_id->value.GetUint64();
72 if (valid_views_.count(id) == 0) {
73 // A child view can get destroyed bottom-up, so the parent view may continue
74 // injecting until all view state processing "catches up". Until then, it's
75 // okay to accept a request to inject into a view that no longer exists.
76 // Doing so avoids log pollution regarding "MissingPluginException".
77 Complete(std::move(response), "[0]");
78 return true;
79 }
80
81 auto phase = args.FindMember("phase");
82 if (!phase->value.IsInt()) {
83 FML_LOG(ERROR) << "Argument 'phase' is not a int";
84 return false;
85 }
86
87 auto pointer_x = args.FindMember("x");
88 if (!pointer_x->value.IsFloat() && !pointer_x->value.IsInt()) {
89 FML_LOG(ERROR) << "Argument 'Pointer.X' is not a float";
90 return false;
91 }
92
93 auto pointer_y = args.FindMember("y");
94 if (!pointer_y->value.IsFloat() && !pointer_y->value.IsInt()) {
95 FML_LOG(ERROR) << "Argument 'Pointer.Y' is not a float";
96 return false;
97 }
98
99 auto pointer_id = args.FindMember("pointerId");
100 if (!pointer_id->value.IsUint()) {
101 FML_LOG(ERROR) << "Argument 'pointerId' is not a uint32";
102 return false;
103 }
104
105 auto trace_flow_id = args.FindMember("traceFlowId");
106 if (!trace_flow_id->value.IsInt()) {
107 FML_LOG(ERROR) << "Argument 'traceFlowId' is not a int";
108 return false;
109 }
110
111 auto width = args.FindMember("logicalWidth");
112 if (!width->value.IsFloat() && !width->value.IsInt()) {
113 FML_LOG(ERROR) << "Argument 'logicalWidth' is not a float";
114 return false;
115 }
116
117 auto height = args.FindMember("logicalHeight");
118 if (!height->value.IsFloat() && !height->value.IsInt()) {
119 FML_LOG(ERROR) << "Argument 'logicalHeight' is not a float";
120 return false;
121 }
122
123 auto timestamp = args.FindMember("timestamp");
124 if (!timestamp->value.IsInt() && !timestamp->value.IsUint64()) {
125 FML_LOG(ERROR) << "Argument 'timestamp' is not a int";
126 return false;
127 }
128
129 PointerInjectorRequest event = {
130 .x = pointer_x->value.GetFloat(),
131 .y = pointer_y->value.GetFloat(),
132 .pointer_id = pointer_id->value.GetUint(),
133 .phase = static_cast<fup_EventPhase>(phase->value.GetInt()),
134 .trace_flow_id = trace_flow_id->value.GetUint64(),
135 .logical_size = {width->value.GetFloat(), height->value.GetFloat()},
136 .timestamp = timestamp->value.GetInt()};
137
138 // Inject the pointer event if the view has been created.
139 valid_views_.at(id).InjectEvent(std::move(event));
140 Complete(std::move(response), "[0]");
141 return true;
142}
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS FlutterViewId view_id
#define FML_LOG(severity)
Definition logging.h:101
fuchsia::ui::pointer::EventPhase fup_EventPhase
int32_t height
int32_t width

References args, FML_LOG, height, kPointerInjectorMethodPrefix, view_id, and width.

◆ OnCreateView()

void flutter_runner::PointerInjectorDelegate::OnCreateView ( uint64_t  view_id,
std::optional< fuchsia::ui::views::ViewRef >  view_ref = std::nullopt 
)

Definition at line 144 of file pointer_injector_delegate.cc.

146 {
147 FML_CHECK(valid_views_.count(view_id) == 0);
148
149 auto [_, success] = valid_views_.try_emplace(
150 view_id, registry_, host_view_ref_, std::move(view_ref));
151
152 FML_CHECK(success);
153}
#define FML_CHECK(condition)
Definition logging.h:104

References FML_CHECK, and view_id.

◆ OnDestroyView()

void flutter_runner::PointerInjectorDelegate::OnDestroyView ( uint64_t  view_id)
inline

Definition at line 53 of file pointer_injector_delegate.h.

53{ valid_views_.erase(view_id); }

References view_id.

Member Data Documentation

◆ kPointerInjectorMethodPrefix

constexpr auto flutter_runner::PointerInjectorDelegate::kPointerInjectorMethodPrefix
staticconstexpr
Initial value:
=
"View.pointerinjector.inject"

Definition at line 27 of file pointer_injector_delegate.h.

Referenced by HandlePlatformMessage().


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