Tela de bloqueio

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 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.