Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa1922ac authored by Joe Bolinger's avatar Joe Bolinger
Browse files

Add BiometricPrompt implementation with class 3 support.

This adds a new implementation of the prompt behind flag BIOMETRIC_BP_STRONG. The original prompt remains in place temporarily, with minimal modifications, until it can be replaced.

This first phases replaces the top most AuthBiometricView(s) but resues many of the legacy components (icon controllers, panel controller, container view, etc.), which will be replaced and simplified in follow ups. It also includes some changes to framework/sysui APIS required for the class 3 flows that cannot easily be flagged and impacts both implementations.

In addition to class 3 support, the secondary goal of this change is to simplify & address the lifecycle issues with the current implementation, align it with SysUI's architecture guidelines, & enable better unit test coverage (including uidiff).

Bug: 272510026
Bug: 251476085
Test: atest com.android.systemui/.iometrics
Test: manual (use BP integration test app and perform auth with all variations fp-only, face-only, coex)

Change-Id: Ib95906cc7f4837770b778e589ef5e6061e5f39de
parent b01cc001
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<!-- TODO(b/251476085): inline in biometric_prompt_layout after Biometric*Views are un-flagged -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<!-- TODO(b/251476085): remove after BiometricFaceView is un-flagged -->
<com.android.systemui.biometrics.AuthBiometricFaceView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/contents"
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<!-- TODO(b/251476085): remove after BiometricFingerprintAndFaceView is un-flagged -->
<com.android.systemui.biometrics.AuthBiometricFingerprintAndFaceView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/contents"
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<!-- TODO(b/251476085): remove after BiometricFingerprintView is un-flagged -->
<com.android.systemui.biometrics.AuthBiometricFingerprintView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/contents"
+176 −0
Original line number Diff line number Diff line
<!--
  ~ Copyright (C) 2023 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<com.android.systemui.biometrics.ui.BiometricPromptLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/contents"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="@integer/biometric_dialog_text_gravity"
        android:singleLine="true"
        android:marqueeRepeatLimit="1"
        android:ellipsize="marquee"
        android:importantForAccessibility="no"
        style="@style/TextAppearance.AuthCredential.Title"/>

    <TextView
        android:id="@+id/subtitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="@integer/biometric_dialog_text_gravity"
        android:singleLine="true"
        android:marqueeRepeatLimit="1"
        android:ellipsize="marquee"
        style="@style/TextAppearance.AuthCredential.Subtitle"/>

    <TextView
        android:id="@+id/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars ="vertical"
        android:importantForAccessibility="no"
        style="@style/TextAppearance.AuthCredential.Description"/>

    <Space android:id="@+id/space_above_icon"
        android:layout_width="match_parent"
        android:layout_height="48dp" />

    <FrameLayout
        android:id="@+id/biometric_icon_frame"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

        <com.airbnb.lottie.LottieAnimationView
            android:id="@+id/biometric_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:contentDescription="@null"
            android:scaleType="fitXY" />

        <com.airbnb.lottie.LottieAnimationView
            android:id="@+id/biometric_icon_overlay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:contentDescription="@null"
            android:scaleType="fitXY" />
    </FrameLayout>

    <!-- For sensors such as UDFPS, this view is used during custom measurement/layout to add extra
         padding so that the biometric icon is always in the right physical position. -->
    <Space android:id="@+id/space_below_icon"
        android:layout_width="match_parent"
        android:layout_height="12dp" />

    <TextView
        android:id="@+id/indicator"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingHorizontal="24dp"
        android:textSize="12sp"
        android:gravity="center_horizontal"
        android:accessibilityLiveRegion="polite"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:fadingEdge="horizontal"
        android:textColor="@color/biometric_dialog_gray"/>

    <LinearLayout
        android:id="@+id/button_bar"
        android:layout_width="match_parent"
        android:layout_height="88dp"
        style="?android:attr/buttonBarStyle"
        android:orientation="horizontal"
        android:paddingTop="24dp">

        <Space android:id="@+id/leftSpacer"
            android:layout_width="8dp"
            android:layout_height="match_parent"
            android:visibility="visible" />

        <!-- Negative Button, reserved for app -->
        <Button android:id="@+id/button_negative"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
            android:layout_gravity="center_vertical"
            android:ellipsize="end"
            android:maxLines="2"
            android:maxWidth="@dimen/biometric_dialog_button_negative_max_width"
            android:visibility="gone"/>
        <!-- Cancel Button, replaces negative button when biometric is accepted -->
        <Button android:id="@+id/button_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
            android:layout_gravity="center_vertical"
            android:maxWidth="@dimen/biometric_dialog_button_negative_max_width"
            android:text="@string/cancel"
            android:visibility="gone"/>
        <!-- "Use Credential" Button, replaces if device credential is allowed -->
        <Button android:id="@+id/button_use_credential"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
            android:layout_gravity="center_vertical"
            android:maxWidth="@dimen/biometric_dialog_button_negative_max_width"
            android:visibility="gone"/>

        <Space android:id="@+id/middleSpacer"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:visibility="visible"/>

        <!-- Positive Button -->
        <Button android:id="@+id/button_confirm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@*android:style/Widget.DeviceDefault.Button.Colored"
            android:layout_gravity="center_vertical"
            android:ellipsize="end"
            android:maxLines="2"
            android:maxWidth="@dimen/biometric_dialog_button_positive_max_width"
            android:text="@string/biometric_dialog_confirm"
            android:visibility="gone"/>
        <!-- Try Again Button -->
        <Button android:id="@+id/button_try_again"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@*android:style/Widget.DeviceDefault.Button.Colored"
            android:layout_gravity="center_vertical"
            android:ellipsize="end"
            android:maxLines="2"
            android:maxWidth="@dimen/biometric_dialog_button_positive_max_width"
            android:text="@string/biometric_dialog_try_again"
            android:visibility="gone"/>

        <Space android:id="@+id/rightSpacer"
            android:layout_width="8dp"
            android:layout_height="match_parent"
            android:visibility="visible" />
    </LinearLayout>

</com.android.systemui.biometrics.ui.BiometricPromptLayout>
Loading