13 FML_LOG(
ERROR) <<
"FocusDelegate::WatchLoop() must be called once.";
17 watch_loop_ = [
this,
callback](
auto focus_state) {
18 callback(is_focused_ = focus_state.focused());
19 Complete(std::exchange(next_focus_request_,
nullptr),
20 is_focused_ ?
"[true]" :
"[false]");
21 view_ref_focused_->Watch( watch_loop_);
24 view_ref_focused_->Watch( watch_loop_);
28 rapidjson::Value request,
30 auto method = request.FindMember(
"method");
31 if (method == request.MemberEnd() || !method->value.IsString()) {
35 if (method->value ==
"View.focus.getCurrent") {
36 Complete(std::move(response), is_focused_ ?
"[true]" :
"[false]");
37 }
else if (method->value ==
"View.focus.getNext") {
38 if (next_focus_request_) {
39 FML_LOG(
ERROR) <<
"An outstanding PlatformMessageResponse already exists "
40 "for the next focus state!";
41 Complete(std::move(response),
"[null]");
43 next_focus_request_ = std::move(response);
45 }
else if (method->value ==
"View.focus.request") {
46 auto args_it = request.FindMember(
"args");
47 if (args_it == request.MemberEnd() || !args_it->value.IsObject()) {
51 const auto&
args = args_it->value;
53 auto view_ref =
args.FindMember(
"viewRef");
54 if (!view_ref->value.IsUint64()) {
59 zx_handle_t handle = view_ref->value.GetUint64();
60 zx_handle_t out_handle;
62 zx_handle_duplicate(handle, ZX_RIGHT_SAME_RIGHTS, &out_handle);
63 if (status != ZX_OK) {
67 auto ref = fuchsia::ui::views::ViewRef({
68 .reference = zx::eventpair(out_handle),
70 return RequestFocusByViewRef(std::move(ref), std::move(response));
72 }
else if (method->value ==
"View.focus.requestById") {
73 auto args_it = request.FindMember(
"args");
74 if (args_it == request.MemberEnd() || !args_it->value.IsObject()) {
78 const auto&
args = args_it->value;
80 auto view_id =
args.FindMember(
"viewId");
81 if (!view_id->value.IsUint64()) {
86 auto id = view_id->value.GetUint64();
87 if (child_view_view_refs_.count(
id) != 1) {
89 <<
") does not refer to a valid ChildView";
90 Complete(std::move(response),
"[1]");
94 return RequestFocusById(
id, std::move(response));
103 fuchsia::ui::views::ViewRef view_ref) {
104 FML_CHECK(child_view_view_refs_.count(view_id) == 0);
105 child_view_view_refs_[view_id] = std::move(view_ref);
109 FML_CHECK(child_view_view_refs_.count(view_id) == 1);
110 child_view_view_refs_.erase(view_id);
113void FocusDelegate::Complete(
117 response->
Complete(std::make_unique<fml::DataMapping>(
118 std::vector<uint8_t>(
value.begin(),
value.end())));
122bool FocusDelegate::RequestFocusById(
125 fuchsia::ui::views::ViewRef ref;
126 auto status = child_view_view_refs_[view_id].Clone(&ref);
127 if (status != ZX_OK) {
132 return RequestFocusByViewRef(std::move(ref), std::move(response));
135bool FocusDelegate::RequestFocusByViewRef(
136 fuchsia::ui::views::ViewRef view_ref,
138 focuser_->RequestFocus(
140 [
this, response = std::move(response)](
141 fuchsia::ui::views::Focuser_RequestFocus_Result
result) {
145 std::underlying_type_t<fuchsia::ui::views::Error>
>(
148 Complete(std::move(response),
"[" +
std::to_string(result_code) +
"]");
bool HandlePlatformMessage(rapidjson::Value request, fml::RefPtr< flutter::PlatformMessageResponse > response)
void OnChildViewViewRef(uint64_t view_id, fuchsia::ui::views::ViewRef view_ref)
void WatchLoop(std::function< void(bool)> callback)
void OnDisposeChildView(uint64_t view_id)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
#define FML_LOG(severity)
#define FML_CHECK(condition)
Dart_NativeFunction function
static SkString to_string(int n)