diff --git a/res/layout-land/fingerprint_v2_udfps_enroll_enrolling.xml b/res/layout-land/fingerprint_v2_udfps_enroll_enrolling.xml
index 86768d6b43f..669c282a2aa 100644
--- a/res/layout-land/fingerprint_v2_udfps_enroll_enrolling.xml
+++ b/res/layout-land/fingerprint_v2_udfps_enroll_enrolling.xml
@@ -14,87 +14,65 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-
-
+
-
-
-
+ >
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
diff --git a/res/layout/fingerprint_v2_udfps_enroll_enrolling.xml b/res/layout/fingerprint_v2_udfps_enroll_enrolling.xml
index ab8fb2c3ae5..497e164292c 100644
--- a/res/layout/fingerprint_v2_udfps_enroll_enrolling.xml
+++ b/res/layout/fingerprint_v2_udfps_enroll_enrolling.xml
@@ -19,7 +19,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/udfps_layout"
- style="?attr/fingerprint_layout_theme"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@@ -27,65 +26,57 @@
+ android:layout_weight="5"
+ >
-
+
-
-
-
-
-
-
+
+
+
+
+
+
-
diff --git a/res/layout/fingerprint_v2_udfps_enroll_view.xml b/res/layout/fingerprint_v2_udfps_enroll_view.xml
index 20df6e138ea..9002eca8fd1 100644
--- a/res/layout/fingerprint_v2_udfps_enroll_view.xml
+++ b/res/layout/fingerprint_v2_udfps_enroll_view.xml
@@ -21,6 +21,8 @@
android:id="@+id/udfps_animation_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false"
android:orientation="vertical">
+ Log.d(TAG, "onUdfpsPointerDown failed to send, due to $error")
+ }
+ }
+
+ override fun onUdfpsPointerUp(sensorId: Int) {
+ trySend(FingerEnrollState.PointerUp(sensorId)).onFailure { error ->
+ Log.d(TAG, "onUdfpsPointerUp failed to send, due to $error")
+ }
+ }
+
+ override fun onUdfpsOverlayShown() {
+ trySend(FingerEnrollState.OverlayShown).onFailure { error ->
+ Log.d(TAG, "OverlayShown failed to send, due to $error")
+ }
+ }
+
+ override fun onAcquired(isAcquiredGood: Boolean) {
+ trySend(FingerEnrollState.Acquired(isAcquiredGood)).onFailure { error ->
+ Log.d(TAG, "Acquired failed to send, due to $error")
+ }
+ }
}
val cancellationSignal = CancellationSignal()
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt
index f9276e63ddf..3ecf3121158 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt
@@ -17,17 +17,12 @@
package com.android.settings.biometrics.fingerprint2.domain.interactor
import android.content.Context
-import android.util.Log
import android.view.OrientationEventListener
import com.android.internal.R
-import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.shareIn
-import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.transform
/** Interactor which provides information about orientation */
@@ -35,7 +30,9 @@ interface OrientationInteractor {
/** A flow that contains the information about the orientation changing */
val orientation: Flow
/**
- * A flow that contains the rotation info
+ * This indicates the surface rotation that hte view is currently in. For instance its possible to
+ * rotate a view to 90 degrees but for it to still be portrait mode. In this case, this flow
+ * should emit that we are in rotation 0 (SurfaceView.Rotation_0)
*/
val rotation: Flow
/**
@@ -50,8 +47,7 @@ interface OrientationInteractor {
fun getRotationFromDefault(rotation: Int): Int
}
-class OrientationInteractorImpl(private val context: Context, activityScope: CoroutineScope) :
- OrientationInteractor {
+class OrientationInteractorImpl(private val context: Context) : OrientationInteractor {
override val orientation: Flow = callbackFlow {
val orientationEventListener =
@@ -62,9 +58,12 @@ class OrientationInteractorImpl(private val context: Context, activityScope: Cor
}
orientationEventListener.enable()
awaitClose { orientationEventListener.disable() }
- }.shareIn(activityScope, SharingStarted.Eagerly, replay = 1)
+ }
- override val rotation: Flow = orientation.transform { emit(context.display!!.rotation) }
+ override val rotation: Flow =
+ orientation.transform {
+ emit(context.display!!.rotation)
+ }
override val rotationFromDefault: Flow = rotation.map { getRotationFromDefault(it) }
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/UdfpsEnrollInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/UdfpsEnrollInteractor.kt
index ec09ffd0011..107d1f65459 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/UdfpsEnrollInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/UdfpsEnrollInteractor.kt
@@ -17,6 +17,7 @@
package com.android.settings.biometrics.fingerprint2.domain.interactor
import android.graphics.PointF
+import android.util.Log
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
@@ -69,6 +70,7 @@ class UdfpsEnrollInteractorImpl(
override fun onEnrollmentStep(stepsRemaining: Int, totalStep: Int) {
val index = (totalStep - stepsRemaining) % guidedEnrollmentPoints.size
+ Log.e("JRM", "guided enroll step $index")
_guidedEnrollment.update { guidedEnrollmentPoints[index] }
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
index 24a9a86f339..e087304d4f0 100644
--- a/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
@@ -47,10 +47,10 @@ sealed class FingerEnrollState {
data class Acquired(val acquiredGood: Boolean) : FingerEnrollState()
/** Indicates a pointer down event has occurred */
- data object PointerDown : FingerEnrollState()
+ data class PointerDown(val fingerId: Int) : FingerEnrollState()
/** Indicates a pointer up event has occurred */
- data object PointerUp : FingerEnrollState()
+ data class PointerUp(val fingerId: Int) : FingerEnrollState()
/** Indicates the overlay has shown */
data object OverlayShown : FingerEnrollState()
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index 6d353a42a62..d25fcd06e36 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -72,6 +72,7 @@ import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enroll
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.fragment.RFPSEnrollFragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.udfps.ui.fragment.UdfpsEnrollFragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.udfps.ui.viewmodel.UdfpsLastStepViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.udfps.ui.viewmodel.UdfpsViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
@@ -126,6 +127,7 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() {
private lateinit var fingerprintFlowViewModel: FingerprintFlowViewModel
private lateinit var fingerprintEnrollConfirmationViewModel:
FingerprintEnrollConfirmationViewModel
+ private lateinit var udfpsLastStepViewModel: UdfpsLastStepViewModel
private lateinit var udfpsViewModel: UdfpsViewModel
private lateinit var enrollStageInteractor: EnrollStageInteractor
private val coroutineDispatcher = Dispatchers.Default
@@ -320,7 +322,7 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() {
foldStateInteractor = FoldStateInteractorImpl(context)
foldStateInteractor.onConfigurationChange(resources.configuration)
- orientationInteractor = OrientationInteractorImpl(context, lifecycleScope)
+ orientationInteractor = OrientationInteractorImpl(context)
vibrationInteractor =
VibrationInteractorImpl(context.getSystemService(Vibrator::class.java)!!, context)
@@ -373,11 +375,15 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() {
fingerprintEnrollEnrollingViewModel,
navigationViewModel,
orientationInteractor,
+ fingerprintManagerInteractor,
),
)[RFPSViewModel::class.java]
enrollStageInteractor = EnrollStageInteractorImpl()
+ udfpsLastStepViewModel =
+ UdfpsLastStepViewModel(fingerprintEnrollEnrollingViewModel, vibrationInteractor)
+
udfpsViewModel =
ViewModelProvider(
this,
@@ -393,6 +399,9 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() {
backgroundViewModel,
fingerprintSensorRepo,
udfpsEnrollInteractor,
+ fingerprintManagerInteractor,
+ udfpsLastStepViewModel,
+ accessibilityInteractor,
),
)[UdfpsViewModel::class.java]
@@ -456,7 +465,7 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() {
step.exitTransition.toAnimation(),
)
.setReorderingAllowed(true)
- .add(R.id.fragment_container_view, theClass::class.java, null)
+ .replace(R.id.fragment_container_view, theClass::class.java, null)
.commit()
navigationViewModel.update(
FingerprintAction.TRANSITION_FINISHED,
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
index 06450814103..8abcf1a3a93 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
@@ -20,15 +20,18 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
@@ -41,6 +44,7 @@ class RFPSViewModel(
private val fingerprintEnrollViewModel: FingerprintEnrollEnrollingViewModel,
private val navigationViewModel: FingerprintNavigationViewModel,
orientationInteractor: OrientationInteractor,
+ private val fingerprintManager: FingerprintManagerInteractor,
) : ViewModel() {
private val _textViewIsVisible = MutableStateFlow(false)
@@ -52,7 +56,16 @@ class RFPSViewModel(
/** Indicates if the icon should be animating or not */
val shouldAnimateIcon = _shouldAnimateIcon
- private var enrollFlow: Flow = fingerprintEnrollViewModel.enrollFlow
+ private var enrollFlow: Flow =
+ fingerprintManager.sensorPropertiesInternal.filterNotNull().combine(
+ fingerprintEnrollViewModel.enrollFlow
+ ) { props, enroll ->
+ if (props.sensorType == FingerprintSensorType.REAR) {
+ enroll
+ } else {
+ null
+ }
+ }
/**
* Enroll progress message with a replay of size 1 allowing for new subscribers to get the most
@@ -149,6 +162,7 @@ class RFPSViewModel(
private val fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel,
private val navigationViewModel: FingerprintNavigationViewModel,
private val orientationInteractor: OrientationInteractor,
+ private val fingerprintManager: FingerprintManagerInteractor,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
@@ -157,6 +171,7 @@ class RFPSViewModel(
fingerprintEnrollEnrollingViewModel,
navigationViewModel,
orientationInteractor,
+ fingerprintManager,
)
as T
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/udfps/ui/fragment/UdfpsEnrollFragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/udfps/ui/fragment/UdfpsEnrollFragment.kt
index a2e52329dd8..4588a07db63 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/udfps/ui/fragment/UdfpsEnrollFragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/udfps/ui/fragment/UdfpsEnrollFragment.kt
@@ -21,8 +21,10 @@ import android.util.Log
import android.view.MotionEvent
import android.view.MotionEvent.ACTION_HOVER_MOVE
import android.view.View
+import android.view.ViewGroup
import android.view.WindowManager
-import android.widget.TextView
+import android.widget.Button
+import android.widget.FrameLayout
import androidx.annotation.VisibleForTesting
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
@@ -40,7 +42,6 @@ import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enroll
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.udfps.ui.viewmodel.EducationAnimationModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.udfps.ui.viewmodel.UdfpsViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.udfps.ui.widget.UdfpsEnrollViewV2
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
import com.google.android.setupdesign.GlifLayout
import kotlinx.coroutines.launch
@@ -71,10 +72,8 @@ class UdfpsEnrollFragment() : Fragment(R.layout.fingerprint_v2_udfps_enroll_enro
val fragment = this
lottie = view.findViewById(R.id.illustration_lottie)!!
udfpsEnrollView = view.findViewById(R.id.udfps_animation_view)!!
- val titleTextView = view.findViewById(R.id.title)!!
- val descriptionTextView = view.findViewById(R.id.description)!!
+ val glifLayout: GlifLayout = view.findViewById(R.id.glif_layout)!!
- val glifLayout = view.findViewById(R.id.dummy_glif_layout)!!
val backgroundColor = glifLayout.backgroundBaseColor
val window = requireActivity().window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
@@ -83,6 +82,10 @@ class UdfpsEnrollFragment() : Fragment(R.layout.fingerprint_v2_udfps_enroll_enro
window.statusBarColor = color
view.setBackgroundColor(color)
+ view.findViewById