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

Ниже приведены изменения, внесенные в эти области, относящиеся к конкретному дисплею:

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 уничтожается, а затем создается заново.

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

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

Выполнение

В 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 для переопределения ресурсов и метрик отображения.
    • После onConfigurationChanged() и вызова ViewGroup#addView() для повторной инициализации представления ввода клиент InputMethodService получает правильную конфигурацию с корректными метриками отображения.