(2/N) Biometric error dialog

Add an error dialog to help user recover from biometric error for
for identity check while trying to factory reset

Flag: android.hardware.biometrics.flag.mandatory_biometrics
Bug: 358641110
Bug: 358179610
Test: atest MainClearTest
Change-Id: Ia20389a3146aa45ad42bdc4d31f1bd9488f2dc42
This commit is contained in:
Diya Bera
2024-09-14 00:26:14 +00:00
parent 5335e26b29
commit 1c604f29ef
9 changed files with 118 additions and 56 deletions

View File

@@ -55,7 +55,11 @@ import android.widget.LinearLayout;
import android.widget.ScrollView;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.android.settings.biometrics.IdentityCheckBiometricErrorDialog;
import com.android.settings.password.ConfirmDeviceCredentialActivity;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
@@ -114,6 +118,10 @@ public class MainClearTest {
@Mock
private Intent mMockIntent;
@Mock
private FragmentManager mMockFragmentManager;
@Mock
private FragmentTransaction mMockFragmentTransaction;
private MainClear mMainClear;
private ShadowActivity mShadowActivity;
@@ -391,6 +399,9 @@ public class MainClearTest {
@Test
@EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS)
public void testOnActivityResultInternal_keyguardRequestNotTriggeringBiometricPrompt_lockoutError() {
final ArgumentCaptor<IdentityCheckBiometricErrorDialog> argumentCaptor =
ArgumentCaptor.forClass(IdentityCheckBiometricErrorDialog.class);
when(mContext.getResources()).thenReturn(mResources);
when(mMockActivity.getSystemService(BiometricManager.class)).thenReturn(mBiometricManager);
when(mResources.getString(anyInt())).thenReturn(TEST_ACCOUNT_NAME);
@@ -400,12 +411,17 @@ public class MainClearTest {
doReturn(true).when(mMainClear).isValidRequestCode(eq(MainClear.KEYGUARD_REQUEST));
doNothing().when(mMainClear).startActivityForResult(any(), anyInt());
doReturn(mMockActivity).when(mMainClear).getActivity();
doReturn(mMockFragmentManager).when(mMockActivity).getSupportFragmentManager();
doReturn(mMockFragmentTransaction).when(mMockFragmentManager).beginTransaction();
doReturn(mContext).when(mMainClear).getContext();
mMainClear
.onActivityResultInternal(MainClear.KEYGUARD_REQUEST, Activity.RESULT_OK, null);
verify(mMainClear).isValidRequestCode(eq(MainClear.KEYGUARD_REQUEST));
verify(mMainClear.getActivity().getSupportFragmentManager().beginTransaction()).add(
argumentCaptor.capture(), any());
assertThat(argumentCaptor.getValue()).isInstanceOf(IdentityCheckBiometricErrorDialog.class);
verify(mMainClear, never()).startActivityForResult(any(), eq(MainClear.BIOMETRICS_REQUEST));
verify(mMainClear, never()).establishInitialState();
verify(mMainClear, never()).getAccountConfirmationIntent();
@@ -427,6 +443,29 @@ public class MainClearTest {
verify(mMainClear).showFinalConfirmation();
}
@Test
public void testOnActivityResultInternal_biometricRequestTriggeringBiometricErrorDialog() {
final ArgumentCaptor<IdentityCheckBiometricErrorDialog> argumentCaptor =
ArgumentCaptor.forClass(IdentityCheckBiometricErrorDialog.class);
doReturn(true).when(mMainClear).isValidRequestCode(
eq(MainClear.BIOMETRICS_REQUEST));
doNothing().when(mMainClear).establishInitialState();
doReturn(mMockActivity).when(mMainClear).getActivity();
doReturn(mMockFragmentManager).when(mMockActivity).getSupportFragmentManager();
doReturn(mMockFragmentTransaction).when(mMockFragmentManager).beginTransaction();
doReturn(mContext).when(mMainClear).getContext();
mMainClear
.onActivityResultInternal(MainClear.BIOMETRICS_REQUEST,
ConfirmDeviceCredentialActivity.BIOMETRIC_LOCKOUT_ERROR_RESULT, null);
verify(mMainClear).isValidRequestCode(eq(MainClear.BIOMETRICS_REQUEST));
verify(mMainClear.getActivity().getSupportFragmentManager().beginTransaction()).add(
argumentCaptor.capture(), any());
verify(mMainClear).establishInitialState();
}
@Test
public void testOnActivityResultInternal_biometricRequestTriggeringInitialState() {
doReturn(true).when(mMainClear).isValidRequestCode(eq(MainClear.BIOMETRICS_REQUEST));