Suporte ao editor de método de entrada

Confira abaixo as atualizações feitas nessas áreas específicas de exibição:

O Android 10 oferece suporte a teclado de software para apps executados em uma tela que não seja a padrão.

Apps em execução em uma tela não padrão

Em termos de qual tela mostra o teclado de software do editor de método de entrada (IME, na sigla em inglês), há modos diferentes. O teclado de software é mostrado no:

  • Mesma tela em que o app em foco aparece.
  • Tela padrão enquanto o app em foco está em execução em uma tela não padrão.
  • Nenhuma exibição.

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 conforme aparece na tela secundária, incluindo o app de destino

O sistema usa um único IME, mas pode alternar entre as telas para seguir o foco do usuário. O Android 10 espera automaticamente que todos os IMEs originais e de terceiros revisem o layout e redimensionem de acordo com o novo tamanho de exibição 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 oferecer suporte à exibição do IME e tiver permissão para isso, a B vai ser usada. Caso contrário, a tela principal do dispositivo será selecionada.
  4. Se a tela selecionada não for a tela A, a conexão será reestabelecida. 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 do sistema. Isso ocorre devido a uma preocupação de segurança de que um app malicioso possa criar uma tela virtual com suporte a decorações do sistema ativado e ler informações sensíveis do usuário na tela, como previsões de digitação e planos de fundo personalizados.

Implementação

No Android 9 (e versões anteriores), o IME só estava disponível na tela padrão, conforme descrito em Métodos de entrada na tela. No Android 10 (e versões mais recentes), o usuário pode alternar entre diferentes campos de texto de entrada em diferentes telas alternando 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 de software é desenhado) e o destino do método de entrada (a janela para onde vai a entrada do IME) 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 durante a execução ao mover o foco para outra tela.

Para alternar a janela do IME entre telas, o Android 10 implementa o seguinte:

  • O IME e a janela de destino de entrada agora são rastreados por tela em DisplayContent#mInputMethodWindow e DisplayContent#mInputMethodTarget, para que a WindowManager (WM) possa gerenciar o estado de foco do IME de forma independente de cada tela.
  • No lado do IMMS, quando a solicitação de foco de um cliente de app da tela externa é recebida por ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus, ela primeiro desvincula o serviço de método de entrada atual e, em seguida, vincula o serviço para anexar o novo token de janela do IME à tela externa em onServiceConnected().
  • No lado do IMS, depois que o IMS#attachToken é recebido, o seguinte fluxo ocorre:
    • ContextImpl#updateDisplay é chamada para atualizar a tela do contexto do 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 tela no nível do processo usando o processo WindowProcessController para o 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.