Блокировка экрана

Реализация заблокированного экрана по умолчанию в AOSP с возможностью разблокировки (keyguard) появляется только на основном дисплее. В Android 9 и более ранних версиях на дополнительных экранах поддерживалось одно окно блокировки на одном внешнем дисплее. В Android 10 заблокированный экран расширен на все общедоступные дополнительные дисплеи. Заблокированный экран остается простым и не поддерживает разблокировку с дополнительных экранов.

Рисунок 1. Блокировка экрана на дополнительном дисплее

Производители устройств могут реализовать блокировку экрана для дополнительных дисплеев, если соблюдаются основные требования безопасности. Когда устройство заблокировано, информация должна быть надежно скрыта на всех экранах. Встроенных правил или настроек, позволяющих управлять тем, какой контент должен показываться или скрываться, когда устройство заблокировано, нет. Поэтому единственный безопасный способ ограничить доступ – скрыть весь контент за заблокированным экраном и заблокированными окнами. Исключение составляют только приложения, которые явно разрешили показывать их поверх заблокированного экрана, используя методы R.attr.showWhenLocked или Activity.setShowWhenLocked(). В противном случае существует высокий риск утечки информации с общедоступных и частных экранов.

Хотя дисплеи могут находиться в разных состояниях (ON/OFF), состояние блокировки является глобальным для всех дисплеев. Как и в случае с любым другим устройством, пользователю должно быть очевидно, когда устройство заблокировано (или разблокировано). Например, нажатие кнопки питания обычно блокирует мобильное устройство. Кнопка питания также должна блокировать все внутренние и внешние экраны.

Поскольку окно блокировки принадлежит SystemUI, оно не будет размещено на частных дисплеях. Владельцы частных экранов несут ответственность за то, чтобы окна были скрыты, а контент защищен, когда устройство заблокировано. Реализация системы по умолчанию только скрывает действия на частных экранах, изменяя видимость.

Реализация

Окно блокировки на дополнительных экранах реализовано как окно Presentation в KeyguardDisplayManager. В Android 10 параметр KeyguardDisplayManager#mPresentations был изменен на массив, в котором хранятся все блокирующие окна для всех дополнительных экранов. KeyguardDisplayManager также имеет слушатель изменений дисплея, чтобы реагировать на изменения доступных дисплеев и защищать все экраны. Важно немедленно блокировать все подключенные дисплеи в любой момент времени, чтобы злоумышленники не могли извлечь пользовательские данные, даже имея физический доступ к устройству.

Окно блокировки показывается на всех общедоступных дополнительных экранах (см. KeyguardDisplayManager#isKeyguardShowable()). Владельцы частных экранов должны самостоятельно защищать контент, когда устройство заблокировано.