Add animation for progress bar and lottie in fingerprint enrollment
Test: Manual - While enrolling a fingerprint, onHelp will cause the lottie and progress bar to shake Bug: 266838595 Change-Id: I547d86182a87846aca7d025b35a008675f449e2e Merged-in: I547d86182a87846aca7d025b35a008675f449e2e
This commit is contained in:
@@ -32,11 +32,13 @@
|
|||||||
android:clipChildren="false">
|
android:clipChildren="false">
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
|
android:id="@+id/progress_lottie"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical"
|
||||||
|
android:translationX="0dp">
|
||||||
|
|
||||||
<!-- Animation res MUST be set in code -->
|
<!-- Animation res MUST be set in code -->
|
||||||
<com.airbnb.lottie.LottieAnimationView
|
<com.airbnb.lottie.LottieAnimationView
|
||||||
|
@@ -53,10 +53,12 @@ import android.view.Surface;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
import android.view.animation.AccelerateDecelerateInterpolator;
|
||||||
import android.view.animation.AnimationUtils;
|
import android.view.animation.AnimationUtils;
|
||||||
import android.view.animation.Interpolator;
|
import android.view.animation.Interpolator;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
|
import android.widget.RelativeLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.IdRes;
|
import androidx.annotation.IdRes;
|
||||||
@@ -185,6 +187,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
|||||||
private boolean mHaveShownSfpsLeftEdgeLottie;
|
private boolean mHaveShownSfpsLeftEdgeLottie;
|
||||||
private boolean mHaveShownSfpsRightEdgeLottie;
|
private boolean mHaveShownSfpsRightEdgeLottie;
|
||||||
private boolean mShouldShowLottie;
|
private boolean mShouldShowLottie;
|
||||||
|
private ObjectAnimator mHelpAnimation;
|
||||||
|
|
||||||
private OrientationEventListener mOrientationEventListener;
|
private OrientationEventListener mOrientationEventListener;
|
||||||
private int mPreviousRotation = 0;
|
private int mPreviousRotation = 0;
|
||||||
@@ -276,6 +279,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
|||||||
} else if (mCanAssumeSfps) {
|
} else if (mCanAssumeSfps) {
|
||||||
setContentView(R.layout.sfps_enroll_enrolling);
|
setContentView(R.layout.sfps_enroll_enrolling);
|
||||||
setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
|
setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
|
||||||
|
setHelpAnimation();
|
||||||
} else {
|
} else {
|
||||||
setContentView(R.layout.fingerprint_enroll_enrolling);
|
setContentView(R.layout.fingerprint_enroll_enrolling);
|
||||||
setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
|
setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
|
||||||
@@ -350,6 +354,17 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
|||||||
maybeHideSfpsText(config);
|
maybeHideSfpsText(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setHelpAnimation() {
|
||||||
|
final float translationX = 40;
|
||||||
|
final int duration = 550;
|
||||||
|
final RelativeLayout progressLottieLayout = findViewById(R.id.progress_lottie);
|
||||||
|
mHelpAnimation = ObjectAnimator.ofFloat(progressLottieLayout,
|
||||||
|
"translationX" /* propertyName */,
|
||||||
|
0, translationX, -1 * translationX, translationX, 0f);
|
||||||
|
mHelpAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
|
||||||
|
mHelpAnimation.setDuration(duration);
|
||||||
|
mHelpAnimation.setAutoCancel(false);
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
protected BiometricEnrollSidecar getSidecar() {
|
protected BiometricEnrollSidecar getSidecar() {
|
||||||
final FingerprintEnrollSidecar sidecar = new FingerprintEnrollSidecar(this,
|
final FingerprintEnrollSidecar sidecar = new FingerprintEnrollSidecar(this,
|
||||||
@@ -755,6 +770,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
|||||||
if (!TextUtils.isEmpty(helpString)) {
|
if (!TextUtils.isEmpty(helpString)) {
|
||||||
if (!(mCanAssumeUdfps || mCanAssumeSfps)) {
|
if (!(mCanAssumeUdfps || mCanAssumeSfps)) {
|
||||||
mErrorText.removeCallbacks(mTouchAgainRunnable);
|
mErrorText.removeCallbacks(mTouchAgainRunnable);
|
||||||
|
mErrorText.removeCallbacks(mTouchAgainRunnable);
|
||||||
}
|
}
|
||||||
showError(helpString);
|
showError(helpString);
|
||||||
}
|
}
|
||||||
@@ -848,6 +864,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
|||||||
// Show nothing for subtitle when getting an error message.
|
// Show nothing for subtitle when getting an error message.
|
||||||
setDescriptionText("");
|
setDescriptionText("");
|
||||||
if (mCanAssumeSfps) {
|
if (mCanAssumeSfps) {
|
||||||
|
if (!mHelpAnimation.isRunning()) {
|
||||||
|
mHelpAnimation.start();
|
||||||
|
}
|
||||||
applySfpsErrorDynamicColors(getApplicationContext(), true);
|
applySfpsErrorDynamicColors(getApplicationContext(), true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@@ -36,6 +36,7 @@ import static org.mockito.Mockito.times;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.animation.ObjectAnimator;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
@@ -80,6 +81,8 @@ public class FingerprintEnrollEnrollingTest {
|
|||||||
|
|
||||||
@Mock private LottieAnimationView mIllustrationLottie;
|
@Mock private LottieAnimationView mIllustrationLottie;
|
||||||
|
|
||||||
|
@Mock private ObjectAnimator mHelpAnimation;
|
||||||
|
|
||||||
@Mock private FingerprintEnrollSidecar mSidecar;
|
@Mock private FingerprintEnrollSidecar mSidecar;
|
||||||
|
|
||||||
@Mock private Display mMockDisplay;
|
@Mock private Display mMockDisplay;
|
||||||
@@ -178,6 +181,15 @@ public class FingerprintEnrollEnrollingTest {
|
|||||||
assertThat(observedLottieAssetOrder).isEqualTo(expectedLottieAssetOrder);
|
assertThat(observedLottieAssetOrder).isEqualTo(expectedLottieAssetOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void fingerprintSfpsEnrollHelpAnimation() {
|
||||||
|
initializeActivityFor(TYPE_POWER_BUTTON);
|
||||||
|
ReflectionHelpers.setField(mActivity, "mHelpAnimation", mHelpAnimation);
|
||||||
|
mActivity.onEnrollmentHelp(0 /* helpMsgId */, "Test help message" /* helpString */);
|
||||||
|
|
||||||
|
verify(mHelpAnimation).start();
|
||||||
|
}
|
||||||
|
|
||||||
// SFPS_STAGE_CENTER is first stage with progress bar colors, starts at steps=25, remaining=25
|
// SFPS_STAGE_CENTER is first stage with progress bar colors, starts at steps=25, remaining=25
|
||||||
private void configureSfpsStageColorTest() {
|
private void configureSfpsStageColorTest() {
|
||||||
when(mSidecar.getEnrollmentSteps()).thenReturn(25);
|
when(mSidecar.getEnrollmentSteps()).thenReturn(25);
|
||||||
|
Reference in New Issue
Block a user