Loading packages/SystemUI/src/com/android/systemui/securelockdevice/ui/composable/SecureLockDeviceBiometricAuthContent.kt +30 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import androidx.compose.animation.fadeOut import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding Loading @@ -50,6 +51,7 @@ import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.role import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import com.airbnb.lottie.compose.LottieAnimation import com.airbnb.lottie.compose.LottieClipSpec import com.airbnb.lottie.compose.LottieCompositionSpec Loading @@ -62,6 +64,9 @@ import com.android.compose.modifiers.width import com.android.systemui.Flags.bpColors import com.android.systemui.biometrics.BiometricAuthIconAssets import com.android.systemui.bouncer.shared.model.SecureLockDeviceBouncerActionButtonModel import com.android.systemui.deviceentry.ui.binder.UdfpsAccessibilityOverlayBinder import com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.lifecycle.rememberActivated import com.android.systemui.res.R import com.android.systemui.securelockdevice.ui.viewmodel.SecureLockDeviceBiometricAuthContentViewModel Loading Loading @@ -123,6 +128,7 @@ fun SecureLockDeviceContent( ) } val hasUdfps: Boolean = secureLockDeviceViewModel.iconViewModel.hasUdfpsState val iconSize: Pair<Int, Int> = secureLockDeviceViewModel.iconViewModel.iconSizeState val iconBottomPadding = dimensionResource(R.dimen.biometric_prompt_portrait_medium_bottom_padding) Loading @@ -137,6 +143,14 @@ fun SecureLockDeviceContent( .height { iconSize.second }, ) } val shouldListenForBiometricAuth = secureLockDeviceViewModel.shouldListenForBiometricAuth if (hasUdfps && shouldListenForBiometricAuth) { UdfpsA11yOverlay( viewModel = secureLockDeviceViewModel.udfpsAccessibilityOverlayViewModel, modifier = Modifier.fillMaxHeight(), ) } } } Loading Loading @@ -286,3 +300,19 @@ fun ButtonArea( } } } @Composable fun UdfpsA11yOverlay( viewModel: AlternateBouncerUdfpsAccessibilityOverlayViewModel, modifier: Modifier = Modifier, ) { AndroidView( factory = { context -> val view = UdfpsAccessibilityOverlay(context).apply { id = R.id.udfps_accessibility_overlay } UdfpsAccessibilityOverlayBinder.bind(view, viewModel) view }, modifier = modifier, ) } packages/SystemUI/src/com/android/systemui/securelockdevice/ui/viewmodel/SecureLockDeviceBiometricAuthContentViewModel.kt +9 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.systemui.deviceentry.domain.interactor.SystemUIDeviceEntryFac import com.android.systemui.deviceentry.shared.model.FaceMessage import com.android.systemui.deviceentry.shared.model.FingerprintMessage import com.android.systemui.deviceentry.shared.model.SuccessFaceAuthenticationStatus import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus import com.android.systemui.lifecycle.HydratedActivatable import com.android.systemui.scene.shared.flag.SceneContainerFlag Loading Loading @@ -72,10 +73,18 @@ constructor( private val deviceEntryFaceAuthInteractor: SystemUIDeviceEntryFaceAuthInteractor, deviceEntryFingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor, private val secureLockDeviceInteractor: SecureLockDeviceInteractor, val udfpsAccessibilityOverlayViewModel: AlternateBouncerUdfpsAccessibilityOverlayViewModel, ) : HydratedActivatable() { /** @see SecureLockDeviceInteractor.isSecureLockDeviceEnabled */ val isSecureLockDeviceEnabled = secureLockDeviceInteractor.isSecureLockDeviceEnabled /** @see SecureLockDeviceInteractor.shouldListenForBiometricAuth */ val shouldListenForBiometricAuth: Boolean by secureLockDeviceInteractor.shouldListenForBiometricAuth.hydratedStateOf( traceName = "shouldListenForBiometricAuth", initialValue = false, ) /** @see SecureLockDeviceInteractor.enrolledStrongBiometricModalities */ val enrolledStrongBiometrics = secureLockDeviceInteractor.enrolledStrongBiometricModalities Loading packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/ui/viewmodel/UdfpsAccessibilityOverlayViewModelKosmos.kt +12 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import com.android.systemui.accessibility.domain.interactor.accessibilityInterac import com.android.systemui.biometrics.domain.interactor.udfpsOverlayInteractor import com.android.systemui.biometrics.udfpsUtils import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.deviceentry.ui.viewmodel.DeviceEntryUdfpsAccessibilityOverlayViewModel import com.android.systemui.keyguard.ui.viewmodel.deviceEntryForegroundIconViewModel import com.android.systemui.keyguard.ui.viewmodel.deviceEntryIconViewModel Loading @@ -38,3 +39,14 @@ val Kosmos.deviceEntryUdfpsAccessibilityOverlayViewModel by deviceEntryFgIconViewModel = deviceEntryForegroundIconViewModel, ) } val Kosmos.alternateBouncerUdfpsAccessibilityOverlayViewModel by Kosmos.Fixture { AlternateBouncerUdfpsAccessibilityOverlayViewModel( applicationContext = applicationContext, deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, udfpsOverlayInteractor = udfpsOverlayInteractor, udfpsUtils = udfpsUtils, accessibilityInteractor = accessibilityInteractor, ) } packages/SystemUI/tests/utils/src/com/android/systemui/securelockdevice/ui/viewmodel/SecureLockDeviceBiometricAuthContentViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.securelockdevice.ui.viewmodel import android.view.accessibility.accessibilityManager import com.android.systemui.biometrics.ui.viewmodel.biometricAuthIconViewModelFactory_secureLockDevice import com.android.systemui.bouncer.domain.interactor.bouncerActionButtonInteractor import com.android.systemui.deviceentry.data.ui.viewmodel.alternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.deviceentry.domain.interactor.biometricMessageInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryFaceAuthInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryFingerprintAuthInteractor Loading @@ -39,6 +40,7 @@ var Kosmos.secureLockDeviceBiometricAuthContentViewModel by Fixture { deviceEntryFaceAuthInteractor = deviceEntryFaceAuthInteractor, deviceEntryFingerprintAuthInteractor = deviceEntryFingerprintAuthInteractor, secureLockDeviceInteractor = secureLockDeviceInteractor, udfpsAccessibilityOverlayViewModel = alternateBouncerUdfpsAccessibilityOverlayViewModel, ) } Loading Loading
packages/SystemUI/src/com/android/systemui/securelockdevice/ui/composable/SecureLockDeviceBiometricAuthContent.kt +30 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import androidx.compose.animation.fadeOut import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding Loading @@ -50,6 +51,7 @@ import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.role import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import com.airbnb.lottie.compose.LottieAnimation import com.airbnb.lottie.compose.LottieClipSpec import com.airbnb.lottie.compose.LottieCompositionSpec Loading @@ -62,6 +64,9 @@ import com.android.compose.modifiers.width import com.android.systemui.Flags.bpColors import com.android.systemui.biometrics.BiometricAuthIconAssets import com.android.systemui.bouncer.shared.model.SecureLockDeviceBouncerActionButtonModel import com.android.systemui.deviceentry.ui.binder.UdfpsAccessibilityOverlayBinder import com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.lifecycle.rememberActivated import com.android.systemui.res.R import com.android.systemui.securelockdevice.ui.viewmodel.SecureLockDeviceBiometricAuthContentViewModel Loading Loading @@ -123,6 +128,7 @@ fun SecureLockDeviceContent( ) } val hasUdfps: Boolean = secureLockDeviceViewModel.iconViewModel.hasUdfpsState val iconSize: Pair<Int, Int> = secureLockDeviceViewModel.iconViewModel.iconSizeState val iconBottomPadding = dimensionResource(R.dimen.biometric_prompt_portrait_medium_bottom_padding) Loading @@ -137,6 +143,14 @@ fun SecureLockDeviceContent( .height { iconSize.second }, ) } val shouldListenForBiometricAuth = secureLockDeviceViewModel.shouldListenForBiometricAuth if (hasUdfps && shouldListenForBiometricAuth) { UdfpsA11yOverlay( viewModel = secureLockDeviceViewModel.udfpsAccessibilityOverlayViewModel, modifier = Modifier.fillMaxHeight(), ) } } } Loading Loading @@ -286,3 +300,19 @@ fun ButtonArea( } } } @Composable fun UdfpsA11yOverlay( viewModel: AlternateBouncerUdfpsAccessibilityOverlayViewModel, modifier: Modifier = Modifier, ) { AndroidView( factory = { context -> val view = UdfpsAccessibilityOverlay(context).apply { id = R.id.udfps_accessibility_overlay } UdfpsAccessibilityOverlayBinder.bind(view, viewModel) view }, modifier = modifier, ) }
packages/SystemUI/src/com/android/systemui/securelockdevice/ui/viewmodel/SecureLockDeviceBiometricAuthContentViewModel.kt +9 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.systemui.deviceentry.domain.interactor.SystemUIDeviceEntryFac import com.android.systemui.deviceentry.shared.model.FaceMessage import com.android.systemui.deviceentry.shared.model.FingerprintMessage import com.android.systemui.deviceentry.shared.model.SuccessFaceAuthenticationStatus import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus import com.android.systemui.lifecycle.HydratedActivatable import com.android.systemui.scene.shared.flag.SceneContainerFlag Loading Loading @@ -72,10 +73,18 @@ constructor( private val deviceEntryFaceAuthInteractor: SystemUIDeviceEntryFaceAuthInteractor, deviceEntryFingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor, private val secureLockDeviceInteractor: SecureLockDeviceInteractor, val udfpsAccessibilityOverlayViewModel: AlternateBouncerUdfpsAccessibilityOverlayViewModel, ) : HydratedActivatable() { /** @see SecureLockDeviceInteractor.isSecureLockDeviceEnabled */ val isSecureLockDeviceEnabled = secureLockDeviceInteractor.isSecureLockDeviceEnabled /** @see SecureLockDeviceInteractor.shouldListenForBiometricAuth */ val shouldListenForBiometricAuth: Boolean by secureLockDeviceInteractor.shouldListenForBiometricAuth.hydratedStateOf( traceName = "shouldListenForBiometricAuth", initialValue = false, ) /** @see SecureLockDeviceInteractor.enrolledStrongBiometricModalities */ val enrolledStrongBiometrics = secureLockDeviceInteractor.enrolledStrongBiometricModalities Loading
packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/ui/viewmodel/UdfpsAccessibilityOverlayViewModelKosmos.kt +12 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import com.android.systemui.accessibility.domain.interactor.accessibilityInterac import com.android.systemui.biometrics.domain.interactor.udfpsOverlayInteractor import com.android.systemui.biometrics.udfpsUtils import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.deviceentry.ui.viewmodel.DeviceEntryUdfpsAccessibilityOverlayViewModel import com.android.systemui.keyguard.ui.viewmodel.deviceEntryForegroundIconViewModel import com.android.systemui.keyguard.ui.viewmodel.deviceEntryIconViewModel Loading @@ -38,3 +39,14 @@ val Kosmos.deviceEntryUdfpsAccessibilityOverlayViewModel by deviceEntryFgIconViewModel = deviceEntryForegroundIconViewModel, ) } val Kosmos.alternateBouncerUdfpsAccessibilityOverlayViewModel by Kosmos.Fixture { AlternateBouncerUdfpsAccessibilityOverlayViewModel( applicationContext = applicationContext, deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, udfpsOverlayInteractor = udfpsOverlayInteractor, udfpsUtils = udfpsUtils, accessibilityInteractor = accessibilityInteractor, ) }
packages/SystemUI/tests/utils/src/com/android/systemui/securelockdevice/ui/viewmodel/SecureLockDeviceBiometricAuthContentViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.securelockdevice.ui.viewmodel import android.view.accessibility.accessibilityManager import com.android.systemui.biometrics.ui.viewmodel.biometricAuthIconViewModelFactory_secureLockDevice import com.android.systemui.bouncer.domain.interactor.bouncerActionButtonInteractor import com.android.systemui.deviceentry.data.ui.viewmodel.alternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.deviceentry.domain.interactor.biometricMessageInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryFaceAuthInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryFingerprintAuthInteractor Loading @@ -39,6 +40,7 @@ var Kosmos.secureLockDeviceBiometricAuthContentViewModel by Fixture { deviceEntryFaceAuthInteractor = deviceEntryFaceAuthInteractor, deviceEntryFingerprintAuthInteractor = deviceEntryFingerprintAuthInteractor, secureLockDeviceInteractor = secureLockDeviceInteractor, udfpsAccessibilityOverlayViewModel = alternateBouncerUdfpsAccessibilityOverlayViewModel, ) } Loading