diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java index 0639037a6b1..9d219d783ba 100644 --- a/src/com/android/settings/MainClear.java +++ b/src/com/android/settings/MainClear.java @@ -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); diff --git a/tests/robotests/src/com/android/settings/MainClearTest.java b/tests/robotests/src/com/android/settings/MainClearTest.java index e84d4ebe64a..1136d946746 100644 --- a/tests/robotests/src/com/android/settings/MainClearTest.java +++ b/tests/robotests/src/com/android/settings/MainClearTest.java @@ -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) diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index 77de7496046..fd97b78d2ec 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -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);