Loading src/com/android/settings/MainClear.java +13 −2 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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 Loading @@ -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); Loading tests/robotests/src/com/android/settings/MainClearTest.java +70 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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"; Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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) Loading tests/robotests/src/com/android/settings/UtilsTest.java +9 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading @@ -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)) Loading @@ -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); Loading Loading
src/com/android/settings/MainClear.java +13 −2 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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 Loading @@ -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); Loading
tests/robotests/src/com/android/settings/MainClearTest.java +70 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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"; Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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) Loading
tests/robotests/src/com/android/settings/UtilsTest.java +9 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading @@ -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)) Loading @@ -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); Loading