Loading src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading src/com/android/settings/biometrics/fingerprint/UdfpsEnrollProgressBarDrawable.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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 Loading tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java +180 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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; } } } Loading
src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
src/com/android/settings/biometrics/fingerprint/UdfpsEnrollProgressBarDrawable.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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 Loading
tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java +180 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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; } } }