Ниже приведены обновления, внесенные в эти области отображения:
- Приложения, работающие на дисплее, отличном от дисплея по умолчанию
- Поддержка редактора методов многосессионного ввода
Android 10 поддерживает программную клавиатуру для приложений, работающих на дисплее, отличном от дисплея по умолчанию.
Приложения, работающие на дисплее, отличном от дисплея по умолчанию
В зависимости от того, на каком дисплее отображается программная клавиатура редактора методов ввода (IME), существуют различные режимы. Программная клавиатура отображается на:
- Тот же дисплей, на котором отображается выбранное приложение.
- Дисплей по умолчанию , когда активное приложение работает на дисплее, отличном от дисплея по умолчанию.
- Никакого дисплея.
Система определяет используемый режим на основе настроек дисплея, на котором отображается активное приложение. Подробнее см.:
-
WindowManager#setDisplayImePolicy()
-
WindowManager#getDisplayImePolicy()
Рисунок 1. Программная клавиатура IME, отображаемая на дополнительном дисплее, включая целевое приложение
Система использует один редактор метода ввода (IME), но может переключаться между дисплеями в зависимости от фокуса пользователя. Android 10 автоматически ожидает, что все собственные и сторонние редакторы метода ввода (IME) обновят макет и изменят размер в соответствии с новым размером дисплея при его создании.
Если на дисплее A есть активное соединение и поле ввода запрашивает фокус ввода на дисплее B, то выполняется следующий поток:
- Новое входное соединение поступает из поля ввода на дисплее B.
-
InputMethodManagerService
проверяет, следует ли одобрить соединение. - Для IME выбирается дисплей. Если дисплей B поддерживает отображение IME и имеет разрешение на его отображение, то используется дисплей B. В противном случае выбирается дисплей основного устройства.
- Если выбранный дисплей не принадлежит дисплею 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()
для повторной инициализации представления ввода.
-