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

Commit b9f34c78 authored by Austin Delgado's avatar Austin Delgado Committed by Android (Google) Code Review
Browse files

Merge "Add constraint layout for landscape and large screen" into main

parents 32c5c466 e5e5a41c
Loading
Loading
Loading
Loading
+322 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <ImageView
        android:id="@+id/background"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:contentDescription="@string/biometric_dialog_empty_space_description"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:id="@+id/panel"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="?android:attr/colorBackgroundFloating"
        android:clickable="true"
        android:clipToOutline="true"
        android:importantForAccessibility="no"
        android:paddingHorizontal="16dp"
        android:paddingVertical="16dp"
        android:visibility="visible"
        app:layout_constraintBottom_toTopOf="@+id/bottomGuideline"
        app:layout_constraintEnd_toStartOf="@+id/rightGuideline"
        app:layout_constraintStart_toStartOf="@+id/leftGuideline"
        app:layout_constraintTop_toTopOf="@+id/topGuideline" />

    <com.android.systemui.biometrics.BiometricPromptLottieViewWrapper
        android:id="@+id/biometric_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.8"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@tools:sample/avatars" />

    <com.android.systemui.biometrics.BiometricPromptLottieViewWrapper
        android:id="@+id/biometric_icon_overlay"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_gravity="center"
        android:contentDescription="@null"
        android:scaleType="fitXY"
        app:layout_constraintBottom_toBottomOf="@+id/biometric_icon"
        app:layout_constraintEnd_toEndOf="@+id/biometric_icon"
        app:layout_constraintStart_toStartOf="@+id/biometric_icon"
        app:layout_constraintTop_toTopOf="@+id/biometric_icon" />

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:fillViewport="true"
        android:padding="16dp"
        app:layout_constrainedHeight="true"
        app:layout_constrainedWidth="true"
        app:layout_constraintBottom_toTopOf="@+id/buttonBarrier"
        app:layout_constraintEnd_toStartOf="@+id/midGuideline"
        app:layout_constraintStart_toStartOf="@id/leftGuideline"
        app:layout_constraintTop_toTopOf="@+id/topGuideline">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/innerConstraint"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/logo"
                android:layout_width="@dimen/biometric_auth_icon_size"
                android:layout_height="@dimen/biometric_auth_icon_size"
                android:layout_gravity="center"
                android:scaleType="fitXY"
                android:visibility="visible"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <LinearLayout
                android:id="@+id/customized_view_container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="vertical"
                android:paddingHorizontal="0dp"
                android:visibility="gone"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/subtitle"
                app:layout_constraintVertical_bias="0.0" />

            <Space
                android:id="@+id/space_above_content"
                android:layout_width="match_parent"
                android:layout_height="@dimen/biometric_prompt_space_above_content"
                android:visibility="gone" />

            <TextView
                android:id="@+id/title"
                style="@style/TextAppearance.AuthCredential.Title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="@integer/biometric_dialog_text_gravity"
                android:paddingHorizontal="0dp"
                android:textAlignment="viewStart"
                app:layout_constraintBottom_toTopOf="@+id/subtitle"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/logo"
                app:layout_constraintVertical_bias="0.0"
                app:layout_constraintVertical_chainStyle="packed" />

            <TextView
                android:id="@+id/subtitle"
                style="@style/TextAppearance.AuthCredential.Subtitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="@integer/biometric_dialog_text_gravity"
                android:paddingHorizontal="0dp"
                android:textAlignment="viewStart"
                app:layout_constraintBottom_toTopOf="@+id/contentBarrier"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/title" />

            <TextView
                android:id="@+id/description"
                style="@style/TextAppearance.AuthCredential.Description"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="@integer/biometric_dialog_text_gravity"
                android:paddingHorizontal="0dp"
                android:textAlignment="viewStart"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/subtitle"
                app:layout_constraintVertical_bias="0.0" />

            <TextView
                android:id="@+id/logo_description"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:ellipsize="marquee"
                android:gravity="@integer/biometric_dialog_text_gravity"
                android:marqueeRepeatLimit="1"
                android:singleLine="true"
                android:textAlignment="viewStart"
                android:paddingLeft="8dp"
                app:layout_constraintBottom_toBottomOf="@+id/logo"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toEndOf="@+id/logo"
                app:layout_constraintTop_toTopOf="@+id/logo" />

            <androidx.constraintlayout.widget.Barrier
                android:id="@+id/contentBarrier"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:barrierAllowsGoneWidgets="false"
                app:barrierDirection="top"
                app:constraint_referenced_ids="description, customized_view_container" />

        </androidx.constraintlayout.widget.ConstraintLayout>
    </ScrollView>

    <TextView
        android:id="@+id/indicator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:accessibilityLiveRegion="polite"
        android:fadingEdge="horizontal"
        android:gravity="center_horizontal"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:textColor="@color/biometric_dialog_gray"
        android:textSize="12sp"
        app:layout_constraintBottom_toTopOf="@+id/buttonBarrier"
        app:layout_constraintEnd_toEndOf="@+id/biometric_icon"
        app:layout_constraintStart_toStartOf="@+id/biometric_icon"
        app:layout_constraintTop_toBottomOf="@+id/biometric_icon"
        app:layout_constraintVertical_bias="0.0" />

    <!-- Negative Button, reserved for app -->
    <Button
        android:id="@+id/button_negative"
        style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="8dp"
        android:ellipsize="end"
        android:maxLines="2"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/bottomGuideline"
        app:layout_constraintStart_toStartOf="@+id/scrollView" />

    <!-- Cancel Button, replaces negative button when biometric is accepted -->
    <Button
        android:id="@+id/button_cancel"
        style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="8dp"
        android:text="@string/cancel"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/bottomGuideline"
        app:layout_constraintStart_toStartOf="@+id/scrollView" />

    <!-- "Use Credential" Button, replaces if device credential is allowed -->
    <Button
        android:id="@+id/button_use_credential"
        style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="8dp"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/bottomGuideline"
        app:layout_constraintStart_toStartOf="@+id/scrollView" />

    <!-- Positive Button -->
    <Button
        android:id="@+id/button_confirm"
        style="@*android:style/Widget.DeviceDefault.Button.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="8dp"
        android:layout_marginRight="8dp"
        android:ellipsize="end"
        android:maxLines="2"
        android:text="@string/biometric_dialog_confirm"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/bottomGuideline"
        app:layout_constraintEnd_toEndOf="@+id/scrollView"
        tools:visibility="invisible" />

    <!-- Try Again Button -->
    <Button
        android:id="@+id/button_try_again"
        style="@*android:style/Widget.DeviceDefault.Button.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="8dp"
        android:layout_marginRight="8dp"
        android:ellipsize="end"
        android:maxLines="2"
        android:text="@string/biometric_dialog_try_again"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/bottomGuideline"
        app:layout_constraintEnd_toEndOf="@+id/scrollView" />

    <!-- Guidelines for setting panel border -->
    <androidx.constraintlayout.widget.Barrier
        android:id="@+id/topBarrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierAllowsGoneWidgets="false"
        app:barrierDirection="top"
        app:constraint_referenced_ids="scrollView" />

    <androidx.constraintlayout.widget.Barrier
        android:id="@+id/buttonBarrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierAllowsGoneWidgets="false"
        app:barrierDirection="top"
        app:constraint_referenced_ids="button_negative, button_cancel, button_use_credential, button_confirm, button_try_again" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/leftGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="@dimen/biometric_dialog_border_padding" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/rightGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_end="@dimen/biometric_dialog_border_padding" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/midGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="406dp" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/bottomGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_end="@dimen/biometric_dialog_border_padding" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/topGuideline"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="@dimen/biometric_dialog_border_padding" />

</androidx.constraintlayout.widget.ConstraintLayout>
+304 −0

File added.

Preview size limit exceeded, changes collapsed.

+137 −89

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@
        android:layout_height="@dimen/biometric_prompt_space_above_content"
        android:visibility="gone" />

    <ScrollView
    <LinearLayout
        android:id="@+id/customized_view_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
+15 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.biometrics.data.repository

import android.content.Context
import android.util.DisplayMetrics
import android.util.Size
import android.view.DisplayInfo
import com.android.systemui.biometrics.shared.model.DisplayRotation
@@ -29,8 +30,10 @@ import com.android.systemui.display.data.repository.DeviceStateRepository.Device
import com.android.systemui.display.data.repository.DisplayRepository
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn

@@ -53,6 +56,9 @@ interface DisplayStateRepository {

    /** Provides the current display size */
    val currentDisplaySize: StateFlow<Size>

    /** Provides whether the current display is large screen */
    val isLargeScreen: Flow<Boolean>
}

@SysUISingleton
@@ -121,6 +127,15 @@ constructor(
                    ),
            )

    override val isLargeScreen: Flow<Boolean> =
        currentDisplayInfo
            .map {
                // TODO: This works, but investigate better way to handle this
                it.logicalWidth * 160 / it.logicalDensityDpi > DisplayMetrics.DENSITY_XXXHIGH &&
                    it.logicalHeight * 160 / it.logicalDensityDpi > DisplayMetrics.DENSITY_XXHIGH
            }
            .distinctUntilChanged()

    companion object {
        const val TAG = "DisplayStateRepositoryImpl"
    }
Loading