Loading src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +18 −2 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ import com.google.android.setupdesign.span.LinkSpan; import com.google.android.setupdesign.template.RequireScrollMixin; import com.google.android.setupdesign.util.DynamicColorPalette; import java.util.List; /** * Abstract base class for the intro onboarding activity for biometric enrollment. */ Loading Loading @@ -268,6 +270,19 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase !isScrollNeeded && !enrollmentCompleted ? View.VISIBLE : View.INVISIBLE); } @Override protected void onStart() { super.onStart(); if (!getPackageName().equals(getCallingPackage())) { for (String key : List.of(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE, MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)) { getIntent().removeExtra(key); } } } @Override protected void onResume() { super.onResume(); Loading Loading @@ -527,14 +542,15 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT); } protected void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) { private void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) { if (data != null && data.getBooleanExtra( MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false)) { removeEnrollNextBiometric(); } } protected void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) { private void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) { removeEnrollNextBiometricIfSkipEnroll(data); if (resultCode == RESULT_SKIP) { onEnrollmentSkipped(data); Loading tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -32,11 +32,13 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; Loading Loading @@ -64,6 +66,7 @@ import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.MultiBiometricEnrollHelper; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.SettingsShadowResources; Loading Loading @@ -206,6 +209,12 @@ public class FaceEnrollIntroductionTest { testIntent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, FaceEnrollOptions.ENROLL_REASON_SETTINGS); testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE, mock(PendingIntent.class)); testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT, mock(PendingIntent.class)); testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false); when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn( null /* Simulate no posture intent */); mContext = spy(ApplicationProvider.getApplicationContext()); Loading Loading @@ -690,4 +699,16 @@ public class FaceEnrollIntroductionTest { .isEqualTo(FaceEnrollOptions.ENROLL_REASON_SETTINGS); } @Test public void drops_pendingIntents() { setupActivity(); mController.start(); Shadows.shadowOf(Looper.getMainLooper()).idle(); final Intent intent = mActivity.getIntent(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL)).isFalse(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE)).isFalse(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)).isFalse(); } } tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java +25 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.res.Resources; Loading @@ -44,6 +45,7 @@ import android.hardware.fingerprint.FingerprintEnrollOptions; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Looper; import android.os.UserManager; import android.view.View; Loading @@ -55,6 +57,7 @@ import com.android.internal.widget.VerifyCredentialResponse; import com.android.settings.R; import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.GatekeeperPasswordProvider; import com.android.settings.biometrics.MultiBiometricEnrollHelper; import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupdesign.GlifLayout; Loading @@ -70,6 +73,7 @@ import org.mockito.stubbing.Answer; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.android.controller.ActivityController; import java.util.ArrayList; Loading Loading @@ -353,7 +357,19 @@ public class FingerprintEnrollIntroductionTest { false); Assert.assertEquals(View.INVISIBLE, mFingerprintEnrollIntroduction.getSecondaryFooterButton().getVisibility()); } @Test public void drops_pendingIntents() { setupFingerprintEnrollIntroWith(newExternalPendingIntent()); mController.start(); Shadows.shadowOf(Looper.getMainLooper()).idle(); final Intent intent = mFingerprintEnrollIntroduction.getIntent(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL)).isFalse(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE)).isFalse(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)).isFalse(); } private Intent newTokenOnlyIntent() { Loading Loading @@ -383,6 +399,15 @@ public class FingerprintEnrollIntroductionTest { .putExtra(EXTRA_KEY_GK_PW_HANDLE, 1L); } private Intent newExternalPendingIntent() { return newTokenOnlyIntent() .putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE, mock(PendingIntent.class)) .putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT, mock(PendingIntent.class)) .putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false); } private VerifyCredentialResponse newGoodCredential(long gkPwHandle, @NonNull byte[] hat) { return new VerifyCredentialResponse.Builder() .setGatekeeperPasswordHandle(gkPwHandle) Loading Loading
src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +18 −2 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ import com.google.android.setupdesign.span.LinkSpan; import com.google.android.setupdesign.template.RequireScrollMixin; import com.google.android.setupdesign.util.DynamicColorPalette; import java.util.List; /** * Abstract base class for the intro onboarding activity for biometric enrollment. */ Loading Loading @@ -268,6 +270,19 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase !isScrollNeeded && !enrollmentCompleted ? View.VISIBLE : View.INVISIBLE); } @Override protected void onStart() { super.onStart(); if (!getPackageName().equals(getCallingPackage())) { for (String key : List.of(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE, MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)) { getIntent().removeExtra(key); } } } @Override protected void onResume() { super.onResume(); Loading Loading @@ -527,14 +542,15 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT); } protected void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) { private void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) { if (data != null && data.getBooleanExtra( MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false)) { removeEnrollNextBiometric(); } } protected void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) { private void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) { removeEnrollNextBiometricIfSkipEnroll(data); if (resultCode == RESULT_SKIP) { onEnrollmentSkipped(data); Loading
tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -32,11 +32,13 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; Loading Loading @@ -64,6 +66,7 @@ import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.MultiBiometricEnrollHelper; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.SettingsShadowResources; Loading Loading @@ -206,6 +209,12 @@ public class FaceEnrollIntroductionTest { testIntent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, FaceEnrollOptions.ENROLL_REASON_SETTINGS); testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE, mock(PendingIntent.class)); testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT, mock(PendingIntent.class)); testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false); when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn( null /* Simulate no posture intent */); mContext = spy(ApplicationProvider.getApplicationContext()); Loading Loading @@ -690,4 +699,16 @@ public class FaceEnrollIntroductionTest { .isEqualTo(FaceEnrollOptions.ENROLL_REASON_SETTINGS); } @Test public void drops_pendingIntents() { setupActivity(); mController.start(); Shadows.shadowOf(Looper.getMainLooper()).idle(); final Intent intent = mActivity.getIntent(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL)).isFalse(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE)).isFalse(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)).isFalse(); } }
tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java +25 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.res.Resources; Loading @@ -44,6 +45,7 @@ import android.hardware.fingerprint.FingerprintEnrollOptions; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Looper; import android.os.UserManager; import android.view.View; Loading @@ -55,6 +57,7 @@ import com.android.internal.widget.VerifyCredentialResponse; import com.android.settings.R; import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.GatekeeperPasswordProvider; import com.android.settings.biometrics.MultiBiometricEnrollHelper; import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupdesign.GlifLayout; Loading @@ -70,6 +73,7 @@ import org.mockito.stubbing.Answer; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.android.controller.ActivityController; import java.util.ArrayList; Loading Loading @@ -353,7 +357,19 @@ public class FingerprintEnrollIntroductionTest { false); Assert.assertEquals(View.INVISIBLE, mFingerprintEnrollIntroduction.getSecondaryFooterButton().getVisibility()); } @Test public void drops_pendingIntents() { setupFingerprintEnrollIntroWith(newExternalPendingIntent()); mController.start(); Shadows.shadowOf(Looper.getMainLooper()).idle(); final Intent intent = mFingerprintEnrollIntroduction.getIntent(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL)).isFalse(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE)).isFalse(); assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)).isFalse(); } private Intent newTokenOnlyIntent() { Loading Loading @@ -383,6 +399,15 @@ public class FingerprintEnrollIntroductionTest { .putExtra(EXTRA_KEY_GK_PW_HANDLE, 1L); } private Intent newExternalPendingIntent() { return newTokenOnlyIntent() .putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE, mock(PendingIntent.class)) .putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT, mock(PendingIntent.class)) .putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false); } private VerifyCredentialResponse newGoodCredential(long gkPwHandle, @NonNull byte[] hat) { return new VerifyCredentialResponse.Builder() .setGatekeeperPasswordHandle(gkPwHandle) Loading