Confira abaixo as atualizações feitas nessas áreas específicas da tela:
O Android 10 é compatível com teclado de software para apps executados em uma tela não padrão.
Apps em execução em uma tela não padrão
Em termos de qual tela mostra o teclado virtual do editor de método de entrada (IME), há diferentes modos. O teclado de software é mostrado no:
- Mesma tela em que o app em foco aparece.
- Padrão enquanto o app em foco está sendo executado em uma tela não padrão.
- Nenhum display.
O sistema determina qual modo usar com base nas configurações da tela em que o app em foco aparece. Para mais detalhes, consulte:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Figura 1. Teclado de software IME como aparece na tela secundária, incluindo o app de destino
O sistema usa um único IME, mas pode mudar entre telas para acompanhar o foco do usuário. O Android 10 espera automaticamente que todos os IMEs de terceiros e próprios revisem o layout e redimensionem de acordo com o novo tamanho da tela quando criados.
Se houver uma conexão ativa na tela A e um campo de entrada solicitar o foco de entrada na tela B, o seguinte fluxo vai ocorrer:
- Uma nova conexão de entrada vem do campo de entrada na tela B.
InputMethodManagerService
verifica se a conexão precisa ser aprovada.- Uma tela é selecionada para o IME. Se a tela B for compatível com a exibição do IME e tiver permissão para isso, ela será usada. Caso contrário, a tela do dispositivo principal será selecionada.
- Se a tela selecionada não for a A, a conexão será
restabelecida. O
InputMethodService
é destruído e criado novamente.
Restrição de segurança
O sistema não vai mostrar um IME em telas virtuais que não são de propriedade dele. Isso ocorre devido a uma questão de segurança: um app malicioso pode criar uma tela virtual com o suporte a decorações do sistema ativado e ler informações sensíveis do usuário na superfície, como previsões de digitação e planos de fundo personalizados.
Implementação
No Android 9 (e versões anteriores), o IME estava disponível apenas na tela padrão, conforme descrito em Métodos de entrada na tela. No Android 10 (e versões mais recentes), um usuário pode alternar entre diferentes campos de texto de entrada em telas diferentes mudando o foco, e a janela do IME se move para as telas secundárias.
A implementação em WindowManager
rastreia a janela do método de entrada (a janela do IME em que o teclado virtual é desenhado) e o destino do método de entrada (a janela em que a entrada do IME é inserida) 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 no tempo de execução ao mover o foco para outra tela.
Para realizar a troca da janela do IME entre telas, o Android 10 implementa o seguinte:
- Agora, o IME e a janela de destino de entrada são rastreados por tela em
DisplayContent#mInputMethodWindow
eDisplayContent#mInputMethodTarget
, para que o WindowManager (WM) possa gerenciar o estado de foco do IME de forma independente em cada tela. - No IMMS, quando uma solicitação de foco de um cliente de app da tela externa
é recebida por
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, primeiro o serviço de método de entrada atual é desvinculado e depois é vinculado novamente para anexar o novo token de janela do IME para a tela externa emonServiceConnected()
. - No lado do IMS, depois que o
IMS#attachToken
é recebido, o seguinte fluxo ocorre:ContextImpl#updateDisplay
é chamado para atualizar a exibição do contexto de serviço emInputMethodService#attachToken()
. Isso chamaViewGroup#addView()
para revisar o layout do teclado e se adaptar à tela de destino, verificando o contexto atual.- Depois que
DisplayContent#setInputMethodWindowLocked()
é chamado, a implementação envia mudanças na configuração de exibição no nível do processo usando oWindowProcessController
para o processo do IME para substituir recursos e mostrar métricas. - O cliente
InputMethodService
recebe a configuração correta com as métricas de exibição corretas apósonConfigurationChanged()
e a chamadaViewGroup#addView()
para reinicializar a visualização de entrada.