Updated biometric prompt assets.
Test: Manually verified with different devices. Fixes: 236970230 Change-Id: Ia10aeebf11a638cfbd2982371120b5a78d120f34 Merged-In: Ia10aeebf11a638cfbd2982371120b5a78d120f34
This commit is contained in:
committed by
Joshua Mccloskey
parent
dc0b0fd918
commit
5ef5dc6e46
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
@@ -49,11 +49,11 @@
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/biometric_icon_frame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal">
|
||||
|
||||
<ImageView
|
||||
<com.airbnb.lottie.LottieAnimationView
|
||||
android:id="@+id/biometric_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<com.android.systemui.biometrics.AuthBiometricFingerprintView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/contents"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
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
@@ -937,7 +937,8 @@
|
||||
|
||||
<!-- Biometric Dialog values -->
|
||||
<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_positive_max_width">136dp</dimen>
|
||||
<dimen name="biometric_dialog_corner_size">4dp</dimen>
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.systemui.biometrics
|
||||
import android.content.Context
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.util.Log
|
||||
import android.widget.ImageView
|
||||
import com.airbnb.lottie.LottieAnimationView
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.biometrics.AuthBiometricView.BiometricState
|
||||
import com.android.systemui.biometrics.AuthBiometricView.STATE_AUTHENTICATED
|
||||
@@ -33,8 +33,8 @@ private const val TAG = "AuthBiometricFaceIconController"
|
||||
|
||||
/** Face only icon animator for BiometricPrompt. */
|
||||
class AuthBiometricFaceIconController(
|
||||
context: Context,
|
||||
iconView: ImageView
|
||||
context: Context,
|
||||
iconView: LottieAnimationView
|
||||
) : AuthIconController(context, iconView) {
|
||||
|
||||
// false = dark to light, true = light to dark
|
||||
@@ -76,44 +76,44 @@ class AuthBiometricFaceIconController(
|
||||
if (newState == STATE_AUTHENTICATING_ANIMATING_IN) {
|
||||
showStaticDrawable(R.drawable.face_dialog_pulse_dark_to_light)
|
||||
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) {
|
||||
startPulsing()
|
||||
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) {
|
||||
animateIconOnce(R.drawable.face_dialog_dark_to_checkmark)
|
||||
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) {
|
||||
animateIconOnce(R.drawable.face_dialog_error_to_idle)
|
||||
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) {
|
||||
animateIconOnce(R.drawable.face_dialog_dark_to_checkmark)
|
||||
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) {
|
||||
animateIconOnce(R.drawable.face_dialog_dark_to_error)
|
||||
} else if (oldState == STATE_AUTHENTICATING && newState == STATE_AUTHENTICATED) {
|
||||
animateIconOnce(R.drawable.face_dialog_dark_to_checkmark)
|
||||
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) {
|
||||
animateIconOnce(R.drawable.face_dialog_wink_from_dark)
|
||||
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) {
|
||||
showStaticDrawable(R.drawable.face_dialog_idle_static)
|
||||
iconView.contentDescription = context.getString(
|
||||
R.string.biometric_dialog_face_icon_description_idle
|
||||
R.string.biometric_dialog_face_icon_description_idle
|
||||
)
|
||||
} else {
|
||||
Log.w(TAG, "Unhandled state: $newState")
|
||||
|
||||
@@ -16,42 +16,43 @@
|
||||
|
||||
package com.android.systemui.biometrics
|
||||
|
||||
import android.annotation.RawRes
|
||||
import android.content.Context
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.widget.ImageView
|
||||
import com.airbnb.lottie.LottieAnimationView
|
||||
import com.android.systemui.R
|
||||
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_ERROR
|
||||
import com.android.systemui.biometrics.AuthBiometricView.STATE_HELP
|
||||
import com.android.systemui.biometrics.AuthBiometricView.STATE_PENDING_CONFIRMATION
|
||||
|
||||
/** Face/Fingerprint combined icon animator for BiometricPrompt. */
|
||||
class AuthBiometricFingerprintAndFaceIconController(
|
||||
context: Context,
|
||||
iconView: ImageView
|
||||
context: Context,
|
||||
iconView: LottieAnimationView
|
||||
) : AuthBiometricFingerprintIconController(context, iconView) {
|
||||
|
||||
override val actsAsConfirmButton: Boolean = true
|
||||
|
||||
override fun shouldAnimateForTransition(
|
||||
@BiometricState oldState: Int,
|
||||
@BiometricState newState: Int
|
||||
@BiometricState oldState: Int,
|
||||
@BiometricState newState: Int
|
||||
): Boolean = when (newState) {
|
||||
STATE_PENDING_CONFIRMATION -> true
|
||||
STATE_AUTHENTICATED -> false
|
||||
else -> super.shouldAnimateForTransition(oldState, newState)
|
||||
}
|
||||
|
||||
@RawRes
|
||||
override fun getAnimationForTransition(
|
||||
@BiometricState oldState: Int,
|
||||
@BiometricState newState: Int
|
||||
): Drawable? = when (newState) {
|
||||
@BiometricState oldState: Int,
|
||||
@BiometricState newState: Int
|
||||
): Int? = when (newState) {
|
||||
STATE_PENDING_CONFIRMATION -> {
|
||||
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 {
|
||||
context.getDrawable(R.drawable.fingerprint_dialog_fp_to_unlock)
|
||||
R.raw.fingerprint_dialogue_fingerprint_to_unlock_lottie
|
||||
}
|
||||
}
|
||||
STATE_AUTHENTICATED -> null
|
||||
|
||||
@@ -16,10 +16,9 @@
|
||||
|
||||
package com.android.systemui.biometrics
|
||||
|
||||
import android.annotation.RawRes
|
||||
import android.content.Context
|
||||
import android.graphics.drawable.AnimatedVectorDrawable
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.widget.ImageView
|
||||
import com.airbnb.lottie.LottieAnimationView
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.biometrics.AuthBiometricView.BiometricState
|
||||
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. */
|
||||
open class AuthBiometricFingerprintIconController(
|
||||
context: Context,
|
||||
iconView: ImageView
|
||||
context: Context,
|
||||
iconView: LottieAnimationView
|
||||
) : AuthIconController(context, iconView) {
|
||||
|
||||
var iconLayoutParamsSize = 0
|
||||
var iconLayoutParamSize: Pair<Int, Int> = Pair(1, 1)
|
||||
set(value) {
|
||||
if (field == value) {
|
||||
return
|
||||
}
|
||||
iconView.layoutParams.width = value
|
||||
iconView.layoutParams.height = value
|
||||
iconView.layoutParams.width = value.first
|
||||
iconView.layoutParams.height = value.second
|
||||
field = value
|
||||
}
|
||||
|
||||
init {
|
||||
iconLayoutParamsSize = context.resources.getDimensionPixelSize(
|
||||
R.dimen.biometric_dialog_fingerprint_icon_size
|
||||
)
|
||||
iconLayoutParamSize = Pair(context.resources.getDimensionPixelSize(
|
||||
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) {
|
||||
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)
|
||||
if (iconContentDescription != null) {
|
||||
iconView.contentDescription = iconContentDescription
|
||||
}
|
||||
|
||||
(icon as? AnimatedVectorDrawable)?.apply {
|
||||
reset()
|
||||
if (shouldAnimateForTransition(lastState, newState)) {
|
||||
forceAnimationOnUI()
|
||||
start()
|
||||
}
|
||||
iconView.frame = 0
|
||||
if (shouldAnimateForTransition(lastState, newState)) {
|
||||
iconView.playAnimation()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,8 +85,8 @@ open class AuthBiometricFingerprintIconController(
|
||||
}
|
||||
|
||||
protected open fun shouldAnimateForTransition(
|
||||
@BiometricState oldState: Int,
|
||||
@BiometricState newState: Int
|
||||
@BiometricState oldState: Int,
|
||||
@BiometricState newState: Int
|
||||
) = when (newState) {
|
||||
STATE_HELP,
|
||||
STATE_ERROR -> true
|
||||
@@ -97,24 +96,27 @@ open class AuthBiometricFingerprintIconController(
|
||||
else -> false
|
||||
}
|
||||
|
||||
@RawRes
|
||||
protected open fun getAnimationForTransition(
|
||||
@BiometricState oldState: Int,
|
||||
@BiometricState newState: Int
|
||||
): Drawable? {
|
||||
@BiometricState oldState: Int,
|
||||
@BiometricState newState: Int
|
||||
): Int? {
|
||||
val id = when (newState) {
|
||||
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 -> {
|
||||
if (oldState == STATE_ERROR || oldState == STATE_HELP) {
|
||||
R.drawable.fingerprint_dialog_error_to_fp
|
||||
R.raw.fingerprint_dialogue_error_to_fingerprint_lottie
|
||||
} 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
|
||||
}
|
||||
return if (id != null) context.getDrawable(id) else null
|
||||
return if (id != null) return id else null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,8 +90,9 @@ open class AuthBiometricFingerprintView(
|
||||
|
||||
fun updateOverrideIconLayoutParamsSize() {
|
||||
udfpsAdapter?.let {
|
||||
(mIconController as? AuthBiometricFingerprintIconController)?.iconLayoutParamsSize =
|
||||
it.getSensorDiameter(scaleFactorProvider?.provide() ?: 1.0f)
|
||||
val sensorDiameter = it.getSensorDiameter(scaleFactorProvider?.provide() ?: 1.0f)
|
||||
(mIconController as? AuthBiometricFingerprintIconController)?.iconLayoutParamSize =
|
||||
Pair(sensorDiameter, sensorDiameter)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,15 +22,15 @@ import android.graphics.drawable.Animatable2
|
||||
import android.graphics.drawable.AnimatedVectorDrawable
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.util.Log
|
||||
import android.widget.ImageView
|
||||
import com.airbnb.lottie.LottieAnimationView
|
||||
import com.android.systemui.biometrics.AuthBiometricView.BiometricState
|
||||
|
||||
private const val TAG = "AuthIconController"
|
||||
|
||||
/** Controller for animating the BiometricPrompt icon/affordance. */
|
||||
abstract class AuthIconController(
|
||||
protected val context: Context,
|
||||
protected val iconView: ImageView
|
||||
protected val context: Context,
|
||||
protected val iconView: LottieAnimationView
|
||||
) : Animatable2.AnimationCallback() {
|
||||
|
||||
/** If this controller should ignore events and pause. */
|
||||
|
||||
@@ -41,14 +41,14 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
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.RetentionPolicy;
|
||||
@@ -133,7 +133,7 @@ public abstract class AuthBiometricView extends LinearLayout {
|
||||
private TextView mSubtitleView;
|
||||
private TextView mDescriptionView;
|
||||
private View mIconHolderView;
|
||||
protected ImageView mIconView;
|
||||
protected LottieAnimationView mIconView;
|
||||
protected TextView mIndicatorView;
|
||||
|
||||
@VisibleForTesting @NonNull AuthIconController mIconController;
|
||||
@@ -824,25 +824,12 @@ public abstract class AuthBiometricView extends LinearLayout {
|
||||
return new AuthDialog.LayoutParams(width, totalHeight);
|
||||
}
|
||||
|
||||
private boolean isLargeDisplay() {
|
||||
return LargeScreenUtils.shouldUseSplitNotificationShade(getResources());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
final int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||
final int height = MeasureSpec.getSize(heightMeasureSpec);
|
||||
|
||||
final boolean isLargeDisplay = isLargeDisplay();
|
||||
|
||||
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);
|
||||
}
|
||||
final int newWidth = Math.min(width, height);
|
||||
|
||||
// Use "newWidth" instead, so the landscape dialog width is the same as the portrait
|
||||
// width.
|
||||
|
||||
Reference in New Issue
Block a user