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

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

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