As atualizações feitas nessas áreas específicas de exibição são fornecidas abaixo:
- Aplicativos executados em uma tela não padrão
- Suporte ao editor de método de entrada de várias sessões
O Android 10 oferece suporte ao 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 de software do Input Method Editor (IME), existem dois modos diferentes. O teclado do software é mostrado no:
- Mesma tela na qual o aplicativo em foco aparece.
- Exibição padrão enquanto o aplicativo focado está sendo executado em uma exibição não padrão.
O sistema determina qual modo usar com base nas configurações da tela na qual o aplicativo em foco aparece. Para mais detalhes, consulte:
-
DisplayWindowSettings#shouldShowImeLocked()
-
DisplayWindowSettings#setShouldShowImeLocked()
Figura 1. Teclado do software IME como aparece na tela secundária, incluindo o aplicativo 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 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 tela A e um campo de entrada solicitar o foco de entrada na tela 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 a exibição B suportar a exibição do IME e tiver permissão para exibi-lo, B será usado. Caso contrário, a exibição do dispositivo primário é selecionada.
- Se a tela selecionada não for da tela 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 são 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 de decorações do sistema habilitado 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 alternando o foco, e a janela 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 interno 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 outra exibição.
Para conseguir a alternância de janela IME entre telas, 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
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, ele primeiro desvincula o serviço de método de entrada atual e, em seguida, revincula o serviço para reanexar o novo IME token de janela para a exibição externa emonServiceConnected()
. - 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 emInputMethodService#attachToken()
. Isso chamaViewGroup#addView()
para revisar o layout do teclado e se adaptar à exibição de destino, verificando o contexto atual. - Depois
DisplayContent#setInputMethodWindowLocked()
é chamado, a implementação envia alterações de configuração de exibição em nível de processo usando o processoWindowProcessController
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ósonConfigurationChanged()
e a chamadaViewGroup#addView()
para reinicializar a visualização de entrada.
-
Suporte ao editor de método de entrada de várias sessões
Implementações de dispositivos com vários monitores que devem ser usados simultaneamente por vários usuários para fornecer fontes de entrada apropriadas podem ser configuradas para exibir simultaneamente vários editores de método de entrada (IME), no máximo um por monitor. As duas figuras a seguir mostram um exemplo de IME de várias sessões em dois monitores:
Figura 2. Exemplo de IME de várias sessões
Figura 3. Exemplo de IME de várias sessões
O suporte para foco por exibição é um pré-requisito para esse recurso. Caso contrário, esse recurso não pode ser ativado. Devido a restrições de segurança, a limitação de foco por exibição restringiu esse recurso a um pequeno subconjunto de dispositivos.
No Android 10, o suporte para IMEs de várias sessões é implementado com serviços de sistema separados com um conjunto diferente de APIs e funcionalidade reduzida. O IME de várias sessões não é compatível com os IMEs existentes. O serviço multisessão ou sessão única pode ser usado, mas não ambos.
Não é possível usar IMEs do Android existentes criados com base na classe InputMethodService
porque a suposição de que um único cliente de IME pode ser focado ao mesmo tempo foi feita antes que as APIs de IME do Android fossem introduzidas no Android 1.5 e muitas APIs públicas em InputMethodService
já se baseou fortemente nessa suposição. No entanto, atualizar a classe InputMethodService
para dar suporte a um cenário de vários clientes é um desafio porque:
- Fazer isso introduziria uma quantidade inaceitável de complexidade em
InputMethodService
, que já é difícil de manter. - Os desenvolvedores de IME ainda precisam atualizar sua implementação para poder dar suporte a solicitações paralelas de vários clientes IME focados, o que pode exigir um redesenho não trivial de sua parte (como decodificador de entrada e banco de dados de histórico de digitação).
- Espera-se que os casos de uso reais para clientes multi-IME evoluam rapidamente, portanto, o novo protocolo não é estável e não está pronto para ser exposto como APIs públicas.
Assim como no IME de sessão única (regular), o controle sobre a exibição do IME em monitores individuais é realizado usando DisplayWindowSettings
.
Há um exemplo de IME de várias sessões localizado em development/samples/MultiClientInputMethod
.
Para testar o IME de várias sessões:
- Defina
config_perDisplayFocusEnabled
comotrue
. - Execute estes comandos:
-
$ make -j MultiClientInputMethod
-
$ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
-
$ adb root
-
$ adb shell setprop persist.debug.multi_client_ime \
com.example.android.multiclientinputmethod/.MultiClientInputMethod -
$ adb reboot
-
- Experimente vários cenários de entrada de texto.
Implementação
Consulte MultiClientInputMethodManagerService
para obter detalhes de implementação.
As atualizações feitas nessas áreas específicas de exibição são fornecidas abaixo:
- Aplicativos executados em uma tela não padrão
- Suporte ao editor de método de entrada de várias sessões
O Android 10 oferece suporte ao 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 de software do Input Method Editor (IME), existem dois modos diferentes. O teclado do software é mostrado no:
- Mesma tela na qual o aplicativo em foco aparece.
- Exibição padrão enquanto o aplicativo focado está sendo executado em uma exibição não padrão.
O sistema determina qual modo usar com base nas configurações da tela na qual o aplicativo em foco aparece. Para mais detalhes, consulte:
-
DisplayWindowSettings#shouldShowImeLocked()
-
DisplayWindowSettings#setShouldShowImeLocked()
Figura 1. Teclado do software IME como aparece na tela secundária, incluindo o aplicativo 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 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 tela A e um campo de entrada solicitar o foco de entrada na tela 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 a exibição B suportar a exibição do IME e tiver permissão para exibi-lo, B será usado. Caso contrário, a exibição do dispositivo primário é selecionada.
- Se a tela selecionada não for da tela 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 são 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 de decorações do sistema habilitado 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 alternando o foco, e a janela 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 interno 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 outra exibição.
Para conseguir a alternância de janela IME entre telas, 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
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, ele primeiro desvincula o serviço de método de entrada atual e, em seguida, revincula o serviço para reanexar o novo IME token de janela para a exibição externa emonServiceConnected()
. - 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 emInputMethodService#attachToken()
. Isso chamaViewGroup#addView()
para revisar o layout do teclado e se adaptar à exibição de destino, verificando o contexto atual. - Depois
DisplayContent#setInputMethodWindowLocked()
é chamado, a implementação envia alterações de configuração de exibição em nível de processo usando o processoWindowProcessController
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ósonConfigurationChanged()
e a chamadaViewGroup#addView()
para reinicializar a visualização de entrada.
-
Suporte ao editor de método de entrada de várias sessões
Implementações de dispositivos com vários monitores que devem ser usados simultaneamente por vários usuários para fornecer fontes de entrada apropriadas podem ser configuradas para exibir simultaneamente vários editores de método de entrada (IME), no máximo um por monitor. As duas figuras a seguir mostram um exemplo de IME de várias sessões em dois monitores:
Figura 2. Exemplo de IME de várias sessões
Figura 3. Exemplo de IME de várias sessões
O suporte para foco por exibição é um pré-requisito para esse recurso. Caso contrário, esse recurso não pode ser ativado. Devido a restrições de segurança, a limitação de foco por exibição restringiu esse recurso a um pequeno subconjunto de dispositivos.
No Android 10, o suporte para IMEs de várias sessões é implementado com serviços de sistema separados com um conjunto diferente de APIs e funcionalidade reduzida. O IME de várias sessões não é compatível com os IMEs existentes. O serviço multisessão ou sessão única pode ser usado, mas não ambos.
Não é possível usar IMEs do Android existentes criados com base na classe InputMethodService
porque a suposição de que um único cliente de IME pode ser focado ao mesmo tempo foi feita antes que as APIs de IME do Android fossem introduzidas no Android 1.5 e muitas APIs públicas em InputMethodService
já se baseou fortemente nessa suposição. No entanto, atualizar a classe InputMethodService
para dar suporte a um cenário de vários clientes é um desafio porque:
- Fazer isso introduziria uma quantidade inaceitável de complexidade em
InputMethodService
, que já é difícil de manter. - Os desenvolvedores de IME ainda precisam atualizar sua implementação para poder dar suporte a solicitações paralelas de vários clientes IME focados, o que pode exigir um redesenho não trivial de sua parte (como decodificador de entrada e banco de dados de histórico de digitação).
- Espera-se que os casos de uso reais para clientes multi-IME evoluam rapidamente, portanto, o novo protocolo não é estável e não está pronto para ser exposto como APIs públicas.
Assim como no IME de sessão única (regular), o controle sobre a exibição do IME em monitores individuais é realizado usando DisplayWindowSettings
.
Há um exemplo de IME de várias sessões localizado em development/samples/MultiClientInputMethod
.
Para testar o IME de várias sessões:
- Defina
config_perDisplayFocusEnabled
comotrue
. - Execute estes comandos:
-
$ make -j MultiClientInputMethod
-
$ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
-
$ adb root
-
$ adb shell setprop persist.debug.multi_client_ime \
com.example.android.multiclientinputmethod/.MultiClientInputMethod -
$ adb reboot
-
- Experimente vários cenários de entrada de texto.
Implementação
Consulte MultiClientInputMethodManagerService
para obter detalhes de implementação.