Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9c62dcb authored by Grace Cheng's avatar Grace Cheng
Browse files

Implements disabled keyguard transitions + security features for secure lock

Implements all security features from PRD (disable new WiFi, Bluetooth,
ADB connections), disable app pinning, disable NFC, assistant,
notifications, SMS, widgets, etc.

Also disables transitions to shade, quick settings, dream,
glanceable hub, communal scenes and notifications shade / quick settings
overlay, and alternate bouncer.

Flag: android.security.secure_lock_device
Bug: 401645997
Fixes: 396680098
Test: (manual) Ensure security features are active
Test: atest AuthenticationPolicyServiceTest
Test: atest SecureLockDeviceServiceTest
Change-Id: I48b21150384051def50f600822a0b9ea7d51b9c7
parent 3cb80002
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.bouncer.domain.interactor

import android.platform.test.annotations.EnableFlags
import android.security.Flags.FLAG_SECURE_LOCK_DEVICE
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -31,9 +33,11 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.kosmos.testScope
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.securelockdevice.data.repository.fakeSecureLockDeviceRepository
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
@@ -86,6 +90,18 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
            assertThat(canShowAlternateBouncer).isFalse()
        }

    @EnableFlags(FLAG_SECURE_LOCK_DEVICE)
    @Test
    fun canShowAlternateBouncerForFingerprint_falseDuringSecureLockDevice() =
        kosmos.testScope.runTest {
            kosmos.givenAlternateBouncerSupported()
            val canShowAlternateBouncer by collectLastValue(underTest.canShowAlternateBouncer)
            kosmos.fakeSecureLockDeviceRepository.onSecureLockDeviceEnabled()
            runCurrent()

            assertThat(canShowAlternateBouncer).isFalse()
        }

    @Test
    fun hide_wasPreviouslyShowing() {
        kosmos.keyguardBouncerRepository.setAlternateVisible(true)
+2 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.securelockdevice.domain.interactor.secureLockDeviceInteractor
import com.android.systemui.shade.pulsingGestureListener
import com.android.systemui.shared.settings.data.repository.SecureSettingsRepository
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
@@ -443,6 +444,7 @@ class KeyguardTouchHandlingInteractorTest : SysuiTestCase() {
                powerManager = powerManager,
                systemClock = kosmos.fakeSystemClock,
                pointerDeviceRepository = kosmos.pointerDeviceRepository,
                secureLockDeviceInteractor = { kosmos.secureLockDeviceInteractor },
            )
        setUpState()
    }
+9 −3
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.securelockdevice.domain.interactor.SecureLockDeviceInteractor
import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf
import dagger.Lazy
import javax.inject.Inject
@@ -60,6 +61,7 @@ constructor(
    keyguardTransitionInteractor: Lazy<KeyguardTransitionInteractor>,
    displayStateInteractor: Lazy<DisplayStateInteractor>,
    sceneInteractor: Lazy<SceneInteractor>,
    secureLockDeviceInteractor: Lazy<SecureLockDeviceInteractor>,
    @Application scope: CoroutineScope,
) {
    private var receivedDownTouch = false
@@ -105,10 +107,14 @@ constructor(
                    combine(
                            keyguardTransitionInteractor.get().currentKeyguardState,
                            sceneInteractor.get().currentScene,
                            ::Pair,
                            secureLockDeviceInteractor.get().isSecureLockDeviceEnabled,
                            ::Triple,
                        )
                        .flatMapLatest { (currentKeyguardState, transitionState) ->
                            if (currentKeyguardState == KeyguardState.GONE) {
                        .flatMapLatest {
                            (currentKeyguardState, transitionState, secureLockDeviceEnabled) ->
                            if (secureLockDeviceEnabled) {
                                flowOf(false)
                            } else if (currentKeyguardState == KeyguardState.GONE) {
                                flowOf(false)
                            } else if (
                                SceneContainerFlag.isEnabled && transitionState == Scenes.Gone
+16 −4
Original line number Diff line number Diff line
@@ -40,12 +40,14 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.res.R
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.securelockdevice.domain.interactor.SecureLockDeviceInteractor
import com.android.systemui.shade.PulsingGestureListener
import com.android.systemui.shade.ShadeDisplayAware
import com.android.systemui.shared.settings.data.repository.SecureSettingsRepository
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper
import com.android.systemui.util.time.SystemClock
import dagger.Lazy
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
@@ -83,6 +85,7 @@ constructor(
    private val powerManager: PowerManager,
    private val systemClock: SystemClock,
    private val pointerDeviceRepository: PointerDeviceRepository,
    secureLockDeviceInteractor: Lazy<SecureLockDeviceInteractor>,
) {
    private val _udfpsAccessibilityOverlayBounds: MutableStateFlow<Rect?> = MutableStateFlow(null)

@@ -100,8 +103,14 @@ constructor(
                combine(
                    transitionInteractor.isFinishedIn(KeyguardState.LOCKSCREEN),
                    repository.isQuickSettingsVisible,
                ) { isFullyTransitionedToLockScreen, isQuickSettingsVisible ->
                    isFullyTransitionedToLockScreen && !isQuickSettingsVisible
                    secureLockDeviceInteractor.get().isSecureLockDeviceEnabled,
                ) {
                    isFullyTransitionedToLockScreen,
                    isQuickSettingsVisible,
                    isSecureLockDeviceEnabled ->
                    isFullyTransitionedToLockScreen &&
                        !isQuickSettingsVisible &&
                        !isSecureLockDeviceEnabled
                }
            } else {
                flowOf(false)
@@ -119,13 +128,16 @@ constructor(
                    transitionInteractor.transitionValue(KeyguardState.LOCKSCREEN),
                    repository.isQuickSettingsVisible,
                    isDoubleTapSettingEnabled(),
                    secureLockDeviceInteractor.get().isSecureLockDeviceEnabled,
                ) {
                    isFullyTransitionedToLockScreen,
                    isQuickSettingsVisible,
                    isDoubleTapSettingEnabled ->
                    isDoubleTapSettingEnabled,
                    isSecureLockDeviceEnabled ->
                    isFullyTransitionedToLockScreen == 1f &&
                        !isQuickSettingsVisible &&
                        isDoubleTapSettingEnabled
                        isDoubleTapSettingEnabled &&
                        !isSecureLockDeviceEnabled
                }
            } else {
                flowOf(false)
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInterac
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testScope
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.securelockdevice.domain.interactor.secureLockDeviceInteractor

val Kosmos.alternateBouncerInteractor: AlternateBouncerInteractor by
    Kosmos.Fixture {
@@ -37,6 +38,7 @@ val Kosmos.alternateBouncerInteractor: AlternateBouncerInteractor by
            scope = testScope.backgroundScope,
            sceneInteractor = { sceneInteractor },
            displayStateInteractor = { displayStateInteractor },
            secureLockDeviceInteractor = { secureLockDeviceInteractor },
        )
    }

Loading