Set password field user before showing IME.
Bug: 288452496 Test: manual (use BP test app with DEVICE_CREDENTIAL set and verify IME is shown when pin/password button is shown) Change-Id: I77f6d5d9d089a56436339705c32f0ae0566d9b84
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
@@ -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,
|
||||
)
|
||||
@@ -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 ->
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user