// Copyright 2019 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.

library fuchsia.ui.text;

using fuchsia.ui.input;

/// A service provided to keyboard apps that allows them to access a TextField
/// interface for the currently focused text field. Requests to this TextField
/// interface are proxied through the TextManager to batch edits together,
/// and to ensure requests aren't sent to unfocused TextFields.
[Discoverable]
protocol TextInputContext {
  /// Tells anyone listening to ImeVisibilityService (usually a shell) to hide
  /// the onscreen keyboard.
  HideKeyboard();

  /// This event fires any time a new text field is focused. It also is sent to
  /// newly connected keyboards when they connect, if there is a focused text
  /// field. If focus is lost, the TextField handle will be closed.
  -> OnFocus(TextField text_field);

  /// This event fires any time a physical keyboard event is sent to the
  /// TextManager. The keyboard may translate it into an edit on the focused
  /// text field if it so desires. It's expected that this interface will change
  /// as the routing for keyboard events and keymaps evolves.
  -> OnInputEvent(fuchsia.ui.input.InputEvent event);
};
