diff options
11 files changed, 37 insertions, 35 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractor.kt index d92c2178046e..ac4b717a23ec 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractor.kt @@ -23,7 +23,7 @@ import com.android.systemui.biometrics.Utils import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.domain.model.BiometricOperationInfo import com.android.systemui.biometrics.domain.model.BiometricPromptRequest -import com.android.systemui.biometrics.domain.model.BiometricUserInfo +import com.android.systemui.biometrics.shared.model.BiometricUserInfo import com.android.systemui.biometrics.shared.model.PromptKind import com.android.systemui.dagger.qualifiers.Background import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptSelectorInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptSelectorInteractor.kt index be99dd92f1bd..bb87dca1cdc4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptSelectorInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptSelectorInteractor.kt @@ -25,7 +25,7 @@ import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.domain.model.BiometricModalities import com.android.systemui.biometrics.domain.model.BiometricOperationInfo import com.android.systemui.biometrics.domain.model.BiometricPromptRequest -import com.android.systemui.biometrics.domain.model.BiometricUserInfo +import com.android.systemui.biometrics.shared.model.BiometricUserInfo import com.android.systemui.biometrics.shared.model.PromptKind import com.android.systemui.dagger.SysUISingleton import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequest.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequest.kt index 75de47d12427..caebc30d1c07 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequest.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequest.kt @@ -1,6 +1,7 @@ package com.android.systemui.biometrics.domain.model import android.hardware.biometrics.PromptInfo +import com.android.systemui.biometrics.shared.model.BiometricUserInfo /** * Preferences for BiometricPrompt, such as title & description, that are immutable while the prompt diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricUserInfo.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricUserInfo.kt deleted file mode 100644 index 08da04d27606..000000000000 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricUserInfo.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.android.systemui.biometrics.domain.model - -/** Metadata about the current user BiometricPrompt is being shown to. */ -data class BiometricUserInfo( - val userId: Int, - val deviceCredentialOwnerId: Int = userId, -) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/BiometricUserInfo.kt b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/BiometricUserInfo.kt new file mode 100644 index 000000000000..39689ec16189 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/BiometricUserInfo.kt @@ -0,0 +1,12 @@ +package com.android.systemui.biometrics.shared.model + +/** + * Metadata about the current user BiometricPrompt is being shown to. + * + * If the user's fallback credential is owned by another profile user the [deviceCredentialOwnerId] + * will differ from the user's [userId]. + */ +data class BiometricUserInfo( + val userId: Int, + val deviceCredentialOwnerId: Int = userId, +) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt index 6fb8e345322c..c27d71522c2f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt @@ -1,5 +1,6 @@ package com.android.systemui.biometrics.ui.binder +import android.os.UserHandle import android.view.KeyEvent import android.view.View import android.view.inputmethod.EditorInfo @@ -9,6 +10,7 @@ import android.widget.TextView import android.window.OnBackInvokedCallback import android.window.OnBackInvokedDispatcher import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.android.systemui.R import com.android.systemui.biometrics.ui.CredentialPasswordView @@ -16,6 +18,8 @@ import com.android.systemui.biometrics.ui.CredentialView import com.android.systemui.biometrics.ui.viewmodel.CredentialViewModel import com.android.systemui.lifecycle.repeatWhenAttached import kotlinx.coroutines.awaitCancellation +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch /** Sub-binder for the [CredentialPasswordView]. */ @@ -35,31 +39,22 @@ object CredentialPasswordViewBinder { val onBackInvokedCallback = OnBackInvokedCallback { host.onCredentialAborted() } view.repeatWhenAttached { + // the header info never changes - do it early + val header = viewModel.header.first() + passwordField.setTextOperationUser(UserHandle.of(header.user.deviceCredentialOwnerId)) + viewModel.inputFlags.firstOrNull()?.let { flags -> passwordField.inputType = flags } if (requestFocusForInput) { passwordField.requestFocus() passwordField.scheduleShowSoftInput() } - - repeatOnLifecycle(Lifecycle.State.STARTED) { - // observe credential validation attempts and submit/cancel buttons - launch { - viewModel.header.collect { header -> - passwordField.setTextOperationUser(header.user) - passwordField.setOnEditorActionListener( - OnImeSubmitListener { text -> - launch { viewModel.checkCredential(text, header) } - } - ) - passwordField.setOnKeyListener(OnBackButtonListener(onBackInvokedCallback)) - } - } - - launch { - viewModel.inputFlags.collect { flags -> - flags?.let { passwordField.inputType = it } - } + passwordField.setOnEditorActionListener( + OnImeSubmitListener { text -> + lifecycleScope.launch { viewModel.checkCredential(text, header) } } + ) + passwordField.setOnKeyListener(OnBackButtonListener(onBackInvokedCallback)) + repeatOnLifecycle(Lifecycle.State.STARTED) { // dismiss on a valid credential check launch { viewModel.validatedAttestation.collect { attestation -> diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt index a64798cba745..3257f20815d8 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt @@ -1,11 +1,11 @@ package com.android.systemui.biometrics.ui.viewmodel import android.graphics.drawable.Drawable -import android.os.UserHandle +import com.android.systemui.biometrics.shared.model.BiometricUserInfo /** View model for the top-level header / info area of BiometricPrompt. */ interface CredentialHeaderViewModel { - val user: UserHandle + val user: BiometricUserInfo val title: String val subtitle: String val description: String diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt index 9d7b94081145..a3b23ca89cad 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt @@ -2,7 +2,6 @@ package com.android.systemui.biometrics.ui.viewmodel import android.content.Context import android.graphics.drawable.Drawable -import android.os.UserHandle import android.text.InputType import com.android.internal.widget.LockPatternView import com.android.systemui.R @@ -10,6 +9,7 @@ import com.android.systemui.biometrics.Utils import com.android.systemui.biometrics.domain.interactor.CredentialStatus import com.android.systemui.biometrics.domain.interactor.PromptCredentialInteractor import com.android.systemui.biometrics.domain.model.BiometricPromptRequest +import com.android.systemui.biometrics.shared.model.BiometricUserInfo import com.android.systemui.dagger.qualifiers.Application import javax.inject.Inject import kotlin.reflect.KClass @@ -36,7 +36,7 @@ constructor( request -> BiometricPromptHeaderViewModelImpl( request, - user = UserHandle.of(request.userInfo.userId), + user = request.userInfo, title = request.title, subtitle = request.subtitle, description = request.description, @@ -169,7 +169,7 @@ private fun Context.asLockIcon(userId: Int): Drawable { private class BiometricPromptHeaderViewModelImpl( val request: BiometricPromptRequest.Credential, - override val user: UserHandle, + override val user: BiometricUserInfo, override val title: String, override val subtitle: String, override val description: String, diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractorImplTest.kt index 97d3e688ed80..5eda2b28175d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractorImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractorImplTest.kt @@ -11,8 +11,8 @@ import com.android.internal.widget.VerifyCredentialResponse import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.domain.model.BiometricOperationInfo import com.android.systemui.biometrics.domain.model.BiometricPromptRequest -import com.android.systemui.biometrics.domain.model.BiometricUserInfo import com.android.systemui.biometrics.promptInfo +import com.android.systemui.biometrics.shared.model.BiometricUserInfo import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.whenever diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt index 720a35c9024f..dcefea28d4c8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt @@ -7,8 +7,8 @@ import com.android.systemui.biometrics.Utils import com.android.systemui.biometrics.data.repository.FakePromptRepository import com.android.systemui.biometrics.domain.model.BiometricOperationInfo import com.android.systemui.biometrics.domain.model.BiometricPromptRequest -import com.android.systemui.biometrics.domain.model.BiometricUserInfo import com.android.systemui.biometrics.promptInfo +import com.android.systemui.biometrics.shared.model.BiometricUserInfo import com.android.systemui.coroutines.collectLastValue import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt index e3529055c223..be0276a0413e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt @@ -4,6 +4,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.fingerprintSensorPropertiesInternal import com.android.systemui.biometrics.promptInfo +import com.android.systemui.biometrics.shared.model.BiometricUserInfo import com.google.common.truth.Truth.assertThat import org.junit.Test import org.junit.runner.RunWith |