A implementação padrão do AOSP da tela de bloqueio com recursos para desbloqueá-la (proteção por PIN) aparece apenas na tela principal. No Android 9 (e versões anteriores), as telas secundárias ofereciam suporte a uma única janela de bloqueio em uma única tela externa. No Android 10, a tela de bloqueio é expandida para todas as telas secundárias públicas. A tela de bloqueio continua simples e não oferece suporte para desbloqueio de telas secundárias.
Figura 1. Tela de bloqueio na tela secundária
Os fabricantes de dispositivos podem implementar a tela de bloqueio para telas secundárias,
desde que o requisito fundamental de segurança seja atendido. Quando o dispositivo está
bloqueado, as informações precisam ficar escondidas com segurança em todas as telas. Não há
políticas nem controles integrados sobre o conteúdo que deve ser mostrado ou ocultado quando o dispositivo
está bloqueado. Portanto, a única maneira segura de implementar o acesso restrito é
ocultar todo o conteúdo por trás da tela de bloqueio e das janelas de bloqueio. As únicas exceções
são apps que optaram explicitamente por aparecer na parte de cima da tela de bloqueio
usando os métodos
R.attr.showWhenLocked
ou
Activity.setShowWhenLocked()
.
Caso contrário, há um grande potencial de vazamento de informações de telas públicas e
privadas.
Embora as telas possam ser colocadas em estados diferentes (ON
/OFF
),
o estado bloqueado é global para todas as telas. Como em qualquer implementação de dispositivo, é necessário
que o usuário saiba quando um dispositivo está bloqueado (ou desbloqueado). Por exemplo, pressionar
um botão liga/desliga normalmente bloqueia um dispositivo móvel. Um botão liga/desliga também precisa bloquear todas
as telas internas e externas.
Como a janela de bloqueio é de propriedade da SystemUI, ela não será colocada em telas particulares. Os proprietários das telas particulares são responsáveis por ocultar as janelas e proteger o conteúdo quando um dispositivo está bloqueado. A implementação padrão do sistema só oculta atividades em telas particulares, mudando a visibilidade.
Implementação
A janela de bloqueio em telas secundárias é implementada como uma janela de
apresentação
em KeyguardDisplayManager
. O Android 10 mudou
KeyguardDisplayManager#mPresentations
para uma matriz que contém todas
as janelas de bloqueio para todas as telas secundárias. KeyguardDisplayManager
também
tem um listener de mudança de tela para responder a mudanças nas telas disponíveis e
proteger todas as telas. É importante bloquear imediatamente todas as telas conectadas
a qualquer momento para que os invasores não extraiam dados do usuário, mesmo com acesso físico
ao dispositivo.
A janela de bloqueio é exibida em todas as telas secundárias públicas (consulte
KeyguardDisplayManager#isKeyguardShowable()
). Os proprietários de telas
privadas são responsáveis por proteger o conteúdo quando um dispositivo está
bloqueado.