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:
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