Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c23747d authored by Joe Bolinger's avatar Joe Bolinger Committed by Android (Google) Code Review
Browse files

Merge "Drop PendingIntent extras from external packages during enrollment." into main

parents 3f2fe09f 4ccdeee8
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -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.
 */
@@ -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();
@@ -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);
+21 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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());
@@ -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();
    }
}
+25 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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;
@@ -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;
@@ -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() {
@@ -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)