Merge "Set password field user before showing IME." into udc-qpr-dev

This commit is contained in:
Joe Bolinger
2023-07-07 22:55:33 +00:00
committed by Android (Google) Code Review
11 changed files with 37 additions and 35 deletions

View File

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

View File

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

View File

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

View File

@@ -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,
)

View File

@@ -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,
)

View File

@@ -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()
}
passwordField.setOnEditorActionListener(
OnImeSubmitListener { text ->
lifecycleScope.launch { viewModel.checkCredential(text, header) }
}
)
passwordField.setOnKeyListener(OnBackButtonListener(onBackInvokedCallback))
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 }
}
}
// dismiss on a valid credential check
launch {
viewModel.validatedAttestation.collect { attestation ->

View File

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

View File

@@ -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,

View File

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

View File

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

View File

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