As atualizações feitas nessas áreas específicas de exibição são fornecidas abaixo:
- Aplicativos em execução em uma exibição não padrão
- Suporte ao editor de método de entrada multi-sessão
O Android 10 oferece suporte a teclado de software para aplicativos executados em uma tela não padrão.
Aplicativos em execução em uma exibição não padrão
Em relação a qual tela mostra o teclado de software do Input Method Editor (IME), existem diferentes modos. O teclado de software é mostrado no:
- Mesma tela em que o aplicativo em foco aparece.
- Exibição padrão enquanto o aplicativo em foco está sendo executado em uma exibição não padrão.
- Nenhuma exibição.
O sistema determina qual modo usar com base nas configurações da tela em que o aplicativo em foco aparece. Para mais detalhes, consulte:
-
WindowManager#setDisplayImePolicy()
-
WindowManager#getDisplayImePolicy()
Figura 1. Teclado do software IME como aparece na exibição secundária, incluindo o aplicativo de destino
O sistema usa um único IME, mas pode alternar entre os monitores para seguir o foco do usuário. O Android 10 espera automaticamente que todos os IMEs próprios e de terceiros revisem o layout e redimensionem de acordo com o novo tamanho de exibição quando criado.
Se houver uma conexão ativa na exibição A e um campo de entrada solicitar foco de entrada na exibição B, ocorrerá o seguinte fluxo:
- Uma nova conexão de entrada vem do campo de entrada no display B.
-
InputMethodManagerService
verifica se a conexão deve ser aprovada. - Uma exibição é selecionada para o IME. Se o monitor B oferecer suporte à exibição do IME e tiver permissão para exibi-lo, o B será usado. Caso contrário, a exibição do dispositivo principal é selecionada.
- Se o monitor selecionado não for do monitor A, a conexão será restabelecida.
InputMethodService
é destruído e criado novamente.
Restrição de segurança
O sistema não mostrará um IME em exibições virtuais que não sejam de propriedade do sistema. Isso ocorre devido a uma preocupação de segurança de que um aplicativo malicioso pode criar uma exibição virtual com suporte a decorações de sistema habilitadas e ler informações confidenciais do usuário da superfície, como previsões de digitação e planos de fundo personalizados.
Implementação
No Android 9 (e inferior), o IME estava disponível apenas na tela padrão, conforme descrito em Métodos de entrada na tela . No Android 10 (e superior), um usuário pode alternar entre diferentes campos de texto de entrada em diferentes telas ao alternar o foco, e a janela do IME se move para as telas secundárias.
A implementação no WindowManager
rastreia a janela do método de entrada (a janela do IME onde o teclado virtual é desenhado) e o destino do método de entrada (a janela onde a entrada do IME vai) para gerenciar o estado do IME.
Para InputMethodManagerService
(IMMS), nenhum outro mecanismo integrado pode propagar a mudança de exibição para InputMethodService
(IMS) e reconfigurar o layout do teclado em tempo de execução ao mover o foco para outra exibição.
Para obter a alternância da janela IME entre os monitores, o Android 10 implementa o seguinte:
- O IME e a janela de destino de entrada agora são rastreados por exibição em
DisplayContent#mInputMethodWindow
eDisplayContent#mInputMethodTarget
, para que o WindowManager (WM) possa gerenciar o estado de foco do IME independentemente de cada exibição. - No lado do IMMS, quando a solicitação de foco de um cliente de aplicativo do monitor externo é recebida por meio de
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, ele primeiro desvincula o serviço de método de entrada atual e, em seguida, religa o serviço para reanexar o novo IME token de janela para exibição externa emonServiceConnected()
. - Do lado do IMS, após o recebimento do
IMS#attachToken
, ocorre o seguinte fluxo:-
ContextImpl#updateDisplay
é chamado para atualizar a exibição do contexto do serviço emInputMethodService#attachToken()
. Isso chamaViewGroup#addView()
para revisar o layout do teclado e adaptá-lo à exibição de destino, verificando o contexto atual. - Depois que
DisplayContent#setInputMethodWindowLocked()
é chamado, a implementação envia alterações de configuração de exibição em nível de processo usando oWindowProcessController
para o processo IME para substituir recursos e exibir métricas. - O cliente
InputMethodService
obtém a configuração correta com as métricas de exibição corretas apósonConfigurationChanged()
e a chamadaViewGroup#addView()
para reinicializar a exibição de entrada.
-