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

Commit fc46826f authored by Kevin Chyn's avatar Kevin Chyn
Browse files

1/n: Refactor BiometricPrompt UI hierarchy

The UI is split into a few components now
 1) BiometricPromptContainerView - top level, contains the work profile
    background view, the panel (rounded background)
 2) BiometricPromptBiometricView - nested within, displays contents for
    biometric auth

The panel must be one level higher (in hierarchy) than the biometric
dialog to allow future non-biometric views to be added cleanly, and to
allow separate animations for the background/foreground.

Bug: 123378871
Test: Demo app with text that requires scrolling; dialog bounds are correct,
      view elements are contained within the dialog bounds
Test: atest BiometricDialogImplTest
Test: atest BiometricDialogViewTest
Test: atest AuthBiometricViewTest
Test: atest AuthBiometricFaceViewTest

Change-Id: Ie4e5a8641a10229154a1011afefacb823aadf565
parent 4077d36b
Loading
Loading
Loading
Loading
+119 −0
Original line number Diff line number Diff line
<!--
  ~ Copyright (C) 2019 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.
  -->

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/title"
        android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingHorizontal="24dp"
        android:paddingTop="24dp"
        android:gravity="@integer/biometric_dialog_text_gravity"
        android:textSize="20sp"
        android:textColor="?android:attr/textColorPrimary"/>

    <TextView
        android:id="@+id/subtitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="8dp"
        android:paddingHorizontal="24dp"
        android:gravity="@integer/biometric_dialog_text_gravity"
        android:textSize="16sp"
        android:textColor="?android:attr/textColorPrimary"/>

    <TextView
        android:id="@+id/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingHorizontal="24dp"
        android:paddingBottom="48dp"
        android:paddingTop="8dp"
        android:gravity="@integer/biometric_dialog_text_gravity"
        android:textSize="16sp"
        android:textColor="?android:attr/textColorPrimary"/>

    <ImageView
        android:id="@+id/biometric_icon"
        android:layout_width="@dimen/biometric_dialog_biometric_icon_size"
        android:layout_height="@dimen/biometric_dialog_biometric_icon_size"
        android:layout_gravity="center_horizontal"
        android:scaleType="fitXY" />

    <TextView
        android:id="@+id/error"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingHorizontal="24dp"
        android:paddingTop="16dp"
        android:paddingBottom="24dp"
        android:textSize="12sp"
        android:gravity="center_horizontal"
        android:accessibilityLiveRegion="polite"
        android:textColor="@color/biometric_dialog_gray"
        android:text="ERROR"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="72dip"
        android:paddingTop="24dp"
        android:layout_gravity="center_vertical"
        style="?android:attr/buttonBarStyle"
        android:orientation="horizontal">
        <Space android:id="@+id/leftSpacer"
            android:layout_width="12dp"
            android:layout_height="match_parent"
            android:visibility="visible" />
        <!-- Negative Button -->
        <Button android:id="@+id/button_negative"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
            android:gravity="center"
            android:maxLines="2"
            android:text="NEGATIVE"/>
        <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_positive"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            style="@*android:style/Widget.DeviceDefault.Button.Colored"
            android:gravity="center"
            android:maxLines="2"
            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="match_parent"
            style="@*android:style/Widget.DeviceDefault.Button.Colored"
            android:gravity="center"
            android:maxLines="2"
            android:text="@string/biometric_dialog_try_again"
            android:visibility="gone"/>
        <Space android:id="@+id/rightSpacer"
            android:layout_width="12dip"
            android:layout_height="match_parent"
            android:visibility="visible" />
    </LinearLayout>

</merge>
 No newline at end of file
+26 −0
Original line number Diff line number Diff line
<!--
  ~ Copyright (C) 2019 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.AuthBiometricFaceView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/contents"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <include layout="@layout/auth_biometric_contents"/>

</com.android.systemui.biometrics.ui.AuthBiometricFaceView>
 No newline at end of file
+43 −0
Original line number Diff line number Diff line
<!--
  ~ Copyright (C) 2019 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
  -->

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/biometric_dialog_dim_color"/>

    <View
        android:id="@+id/panel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="?android:attr/colorBackgroundFloating"
        android:elevation="@dimen/biometric_dialog_elevation"/>

    <ScrollView
        android:id="@+id/scrollview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:layout_margin="@dimen/biometric_dialog_border_padding"
        android:elevation="@dimen/biometric_dialog_elevation"/>

</FrameLayout>
 No newline at end of file
+2 −0
Original line number Diff line number Diff line
@@ -1010,6 +1010,8 @@
    <dimen name="biometric_dialog_corner_size">4dp</dimen>
    <dimen name="biometric_dialog_animation_translation_offset">350dp</dimen>
    <dimen name="biometric_dialog_border_padding">4dp</dimen>
    <dimen name="biometric_dialog_elevation">1dp</dimen>
    <dimen name="biometric_dialog_icon_padding">16dp</dimen>

    <!-- Wireless Charging Animation values -->
    <dimen name="wireless_charging_dots_radius_start">0dp</dimen>
+13 −2
Original line number Diff line number Diff line
@@ -16,12 +16,16 @@

package com.android.systemui.biometrics;

import android.annotation.IntDef;
import android.hardware.biometrics.BiometricPrompt;
import android.os.Bundle;
import android.view.WindowManager;

import com.android.systemui.biometrics.ui.BiometricDialogView;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Interface for the biometric dialog UI.
 */
@@ -49,12 +53,19 @@ public interface BiometricDialog {
            BiometricDialogView.KEY_ERROR_TEXT_COLOR,
    };

    int SIZE_UNKNOWN = 0;
    int SIZE_SMALL = 1;
    int SIZE_MEDIUM = 2;
    int SIZE_LARGE = 3;
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({SIZE_UNKNOWN, SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE})
    @interface DialogSize {}

    /**
     * Show the dialog.
     * @param wm
     * @param skipIntroAnimation
     */
    void show(WindowManager wm, boolean skipIntroAnimation);
    void show(WindowManager wm);

    /**
     * Dismiss the dialog without sending a callback.
Loading