Tela de bloqueio

A implementação padrão da tela de bloqueio do AOSP com recursos para desbloqueá-la (keyguard) 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 foi expandida para todas as telas secundárias públicas. A tela de bloqueio continua simples e não oferece suporte ao 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 de segurança fundamental seja atendido. Quando o dispositivo está bloqueado, as informações precisam ser ocultadas com segurança em todas as telas. Não há política ou controle integrado sobre qual conteúdo deve ser mostrado ou oculto quando o dispositivo está bloqueado. Portanto, a única maneira segura de implementar o acesso restrito é ocultar todo o conteúdo atrás da tela de bloqueio e das janelas de bloqueio. As únicas exceções são os apps que ativaram explicitamente a exibição 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 do SystemUI, ela não será colocada em telas privadas. Os proprietários das telas privadas 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 somente oculta atividades em telas privadas 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. O 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 possam extrair dados do usuário, mesmo com acesso físico ao dispositivo.

A janela de bloqueio é mostrada 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.