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

Commit a56866dd authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add mandatory biometric prompt to platform surfaces (2/N)" into main

parents 3ba119a9 606bfb30
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis
    static final int KEYGUARD_REQUEST = 55;
    @VisibleForTesting
    static final int CREDENTIAL_CONFIRM_REQUEST = 56;
    static final int BIOMETRICS_REQUEST = 57;
    private static final String KEY_SHOW_ESIM_RESET_CHECKBOX =
            "masterclear.allow_retain_esim_profiles_after_fdr";

@@ -156,7 +157,8 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis

    @VisibleForTesting
    boolean isValidRequestCode(int requestCode) {
        return !((requestCode != KEYGUARD_REQUEST) && (requestCode != CREDENTIAL_CONFIRM_REQUEST));
        return !((requestCode != KEYGUARD_REQUEST) && (requestCode != CREDENTIAL_CONFIRM_REQUEST)
                && (requestCode != BIOMETRICS_REQUEST));
    }

    @Override
@@ -179,9 +181,18 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis
            return;
        }

        if (requestCode == KEYGUARD_REQUEST) {
            if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(),
                    false /* biometricsSuccessfullyAuthenticated */,
                    false /* biometricsAuthenticationRequested */)) {
                Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRICS_REQUEST);
                return;
            }
        }

        Intent intent = null;
        // If returning from a Keyguard request, try to show an account confirmation request if
        // applciable.
        // applicable.
        if (CREDENTIAL_CONFIRM_REQUEST != requestCode
                && (intent = getAccountConfirmationIntent()) != null) {
            showAccountCredentialConfirmation(intent);
+70 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
@@ -39,7 +40,12 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.Flags;
import android.os.UserManager;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
@@ -57,6 +63,7 @@ import com.android.settingslib.development.DevelopmentSettingsEnabler;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -77,6 +84,9 @@ import org.robolectric.shadows.ShadowActivity;
})
public class MainClearTest {

    @Rule
    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    private static final String TEST_ACCOUNT_TYPE = "android.test.account.type";
    private static final String TEST_CONFIRMATION_PACKAGE = "android.test.conf.pkg";
    private static final String TEST_CONFIRMATION_CLASS = "android.test.conf.pkg.ConfActivity";
@@ -95,6 +105,12 @@ public class MainClearTest {

    @Mock
    private FragmentActivity mMockActivity;
    @Mock
    private BiometricManager mBiometricManager;
    @Mock
    private Resources mResources;
    @Mock
    private Context mContext;

    @Mock
    private Intent mMockIntent;
@@ -122,6 +138,7 @@ public class MainClearTest {
        // Make scrollView only have one child
        when(mScrollView.getChildAt(0)).thenReturn(mLinearLayout);
        when(mScrollView.getChildCount()).thenReturn(1);
        doReturn(mActivity).when(mMainClear).getActivity();
    }

    @After
@@ -343,6 +360,59 @@ public class MainClearTest {
        verify(mMainClear, times(1)).showFinalConfirmation();
    }

    @Test
    @EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS)
    public void testOnActivityResultInternal_keyguardRequestTriggeringBiometricPrompt() {
        when(mContext.getResources()).thenReturn(mResources);
        when(mMockActivity.getSystemService(BiometricManager.class)).thenReturn(mBiometricManager);
        when(mResources.getString(anyInt())).thenReturn(TEST_ACCOUNT_NAME);
        when(mBiometricManager.canAuthenticate(
                BiometricManager.Authenticators.MANDATORY_BIOMETRICS))
                .thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
        doReturn(true).when(mMainClear).isValidRequestCode(eq(MainClear.KEYGUARD_REQUEST));
        doNothing().when(mMainClear).startActivityForResult(any(), anyInt());
        doReturn(mMockActivity).when(mMainClear).getActivity();
        doReturn(mContext).when(mMainClear).getContext();

        mMainClear
                .onActivityResultInternal(MainClear.KEYGUARD_REQUEST, Activity.RESULT_OK, null);

        verify(mMainClear, times(1)).isValidRequestCode(eq(MainClear.KEYGUARD_REQUEST));
        verify(mMainClear).startActivityForResult(any(), eq(MainClear.BIOMETRICS_REQUEST));
        verify(mMainClear, times(0)).establishInitialState();
        verify(mMainClear, times(0)).getAccountConfirmationIntent();
        verify(mMainClear, times(0)).showFinalConfirmation();
    }

    @Test
    public void testOnActivityResultInternal_biometricRequestTriggeringFinalConfirmation() {
        doReturn(true).when(mMainClear).isValidRequestCode(eq(MainClear.BIOMETRICS_REQUEST));
        doReturn(null).when(mMainClear).getAccountConfirmationIntent();
        doNothing().when(mMainClear).showFinalConfirmation();

        mMainClear
                .onActivityResultInternal(MainClear.BIOMETRICS_REQUEST, Activity.RESULT_OK, null);

        verify(mMainClear, times(1)).isValidRequestCode(eq(MainClear.BIOMETRICS_REQUEST));
        verify(mMainClear, times(0)).establishInitialState();
        verify(mMainClear, times(1)).getAccountConfirmationIntent();
        verify(mMainClear, times(1)).showFinalConfirmation();
    }

    @Test
    public void testOnActivityResultInternal_biometricRequestTriggeringInitialState() {
        doReturn(true).when(mMainClear).isValidRequestCode(eq(MainClear.BIOMETRICS_REQUEST));
        doNothing().when(mMainClear).establishInitialState();

        mMainClear.onActivityResultInternal(MainClear.BIOMETRICS_REQUEST, Activity.RESULT_CANCELED,
                        null);

        verify(mMainClear, times(1)).isValidRequestCode(eq(MainClear.BIOMETRICS_REQUEST));
        verify(mMainClear, times(1)).establishInitialState();
        verify(mMainClear, times(0)).getAccountConfirmationIntent();
        verify(mMainClear, times(0)).showFinalConfirmation();
    }

    @Test
    public void testOnActivityResultInternal_confirmRequestTriggeringShowFinal() {
        doReturn(true).when(mMainClear)
+9 −11
Original line number Diff line number Diff line
@@ -69,9 +69,8 @@ import android.os.UserManager;
import android.os.storage.DiskInfo;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.util.IconDrawableFactory;
import android.widget.EditText;
import android.widget.ScrollView;
@@ -108,7 +107,7 @@ import java.util.List;
public class UtilsTest {

    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    private static final String PACKAGE_NAME = "com.android.app";
    private static final int USER_ID = 1;
@@ -528,18 +527,17 @@ public class UtilsTest {
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_MANDATORY_BIOMETRICS)
    @EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS)
    public void testRequestBiometricAuthentication_biometricManagerNull_shouldReturnFalse() {
        when(mContext.getSystemService(Context.BIOMETRIC_SERVICE)).thenReturn(null);
        when(mContext.getSystemService(BiometricManager.class)).thenReturn(null);
        assertThat(Utils.requestBiometricAuthenticationForMandatoryBiometrics(mContext,
                false /* biometricsSuccessfullyAuthenticated */,
                false /* biometricsAuthenticationRequested */)).isFalse();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_MANDATORY_BIOMETRICS)
    public void testRequestBiometricAuthentication_biometricManagerReturnsSuccess_shouldReturnTrue()
            throws InterruptedException {
    @EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS)
    public void testRequestBiometricAuthentication_biometricManagerReturnsSuccess_shouldReturnTrue() {
        when(mBiometricManager.canAuthenticate(
                BiometricManager.Authenticators.MANDATORY_BIOMETRICS))
                .thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
@@ -551,7 +549,7 @@ public class UtilsTest {
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_MANDATORY_BIOMETRICS)
    @EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS)
    public void testRequestBiometricAuthentication_biometricManagerReturnsError_shouldReturnFalse() {
        when(mBiometricManager.canAuthenticate(
                BiometricManager.Authenticators.MANDATORY_BIOMETRICS))
@@ -562,7 +560,7 @@ public class UtilsTest {
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_MANDATORY_BIOMETRICS)
    @EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS)
    public void testLaunchBiometricPrompt_checkIntentValues() {
        when(mFragment.getContext()).thenReturn(mContext);