Tela de bloqueio

A implementação padrão do AOSP da tela de bloqueio 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 um único display externo. 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 é compatível com o desbloqueio em 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 ser ocultadas com segurança em todas as telas. Não há uma política ou controle integrado 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 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 dois estados diferentes (ON/OFF), o estado bloqueado é global para todas as telas. Como em qualquer implementação de dispositivo, deve ser óbvio para um usuário 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 deve bloquear todas as telas internas e externas.

Como a janela de bloqueio é de propriedade da SystemUI, ela não será colocada em displays particulares. Os proprietários dos displays 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 apenas oculta atividades em telas particulares mudando a visibilidade.

Implementação

A janela de bloqueio em telas secundárias é implementada como uma janela Presentation em KeyguardDisplayManager. O Android 10 mudou KeyguardDisplayManager#mPresentations para uma matriz que contém todas as janelas de bloqueio de todas as telas secundárias. KeyguardDisplayManager também tem um listener de mudança de exibição 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 particulares são responsáveis por proteger o conteúdo quando um dispositivo é bloqueado.