Merge "Updated biometric prompt assets." into tm-qpr-dev am: 8b1aeaa2c2

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19622035

Change-Id: I9d26e615356988c2cb211a8d3a829ac4019614f8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Joshua Mccloskey
2022-08-17 00:50:31 +00:00
committed by Automerger Merge Worker
17 changed files with 73 additions and 81 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -49,11 +49,11 @@
<FrameLayout <FrameLayout
android:id="@+id/biometric_icon_frame" android:id="@+id/biometric_icon_frame"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"> android:layout_gravity="center_horizontal">
<ImageView <com.airbnb.lottie.LottieAnimationView
android:id="@+id/biometric_icon" android:id="@+id/biometric_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -17,7 +17,7 @@
<com.android.systemui.biometrics.AuthBiometricFingerprintView <com.android.systemui.biometrics.AuthBiometricFingerprintView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contents" android:id="@+id/contents"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -937,7 +937,8 @@
<!-- Biometric Dialog values --> <!-- Biometric Dialog values -->
<dimen name="biometric_dialog_face_icon_size">64dp</dimen> <dimen name="biometric_dialog_face_icon_size">64dp</dimen>
<dimen name="biometric_dialog_fingerprint_icon_size">80dp</dimen> <dimen name="biometric_dialog_fingerprint_icon_width">80dp</dimen>
<dimen name="biometric_dialog_fingerprint_icon_height">80dp</dimen>
<dimen name="biometric_dialog_button_negative_max_width">160dp</dimen> <dimen name="biometric_dialog_button_negative_max_width">160dp</dimen>
<dimen name="biometric_dialog_button_positive_max_width">136dp</dimen> <dimen name="biometric_dialog_button_positive_max_width">136dp</dimen>
<dimen name="biometric_dialog_corner_size">4dp</dimen> <dimen name="biometric_dialog_corner_size">4dp</dimen>

View File

@@ -18,7 +18,7 @@ package com.android.systemui.biometrics
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.util.Log import android.util.Log
import android.widget.ImageView import com.airbnb.lottie.LottieAnimationView
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.biometrics.AuthBiometricView.BiometricState import com.android.systemui.biometrics.AuthBiometricView.BiometricState
import com.android.systemui.biometrics.AuthBiometricView.STATE_AUTHENTICATED import com.android.systemui.biometrics.AuthBiometricView.STATE_AUTHENTICATED
@@ -33,8 +33,8 @@ private const val TAG = "AuthBiometricFaceIconController"
/** Face only icon animator for BiometricPrompt. */ /** Face only icon animator for BiometricPrompt. */
class AuthBiometricFaceIconController( class AuthBiometricFaceIconController(
context: Context, context: Context,
iconView: ImageView iconView: LottieAnimationView
) : AuthIconController(context, iconView) { ) : AuthIconController(context, iconView) {
// false = dark to light, true = light to dark // false = dark to light, true = light to dark
@@ -76,44 +76,44 @@ class AuthBiometricFaceIconController(
if (newState == STATE_AUTHENTICATING_ANIMATING_IN) { if (newState == STATE_AUTHENTICATING_ANIMATING_IN) {
showStaticDrawable(R.drawable.face_dialog_pulse_dark_to_light) showStaticDrawable(R.drawable.face_dialog_pulse_dark_to_light)
iconView.contentDescription = context.getString( iconView.contentDescription = context.getString(
R.string.biometric_dialog_face_icon_description_authenticating R.string.biometric_dialog_face_icon_description_authenticating
) )
} else if (newState == STATE_AUTHENTICATING) { } else if (newState == STATE_AUTHENTICATING) {
startPulsing() startPulsing()
iconView.contentDescription = context.getString( iconView.contentDescription = context.getString(
R.string.biometric_dialog_face_icon_description_authenticating R.string.biometric_dialog_face_icon_description_authenticating
) )
} else if (oldState == STATE_PENDING_CONFIRMATION && newState == STATE_AUTHENTICATED) { } else if (oldState == STATE_PENDING_CONFIRMATION && newState == STATE_AUTHENTICATED) {
animateIconOnce(R.drawable.face_dialog_dark_to_checkmark) animateIconOnce(R.drawable.face_dialog_dark_to_checkmark)
iconView.contentDescription = context.getString( iconView.contentDescription = context.getString(
R.string.biometric_dialog_face_icon_description_confirmed R.string.biometric_dialog_face_icon_description_confirmed
) )
} else if (lastStateIsErrorIcon && newState == STATE_IDLE) { } else if (lastStateIsErrorIcon && newState == STATE_IDLE) {
animateIconOnce(R.drawable.face_dialog_error_to_idle) animateIconOnce(R.drawable.face_dialog_error_to_idle)
iconView.contentDescription = context.getString( iconView.contentDescription = context.getString(
R.string.biometric_dialog_face_icon_description_idle R.string.biometric_dialog_face_icon_description_idle
) )
} else if (lastStateIsErrorIcon && newState == STATE_AUTHENTICATED) { } else if (lastStateIsErrorIcon && newState == STATE_AUTHENTICATED) {
animateIconOnce(R.drawable.face_dialog_dark_to_checkmark) animateIconOnce(R.drawable.face_dialog_dark_to_checkmark)
iconView.contentDescription = context.getString( iconView.contentDescription = context.getString(
R.string.biometric_dialog_face_icon_description_authenticated R.string.biometric_dialog_face_icon_description_authenticated
) )
} else if (newState == STATE_ERROR && oldState != STATE_ERROR) { } else if (newState == STATE_ERROR && oldState != STATE_ERROR) {
animateIconOnce(R.drawable.face_dialog_dark_to_error) animateIconOnce(R.drawable.face_dialog_dark_to_error)
} else if (oldState == STATE_AUTHENTICATING && newState == STATE_AUTHENTICATED) { } else if (oldState == STATE_AUTHENTICATING && newState == STATE_AUTHENTICATED) {
animateIconOnce(R.drawable.face_dialog_dark_to_checkmark) animateIconOnce(R.drawable.face_dialog_dark_to_checkmark)
iconView.contentDescription = context.getString( iconView.contentDescription = context.getString(
R.string.biometric_dialog_face_icon_description_authenticated R.string.biometric_dialog_face_icon_description_authenticated
) )
} else if (newState == STATE_PENDING_CONFIRMATION) { } else if (newState == STATE_PENDING_CONFIRMATION) {
animateIconOnce(R.drawable.face_dialog_wink_from_dark) animateIconOnce(R.drawable.face_dialog_wink_from_dark)
iconView.contentDescription = context.getString( iconView.contentDescription = context.getString(
R.string.biometric_dialog_face_icon_description_authenticated R.string.biometric_dialog_face_icon_description_authenticated
) )
} else if (newState == STATE_IDLE) { } else if (newState == STATE_IDLE) {
showStaticDrawable(R.drawable.face_dialog_idle_static) showStaticDrawable(R.drawable.face_dialog_idle_static)
iconView.contentDescription = context.getString( iconView.contentDescription = context.getString(
R.string.biometric_dialog_face_icon_description_idle R.string.biometric_dialog_face_icon_description_idle
) )
} else { } else {
Log.w(TAG, "Unhandled state: $newState") Log.w(TAG, "Unhandled state: $newState")

View File

@@ -16,42 +16,43 @@
package com.android.systemui.biometrics package com.android.systemui.biometrics
import android.annotation.RawRes
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import com.airbnb.lottie.LottieAnimationView
import android.widget.ImageView
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.biometrics.AuthBiometricView.BiometricState import com.android.systemui.biometrics.AuthBiometricView.BiometricState
import com.android.systemui.biometrics.AuthBiometricView.STATE_PENDING_CONFIRMATION
import com.android.systemui.biometrics.AuthBiometricView.STATE_AUTHENTICATED import com.android.systemui.biometrics.AuthBiometricView.STATE_AUTHENTICATED
import com.android.systemui.biometrics.AuthBiometricView.STATE_ERROR import com.android.systemui.biometrics.AuthBiometricView.STATE_ERROR
import com.android.systemui.biometrics.AuthBiometricView.STATE_HELP import com.android.systemui.biometrics.AuthBiometricView.STATE_HELP
import com.android.systemui.biometrics.AuthBiometricView.STATE_PENDING_CONFIRMATION
/** Face/Fingerprint combined icon animator for BiometricPrompt. */ /** Face/Fingerprint combined icon animator for BiometricPrompt. */
class AuthBiometricFingerprintAndFaceIconController( class AuthBiometricFingerprintAndFaceIconController(
context: Context, context: Context,
iconView: ImageView iconView: LottieAnimationView
) : AuthBiometricFingerprintIconController(context, iconView) { ) : AuthBiometricFingerprintIconController(context, iconView) {
override val actsAsConfirmButton: Boolean = true override val actsAsConfirmButton: Boolean = true
override fun shouldAnimateForTransition( override fun shouldAnimateForTransition(
@BiometricState oldState: Int, @BiometricState oldState: Int,
@BiometricState newState: Int @BiometricState newState: Int
): Boolean = when (newState) { ): Boolean = when (newState) {
STATE_PENDING_CONFIRMATION -> true STATE_PENDING_CONFIRMATION -> true
STATE_AUTHENTICATED -> false STATE_AUTHENTICATED -> false
else -> super.shouldAnimateForTransition(oldState, newState) else -> super.shouldAnimateForTransition(oldState, newState)
} }
@RawRes
override fun getAnimationForTransition( override fun getAnimationForTransition(
@BiometricState oldState: Int, @BiometricState oldState: Int,
@BiometricState newState: Int @BiometricState newState: Int
): Drawable? = when (newState) { ): Int? = when (newState) {
STATE_PENDING_CONFIRMATION -> { STATE_PENDING_CONFIRMATION -> {
if (oldState == STATE_ERROR || oldState == STATE_HELP) { if (oldState == STATE_ERROR || oldState == STATE_HELP) {
context.getDrawable(R.drawable.fingerprint_dialog_error_to_unlock) R.raw.fingerprint_dialogue_error_to_unlock_lottie
} else { } else {
context.getDrawable(R.drawable.fingerprint_dialog_fp_to_unlock) R.raw.fingerprint_dialogue_fingerprint_to_unlock_lottie
} }
} }
STATE_AUTHENTICATED -> null STATE_AUTHENTICATED -> null

View File

@@ -16,10 +16,9 @@
package com.android.systemui.biometrics package com.android.systemui.biometrics
import android.annotation.RawRes
import android.content.Context import android.content.Context
import android.graphics.drawable.AnimatedVectorDrawable import com.airbnb.lottie.LottieAnimationView
import android.graphics.drawable.Drawable
import android.widget.ImageView
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.biometrics.AuthBiometricView.BiometricState import com.android.systemui.biometrics.AuthBiometricView.BiometricState
import com.android.systemui.biometrics.AuthBiometricView.STATE_AUTHENTICATED import com.android.systemui.biometrics.AuthBiometricView.STATE_AUTHENTICATED
@@ -32,42 +31,42 @@ import com.android.systemui.biometrics.AuthBiometricView.STATE_PENDING_CONFIRMAT
/** Fingerprint only icon animator for BiometricPrompt. */ /** Fingerprint only icon animator for BiometricPrompt. */
open class AuthBiometricFingerprintIconController( open class AuthBiometricFingerprintIconController(
context: Context, context: Context,
iconView: ImageView iconView: LottieAnimationView
) : AuthIconController(context, iconView) { ) : AuthIconController(context, iconView) {
var iconLayoutParamsSize = 0 var iconLayoutParamSize: Pair<Int, Int> = Pair(1, 1)
set(value) { set(value) {
if (field == value) { if (field == value) {
return return
} }
iconView.layoutParams.width = value iconView.layoutParams.width = value.first
iconView.layoutParams.height = value iconView.layoutParams.height = value.second
field = value field = value
} }
init { init {
iconLayoutParamsSize = context.resources.getDimensionPixelSize( iconLayoutParamSize = Pair(context.resources.getDimensionPixelSize(
R.dimen.biometric_dialog_fingerprint_icon_size R.dimen.biometric_dialog_fingerprint_icon_width),
) context.resources.getDimensionPixelSize(
R.dimen.biometric_dialog_fingerprint_icon_height))
} }
override fun updateIcon(@BiometricState lastState: Int, @BiometricState newState: Int) { override fun updateIcon(@BiometricState lastState: Int, @BiometricState newState: Int) {
val icon = getAnimationForTransition(lastState, newState) ?: return val icon = getAnimationForTransition(lastState, newState) ?: return
iconView.setImageDrawable(icon) if (!(lastState == STATE_AUTHENTICATING_ANIMATING_IN && newState == STATE_AUTHENTICATING)) {
iconView.setAnimation(icon)
}
val iconContentDescription = getIconContentDescription(newState) val iconContentDescription = getIconContentDescription(newState)
if (iconContentDescription != null) { if (iconContentDescription != null) {
iconView.contentDescription = iconContentDescription iconView.contentDescription = iconContentDescription
} }
(icon as? AnimatedVectorDrawable)?.apply { iconView.frame = 0
reset() if (shouldAnimateForTransition(lastState, newState)) {
if (shouldAnimateForTransition(lastState, newState)) { iconView.playAnimation()
forceAnimationOnUI()
start()
}
} }
} }
@@ -86,8 +85,8 @@ open class AuthBiometricFingerprintIconController(
} }
protected open fun shouldAnimateForTransition( protected open fun shouldAnimateForTransition(
@BiometricState oldState: Int, @BiometricState oldState: Int,
@BiometricState newState: Int @BiometricState newState: Int
) = when (newState) { ) = when (newState) {
STATE_HELP, STATE_HELP,
STATE_ERROR -> true STATE_ERROR -> true
@@ -97,24 +96,27 @@ open class AuthBiometricFingerprintIconController(
else -> false else -> false
} }
@RawRes
protected open fun getAnimationForTransition( protected open fun getAnimationForTransition(
@BiometricState oldState: Int, @BiometricState oldState: Int,
@BiometricState newState: Int @BiometricState newState: Int
): Drawable? { ): Int? {
val id = when (newState) { val id = when (newState) {
STATE_HELP, STATE_HELP,
STATE_ERROR -> R.drawable.fingerprint_dialog_fp_to_error STATE_ERROR -> {
R.raw.fingerprint_dialogue_fingerprint_to_error_lottie
}
STATE_AUTHENTICATING_ANIMATING_IN, STATE_AUTHENTICATING_ANIMATING_IN,
STATE_AUTHENTICATING -> { STATE_AUTHENTICATING -> {
if (oldState == STATE_ERROR || oldState == STATE_HELP) { if (oldState == STATE_ERROR || oldState == STATE_HELP) {
R.drawable.fingerprint_dialog_error_to_fp R.raw.fingerprint_dialogue_error_to_fingerprint_lottie
} else { } else {
R.drawable.fingerprint_dialog_fp_to_error R.raw.fingerprint_dialogue_fingerprint_to_error_lottie
} }
} }
STATE_AUTHENTICATED -> R.drawable.fingerprint_dialog_fp_to_error STATE_AUTHENTICATED -> R.raw.fingerprint_dialogue_fingerprint_to_error_lottie
else -> return null else -> return null
} }
return if (id != null) context.getDrawable(id) else null return if (id != null) return id else null
} }
} }

View File

@@ -90,8 +90,9 @@ open class AuthBiometricFingerprintView(
fun updateOverrideIconLayoutParamsSize() { fun updateOverrideIconLayoutParamsSize() {
udfpsAdapter?.let { udfpsAdapter?.let {
(mIconController as? AuthBiometricFingerprintIconController)?.iconLayoutParamsSize = val sensorDiameter = it.getSensorDiameter(scaleFactorProvider?.provide() ?: 1.0f)
it.getSensorDiameter(scaleFactorProvider?.provide() ?: 1.0f) (mIconController as? AuthBiometricFingerprintIconController)?.iconLayoutParamSize =
Pair(sensorDiameter, sensorDiameter)
} }
} }

View File

@@ -22,15 +22,15 @@ import android.graphics.drawable.Animatable2
import android.graphics.drawable.AnimatedVectorDrawable import android.graphics.drawable.AnimatedVectorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.util.Log import android.util.Log
import android.widget.ImageView import com.airbnb.lottie.LottieAnimationView
import com.android.systemui.biometrics.AuthBiometricView.BiometricState import com.android.systemui.biometrics.AuthBiometricView.BiometricState
private const val TAG = "AuthIconController" private const val TAG = "AuthIconController"
/** Controller for animating the BiometricPrompt icon/affordance. */ /** Controller for animating the BiometricPrompt icon/affordance. */
abstract class AuthIconController( abstract class AuthIconController(
protected val context: Context, protected val context: Context,
protected val iconView: ImageView protected val iconView: LottieAnimationView
) : Animatable2.AnimationCallback() { ) : Animatable2.AnimationCallback() {
/** If this controller should ignore events and pause. */ /** If this controller should ignore events and pause. */

View File

@@ -41,14 +41,14 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.util.LargeScreenUtils;
import com.airbnb.lottie.LottieAnimationView;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@@ -133,7 +133,7 @@ public abstract class AuthBiometricView extends LinearLayout {
private TextView mSubtitleView; private TextView mSubtitleView;
private TextView mDescriptionView; private TextView mDescriptionView;
private View mIconHolderView; private View mIconHolderView;
protected ImageView mIconView; protected LottieAnimationView mIconView;
protected TextView mIndicatorView; protected TextView mIndicatorView;
@VisibleForTesting @NonNull AuthIconController mIconController; @VisibleForTesting @NonNull AuthIconController mIconController;
@@ -824,25 +824,12 @@ public abstract class AuthBiometricView extends LinearLayout {
return new AuthDialog.LayoutParams(width, totalHeight); return new AuthDialog.LayoutParams(width, totalHeight);
} }
private boolean isLargeDisplay() {
return LargeScreenUtils.shouldUseSplitNotificationShade(getResources());
}
@Override @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int width = MeasureSpec.getSize(widthMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec);
final int height = MeasureSpec.getSize(heightMeasureSpec); final int height = MeasureSpec.getSize(heightMeasureSpec);
final boolean isLargeDisplay = isLargeDisplay(); final int newWidth = Math.min(width, height);
final int newWidth;
if (isLargeDisplay) {
// TODO(b/201811580): Unless we can come up with a one-size-fits-all equation, we may
// want to consider moving this to an overlay.
newWidth = 2 * Math.min(width, height) / 3;
} else {
newWidth = Math.min(width, height);
}
// Use "newWidth" instead, so the landscape dialog width is the same as the portrait // Use "newWidth" instead, so the landscape dialog width is the same as the portrait
// width. // width.