Suporte ao editor de método de entrada

As atualizações feitas nessas áreas específicas da exibição são fornecidas abaixo:

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

Aplicativos executados em uma tela não padrão

Em termos de qual display mostra o teclado do software do Input Method Editor (IME), existem diferentes modos. O teclado do software é mostrado em:

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

O sistema usa um único IME, mas pode alternar entre exibições para acompanhar 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 no display A e um campo de entrada solicitar foco de entrada no display B, ocorrerá o seguinte fluxo:

  1. Uma nova conexão de entrada vem do campo de entrada no display B.
  2. InputMethodManagerService verifica se a conexão deve ser aprovada.
  3. Uma exibição é selecionada para o IME. Se a exibição B suportar a exibição do IME e tiver permissão para mostrá-lo, então B será usado. Caso contrário, a exibição do dispositivo principal será selecionada.
  4. Se o display selecionado não for do display 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 monitores virtuais que não sejam de propriedade do sistema. Isso se deve a uma preocupação de segurança de que um aplicativo malicioso possa criar uma exibição virtual com suporte a decorações do sistema habilitado e ler informações confidenciais 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 posteriores), um usuário pode alternar entre diferentes campos de texto de entrada em diferentes telas mudando o foco, e a janela do IME passa 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 para onde vai a entrada do IME) para gerenciar o estado do IME.

Para InputMethodManagerService (IMMS), nenhum outro mecanismo integrado pode propagar a alteração de exibição para InputMethodService (IMS) e reconfigurar o layout do teclado em tempo de execução ao mover o foco para outro monitor.

Para conseguir a alternância da janela IME entre 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 e DisplayContent#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, vincula novamente o serviço para reconectar o novo IME token de janela para o monitor externo em onServiceConnected() .
  • No lado do IMS, após o recebimento do IMS#attachToken , ocorre o seguinte fluxo:
    • 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 à 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 o processo WindowProcessController para 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ós onConfigurationChanged() e a chamada ViewGroup#addView() para reinicializar a visualização de entrada.