blob: 4ca0979c77261ea3fde204e27a9232cbcbbec1a4 [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_BIN_VIRTUAL_KEYBOARD_MANAGER_VIRTUAL_KEYBOARD_CONTROLLER_H_
#define SRC_UI_BIN_VIRTUAL_KEYBOARD_MANAGER_VIRTUAL_KEYBOARD_CONTROLLER_H_
#include <fuchsia/input/virtualkeyboard/cpp/fidl.h>
#include "fuchsia/ui/views/cpp/fidl.h"
#include "src/lib/fxl/memory/weak_ptr.h"
#include "src/ui/bin/virtual_keyboard_manager/virtual_keyboard_coordinator.h"
namespace virtual_keyboard_manager {
class VirtualKeyboardCoordinator;
// Allows callers to request changes in virtual keyboard configuration, and to
// watch for changes in virtual keyboard visibility.
class VirtualKeyboardController : public fuchsia::input::virtualkeyboard::Controller {
public:
enum class UserAction { HIDE_KEYBOARD, SHOW_KEYBOARD };
virtual ~VirtualKeyboardController() = default;
// Called by VirtualKeyboardCoordinator.
virtual void OnUserAction(UserAction action) = 0;
};
class FidlBoundVirtualKeyboardController : public VirtualKeyboardController {
public:
FidlBoundVirtualKeyboardController(fxl::WeakPtr<VirtualKeyboardCoordinator> coordinator,
zx_koid_t view_koid,
fuchsia::input::virtualkeyboard::TextType text_type);
~FidlBoundVirtualKeyboardController() override;
// |fuchsia.input.virtualkeyboard.Controller|
// Called either via IPC, or from unit tests.
void SetTextType(::fuchsia::input::virtualkeyboard::TextType text_type) override;
void RequestShow() override;
void RequestHide() override;
void WatchVisibility(WatchVisibilityCallback callback) override;
// Informs `this` that the ground-truth of keyboard visibility has changed, due
// to the user's interaction with the keyboard.
//
// This enables the Controller to avoid inadvertently overriding the user's
// intent. For example, after the user presses the dismiss button on the
// keyboard, SetTextType() will not have the side-effect of re-opening
// the keyboard.
//
// Called by VirtualKeyboardCoordinator.
void OnUserAction(UserAction action) override;
private:
void MaybeNotifyWatcher();
void NotifyCoordinator();
fxl::WeakPtr<VirtualKeyboardCoordinator> coordinator_;
zx_koid_t view_koid_{};
// The type of text for which `this` wants to enable input.
//
// `text_type_` is cached so that `this` can send that information
// to `coordinator_` when RequestShow() or RequestHide() is called.
//
// The value may differ from the ground truth about which text type
// is supported by a visible keyboard, as that truth is owned by the
// client of the `fuchsia.input.virtualkeyboard.Manager` protocol.
//
// Currently, `text_type_` differs from the actual visibility only during the
// transient periods when `text_type_` has been updated, and the Manager
// client has not read a new value from
// fuchsia.input.virtualkeyboard.Manager.WatchTypeAndVisibility().
//
// In the future, `text_type_` may also differ from the ground truth when
// `this` is unable to effect its desire, because the corresponding
// `fuchsia.ui.views.View` does not have focus.
fuchsia::input::virtualkeyboard::TextType text_type_;
// Whether or not `this` wants the keyboard to be visible.
//
// `want_visible_` is cached so that `this` can send the visibility bit
// to `coordinator_` when SetTextType() is called.
//
// The value may differ from the ground truth about visibility, which is owned by
// the client of the `fuchsia.input.virtualkeyboard.Manager` protocol.
//
// Currently, `want_visible_` differs from the actual visibility only during the
// transient periods when either
// a) `want_visible_` has been updated, and the Manager client has not read a new
// value from fuchsia.input.virtualkeyboard.Manager.WatchTypeAndVisibility()
// b) the user has dismissed the keyboard using the virtual keyboard GUI, and
// `want_visible_` has not yet observed the change
//
// In the future, `want_visible_` may also differ from the ground truth when
// `this` is unable to effect its desire, because the corresponding
// `fuchsia.ui.views.View` does not have focus.
bool want_visible_;
// The visibility last sent on the `fuchsia.input.virtualkeyboard.Controller`
// channel bound to `this`.
// * used to
// * identify the first call to WatchVisibility()
// * avoid sending no-op responses on later calls to WatchVisibility()
// * equal to `nullopt`, iff the client has never called WatchTypeAndVisibility()
std::optional<bool> last_sent_visible_;
WatchVisibilityCallback watch_callback_;
};
} // namespace virtual_keyboard_manager
#endif // SRC_UI_BIN_VIRTUAL_KEYBOARD_MANAGER_VIRTUAL_KEYBOARD_CONTROLLER_H_