blob: cff38eb366c5dc9462afb9ebcf79309c33820188 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_UI_SCENIC_LIB_FOCUS_VIEW_FOCUSER_REGISTRY_H_
#define SRC_UI_SCENIC_LIB_FOCUS_VIEW_FOCUSER_REGISTRY_H_
#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <zircon/types.h>
#include <unordered_map>
#include <unordered_set>
namespace focus {
using RequestFocusFunc = fit::function<bool(/*requestor*/ zx_koid_t, /*request*/ zx_koid_t)>;
using SetAutoFocusFunc = fit::function<void(/*requestor*/ zx_koid_t, /*request*/ zx_koid_t)>;
// An object for managing fuchsia.ui.views.Focuser lifecycle, starting with FIDL requests and
// ending with cleanup when the client-side channel closes.
class ViewFocuserRegistry {
public:
explicit ViewFocuserRegistry(RequestFocusFunc request_focus, SetAutoFocusFunc set_auto_focus);
// Because this object captures its "this" pointer in internal closures, it is unsafe to copy or
// move it. Disable all copy and move operations.
ViewFocuserRegistry(const ViewFocuserRegistry&) = delete;
ViewFocuserRegistry& operator=(const ViewFocuserRegistry&) = delete;
ViewFocuserRegistry(ViewFocuserRegistry&&) = delete;
ViewFocuserRegistry& operator=(ViewFocuserRegistry&&) = delete;
// Bind a FIDL request for fuchsia.ui.views.Focuser, associated with |view_ref_koid|.
void Register(zx_koid_t view_ref_koid,
fidl::InterfaceRequest<fuchsia::ui::views::Focuser> view_focuser);
// For tests.
std::unordered_set<zx_koid_t> endpoints() const {
std::unordered_set<zx_koid_t> out;
std::for_each(endpoints_.begin(), endpoints_.end(),
[&](const auto& kv) { out.insert(kv.first); });
return out;
}
private:
class ViewFocuserEndpoint : public fuchsia::ui::views::Focuser {
public:
ViewFocuserEndpoint(
fidl::InterfaceRequest<fuchsia::ui::views::Focuser> view_focuser,
fit::function<void(zx_status_t)> error_handler,
fit::function<void(fuchsia::ui::views::ViewRef, RequestFocusCallback)> request_focus,
fit::function<void(zx_koid_t)> set_auto_focus);
// |fuchsia.ui.views.Focuser|
void RequestFocus(fuchsia::ui::views::ViewRef view_ref, RequestFocusCallback response) override;
// |fuchsia.ui.views.Focuser|
void SetAutoFocus(fuchsia::ui::views::FocuserSetAutoFocusRequest request,
SetAutoFocusCallback response) override;
private:
const fit::function<void(fuchsia::ui::views::ViewRef, RequestFocusCallback)> request_focus_;
const fit::function<void(zx_koid_t)> set_auto_focus_;
fidl::Binding<fuchsia::ui::views::Focuser> endpoint_;
};
std::unordered_map<zx_koid_t, ViewFocuserEndpoint> endpoints_;
const RequestFocusFunc request_focus_;
const SetAutoFocusFunc set_auto_focus_;
};
} // namespace focus
#endif // SRC_UI_SCENIC_LIB_FOCUS_VIEW_FOCUSER_REGISTRY_H_