diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index c9c5b375e03..644ff826175 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -168,7 +168,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private boolean mCanAssumeUdfps; private boolean mCanAssumeSfps; @Nullable private ProgressBar mProgressBar; - @Nullable private UdfpsEnrollHelper mUdfpsEnrollHelper; + @VisibleForTesting + @Nullable + UdfpsEnrollHelper mUdfpsEnrollHelper; // TODO(b/260617060): Do not hard-code mScaleFactor, referring to AuthController. private float mScaleFactor = 1.0f; private ObjectAnimator mProgressAnim; diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollProgressBarDrawable.java b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollProgressBarDrawable.java index 52f30f5b79c..aa3f77010bc 100644 --- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollProgressBarDrawable.java +++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollProgressBarDrawable.java @@ -38,6 +38,7 @@ import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; /** @@ -77,8 +78,9 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { private final Interpolator mCheckmarkInterpolator; @NonNull private final Paint mBackgroundPaint; + @VisibleForTesting @NonNull - private final Paint mFillPaint; + final Paint mFillPaint; @NonNull private final Vibrator mVibrator; @NonNull diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java index 596f3b2a53a..de22bca1c82 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java @@ -38,7 +38,10 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Configuration; import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Color; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; import android.hardware.fingerprint.FingerprintManager; @@ -48,14 +51,18 @@ import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Vibrator; +import android.util.FeatureFlagUtils; import android.view.Display; import android.view.Surface; +import android.widget.FrameLayout; +import android.widget.ImageView; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.widget.RingProgressBar; import com.airbnb.lottie.LottieAnimationView; +import com.google.android.setupdesign.GlifLayout; import org.junit.Before; import org.junit.Test; @@ -73,6 +80,9 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class FingerprintEnrollEnrollingTest { + private static final String ENROLL_PROGRESS_COLOR_LIGHT = "#699FF3"; + private static final String ENROLL_PROGRESS_COLOR_DARK = "#7DA7F1"; + @Mock private FingerprintManager mFingerprintManager; @@ -180,6 +190,129 @@ public class FingerprintEnrollEnrollingTest { assertThat(observedLottieAssetOrder).isEqualTo(expectedLottieAssetOrder); } + @Test + public void fingerprintUdfpsOverlayEnrollment_showOverlayPortrait() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + when(mMockDisplay.getRotation()).thenReturn(Surface.ROTATION_0); + + final FrameLayout portraitLayoutContainer = mActivity.findViewById(R.id.layout_container); + final UdfpsEnrollView udfpsEnrollView = + portraitLayoutContainer.findViewById(R.id.udfps_animation_view); + assertThat(udfpsEnrollView).isNotNull(); + } + + @Test + public void fingerprintUdfpsOverlayEnrollment_showOverlayLandscape() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + when(mMockDisplay.getRotation()).thenReturn(Surface.ROTATION_90); + + final GlifLayout defaultLayout = mActivity.findViewById(R.id.setup_wizard_layout); + final UdfpsEnrollView udfpsEnrollView = + defaultLayout.findViewById(R.id.udfps_animation_view); + assertThat(udfpsEnrollView).isNotNull(); + } + + @Test + public void fingerprintUdfpsOverlayEnrollment_usesCorrectProgressBarFillColor() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + final TypedArray ta = mActivity.obtainStyledAttributes(null, + R.styleable.BiometricsEnrollView, R.attr.biometricsEnrollStyle, + R.style.BiometricsEnrollStyle); + final int progressColor = ta.getColor( + R.styleable.BiometricsEnrollView_biometricsEnrollProgress, 0); + final ImageView progressBar = mActivity.findViewById( + R.id.udfps_enroll_animation_fp_progress_view); + + configureSfpsStageColorTest(); + + assertThat( + ((UdfpsEnrollProgressBarDrawable) (progressBar.getDrawable())) + .mFillPaint.getColor()) + .isEqualTo(progressColor); + } + + @Test + public void forwardEnrollProgressEvents() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + + EnrollListener listener = new EnrollListener(mActivity); + mActivity.onEnrollmentProgressChange(20, 10); + assertThat(listener.mProgress).isTrue(); + assertThat(listener.mHelp).isFalse(); + assertThat(listener.mAcquired).isFalse(); + assertThat(listener.mPointerUp).isFalse(); + assertThat(listener.mPointerDown).isFalse(); + } + + @Test + public void forwardEnrollHelpEvents() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + + EnrollListener listener = new EnrollListener(mActivity); + mActivity.onEnrollmentHelp(20, "test enrollment help"); + assertThat(listener.mProgress).isFalse(); + assertThat(listener.mHelp).isTrue(); + assertThat(listener.mAcquired).isFalse(); + assertThat(listener.mPointerUp).isFalse(); + assertThat(listener.mPointerDown).isFalse(); + } + + @Test + public void forwardEnrollAcquiredEvents() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + + EnrollListener listener = new EnrollListener(mActivity); + mActivity.onEnrollmentProgressChange(20, 10); + mActivity.onAcquired(false); + assertThat(listener.mProgress).isTrue(); + assertThat(listener.mHelp).isFalse(); + assertThat(listener.mAcquired).isTrue(); + assertThat(listener.mPointerUp).isFalse(); + assertThat(listener.mPointerDown).isFalse(); + } + + @Test + public void forwardEnrollPointerDownEvents() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + + EnrollListener listener = new EnrollListener(mActivity); + mActivity.onPointerDown(0); + assertThat(listener.mProgress).isFalse(); + assertThat(listener.mHelp).isFalse(); + assertThat(listener.mAcquired).isFalse(); + assertThat(listener.mPointerUp).isFalse(); + assertThat(listener.mPointerDown).isTrue(); + } + + @Test + public void forwardEnrollPointerUpEvents() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + + EnrollListener listener = new EnrollListener(mActivity); + mActivity.onPointerUp(0); + assertThat(listener.mProgress).isFalse(); + assertThat(listener.mHelp).isFalse(); + assertThat(listener.mAcquired).isFalse(); + assertThat(listener.mPointerUp).isTrue(); + assertThat(listener.mPointerDown).isFalse(); + } + @Test public void fingerprintSfpsEnroll_PlaysAllAnimationsAssetsCorrectly() { initializeActivityFor(TYPE_POWER_BUTTON); @@ -273,6 +406,14 @@ public class FingerprintEnrollEnrollingTest { final String appliedThemes = mTheme.toString(); assertThat(appliedThemes.contains("SetupWizardPartnerResource")).isTrue(); + + final Configuration config = mContext.getResources().getConfiguration(); + final boolean isDarkThemeOn = (config.uiMode & Configuration.UI_MODE_NIGHT_MASK) + == Configuration.UI_MODE_NIGHT_YES; + final int currentColor = mContext.getColor(R.color.udfps_enroll_progress); + assertThat(currentColor).isEqualTo(Color.parseColor(isDarkThemeOn + ? ENROLL_PROGRESS_COLOR_DARK : ENROLL_PROGRESS_COLOR_LIGHT)); + } @Test @@ -348,4 +489,43 @@ public class FingerprintEnrollEnrollingTest { return callbackCaptor.getValue(); } + + private static class EnrollListener implements UdfpsEnrollHelper.Listener { + private final FingerprintEnrollEnrolling mActivity; + private boolean mProgress = false; + private boolean mHelp = false; + private boolean mAcquired = false; + private boolean mPointerDown = false; + private boolean mPointerUp = false; + + EnrollListener(FingerprintEnrollEnrolling activity) { + mActivity = activity; + mActivity.mUdfpsEnrollHelper.setListener(this); + } + + @Override + public void onEnrollmentProgress(int remaining, int totalSteps) { + mProgress = true; + } + + @Override + public void onEnrollmentHelp(int remaining, int totalSteps) { + mHelp = true; + } + + @Override + public void onAcquired(boolean animateIfLastStepGood) { + mAcquired = true; + } + + @Override + public void onPointerDown(int sensorId) { + mPointerDown = true; + } + + @Override + public void onPointerUp(int sensorId) { + mPointerUp = true; + } + } }