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

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

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() для повторной инициализации входного представления.