Suporte ao editor de método de entrada

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:

  1. Uma nova conexão de entrada vem do campo de entrada na tela B.
  2. InputMethodManagerService verifica se a conexão precisa ser aprovada.
  3. 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.
  4. 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 e DisplayContent#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 em onServiceConnected().
  • 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 em InputMethodService#attachToken(). Isso chama ViewGroup#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 o WindowProcessController 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ós onConfigurationChanged() e a chamada ViewGroup#addView() para reinicializar a visualização de entrada.