Поддержка редактора метода ввода

Ниже приведены обновления, внесенные в эти области отображения:

Android 10 поддерживает программную клавиатуру для приложений, работающих на дисплее, отличном от дисплея по умолчанию.

Приложения, работающие на дисплее, отличном от дисплея по умолчанию

В зависимости от того, на каком дисплее отображается программная клавиатура редактора методов ввода (IME), существуют различные режимы. Программная клавиатура отображается на:

  • Тот же дисплей, на котором отображается выбранное приложение.
  • Дисплей по умолчанию , когда активное приложение работает на дисплее, отличном от дисплея по умолчанию.
  • Никакого дисплея.

Система определяет используемый режим на основе настроек дисплея, на котором отображается активное приложение. Подробнее см.:

  • WindowManager#setDisplayImePolicy()
  • WindowManager#getDisplayImePolicy()

Рисунок 1. Программная клавиатура IME, отображаемая на дополнительном дисплее, включая целевое приложение

Система использует один редактор метода ввода (IME), но может переключаться между дисплеями в зависимости от фокуса пользователя. Android 10 автоматически ожидает, что все собственные и сторонние редакторы метода ввода (IME) обновят макет и изменят размер в соответствии с новым размером дисплея при его создании.

Если на дисплее A есть активное соединение и поле ввода запрашивает фокус ввода на дисплее B, то выполняется следующий поток:

  1. Новое входное соединение поступает из поля ввода на дисплее B.
  2. InputMethodManagerService проверяет, следует ли одобрить соединение.
  3. Для IME выбирается дисплей. Если дисплей B поддерживает отображение IME и имеет разрешение на его отображение, то используется дисплей B. В противном случае выбирается дисплей основного устройства.
  4. Если выбранный дисплей не принадлежит дисплею A, соединение восстанавливается. InputMethodService уничтожается и создаётся заново.

Ограничение безопасности

Система не отображает редактор метода ввода на виртуальных дисплеях, которые ей не принадлежат. Это связано с угрозой безопасности, поскольку вредоносное приложение может создать виртуальный дисплей с поддержкой системных декораций и считать с него конфиденциальную информацию пользователя, например, подсказки при вводе и пользовательские фоны.

Выполнение

В Android 9 (и более ранних версиях) редактор метода ввода (IME) был доступен только на экране по умолчанию, как описано в разделе «Способы экранного ввода» . В Android 10 (и более поздних версиях) пользователь может переключаться между различными полями ввода на разных дисплеях, переключая фокус, и окно IME перемещается на дополнительные дисплеи.

Реализация в WindowManager отслеживает окно метода ввода (окно IME, в котором отображается экранная клавиатура) и целевой метод ввода (окно, в которое поступает ввод IME) для управления состоянием IME.

Для InputMethodManagerService (IMMS) никакой другой встроенный механизм не может передать изменение отображения на InputMethodService (IMS) и перенастроить раскладку клавиатуры во время выполнения при перемещении фокуса на другой дисплей.

Для переключения окна IME между дисплеями в Android 10 реализовано следующее:

  • IME и целевое окно ввода теперь отслеживаются для каждого дисплея в DisplayContent#mInputMethodWindow и DisplayContent#mInputMethodTarget , так что WindowManager (WM) может управлять состоянием фокуса IME независимо от каждого дисплея.
  • На стороне IMMS, когда запрос фокуса клиента приложения от внешнего дисплея поступает через ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus , он сначала отвязывает текущую службу метода ввода, а затем повторно привязывает службу для повторного присоединения нового токена окна IME для внешнего дисплея в onServiceConnected() .
  • На стороне IMS после получения IMS#attachToken происходит следующий поток:
    • ContextImpl#updateDisplay вызывается для обновления отображения контекста службы в InputMethodService#attachToken() . Этот метод вызывает ViewGroup#addView() для обновления раскладки клавиатуры и адаптации к целевому дисплею, проверяя текущий контекст.
    • После вызова DisplayContent#setInputMethodWindowLocked() реализация отправляет изменения конфигурации отображения на уровне процесса с помощью WindowProcessController в процесс IME для переопределения ресурсов и отображения метрик.
    • Клиент InputMethodService получает правильную конфигурацию с правильными метриками отображения после onConfigurationChanged() и вызова ViewGroup#addView() для повторной инициализации представления ввода.