diff --git a/res/values/strings.xml b/res/values/strings.xml index 8fc5ed5d651..aa0671eb438 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1182,20 +1182,20 @@ Current screen lock - Fingerprint + Pattern + Pattern \u2022 Fingerprint - Fingerprint + PIN + PIN \u2022 Fingerprint - Fingerprint + Password + Password \u2022 Fingerprint Continue without fingerprint - Face Unlock + Pattern + Pattern \u2022 Face - Face Unlock + PIN + PIN \u2022 Face - Face Unlock + Password + Password \u2022 Face Continue without Face Unlock diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index e0f402bdc02..be090e33366 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -185,7 +185,8 @@ public class FingerprintSettings extends SubSettings { private static final int MSG_FINGER_AUTH_HELP = 1004; private static final int CONFIRM_REQUEST = 101; - private static final int CHOOSE_LOCK_GENERIC_REQUEST = 102; + @VisibleForTesting + static final int CHOOSE_LOCK_GENERIC_REQUEST = 102; @VisibleForTesting static final int ADD_FINGERPRINT_REQUEST = 10; private static final int AUTO_ADD_FIRST_FINGERPRINT_REQUEST = 11; @@ -1014,7 +1015,7 @@ public class FingerprintSettings extends SubSettings { true); intent.putExtra(Intent.EXTRA_USER_ID, mUserId); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, true); - intent.putExtra(Intent.EXTRA_USER_ID, mUserId); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true); startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST); } } diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java index 2bc81e60a06..18b05add7ad 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java @@ -20,8 +20,11 @@ import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFP import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.ADD_FINGERPRINT_REQUEST; +import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.CHOOSE_LOCK_GENERIC_REQUEST; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.KEY_FINGERPRINT_ADD; +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -54,6 +57,7 @@ import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowFragment; +import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowSettingsPreferenceFragment; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUtils; @@ -63,6 +67,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -74,7 +79,7 @@ import java.util.ArrayList; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowSettingsPreferenceFragment.class, ShadowUtils.class, ShadowFragment.class, - ShadowUserManager.class}) + ShadowUserManager.class, ShadowLockPatternUtils.class}) public class FingerprintSettingsFragmentTest { private FingerprintSettingsFragment mFragment; private Context mContext; @@ -92,10 +97,62 @@ public class FingerprintSettingsFragmentTest { doReturn(true).when(mFingerprintManager).isHardwareDetected(); ShadowUtils.setFingerprintManager(mFingerprintManager); FakeFeatureFactory.setupForTest(); + } + @After + public void tearDown() { + ShadowUtils.reset(); + } + + @Test + public void testAddFingerprint_inFullScreen_noDialog() { + setUpFragment(false); + // Click "Add Fingerprint" + final Preference preference = new Preference(mContext); + preference.setKey(KEY_FINGERPRINT_ADD); + mFragment.onPreferenceTreeClick(preference); + + verify(mFragment).startActivityForResult(any(), eq(ADD_FINGERPRINT_REQUEST)); + verify(mFragmentTransaction, never()).add(any(), + eq(BiometricsSplitScreenDialog.class.getName())); + + } + + @Test + public void testAddFingerprint_inMultiWindow_showsDialog() { + setUpFragment(false); + + doReturn(true).when(mActivity).isInMultiWindowMode(); + + // Click "Add Fingerprint" + final Preference preference = new Preference(mContext); + preference.setKey(KEY_FINGERPRINT_ADD); + mFragment.onPreferenceTreeClick(preference); + + verify(mFragment, times(0)).startActivityForResult(any(), eq(ADD_FINGERPRINT_REQUEST)); + verify(mFragmentTransaction).add(any(), eq(BiometricsSplitScreenDialog.class.getName())); + } + + @Test + public void testChooseLockKeyForFingerprint() { + setUpFragment(true); + ArgumentCaptor intentArgumentCaptor = ArgumentCaptor.forClass( + Intent.class); + verify(mFragment).startActivityForResult(intentArgumentCaptor.capture(), + eq(CHOOSE_LOCK_GENERIC_REQUEST)); + + Intent intent = intentArgumentCaptor.getValue(); + assertThat(intent.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, + false)).isTrue(); + } + + private void setUpFragment(boolean showChooseLock) { Intent intent = new Intent(); - intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]); - intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, 1L); + if (!showChooseLock) { + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, 1L); + } + mActivity = spy(Robolectric.buildActivity(FragmentActivity.class, intent).get()); mContext = spy(ApplicationProvider.getApplicationContext()); @@ -112,49 +169,12 @@ public class FingerprintSettingsFragmentTest { doNothing().when(mFragment).startActivityForResult(any(Intent.class), anyInt()); setSensor(); - } - @After - public void tearDown() { - ShadowUtils.reset(); - } - - @Test - public void testAddFingerprint_inFullScreen_noDialog() { // Start fragment mFragment.onAttach(mContext); mFragment.onCreate(null); mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY); mFragment.onResume(); - - // Click "Add Fingerprint" - final Preference preference = new Preference(mContext); - preference.setKey(KEY_FINGERPRINT_ADD); - mFragment.onPreferenceTreeClick(preference); - - verify(mFragment).startActivityForResult(any(), eq(ADD_FINGERPRINT_REQUEST)); - verify(mFragmentTransaction, never()).add(any(), - eq(BiometricsSplitScreenDialog.class.getName())); - - } - - @Test - public void testAddFingerprint_inMultiWindow_showsDialog() { - // Start fragment - mFragment.onAttach(mContext); - mFragment.onCreate(null); - mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY); - mFragment.onResume(); - - doReturn(true).when(mActivity).isInMultiWindowMode(); - - // Click "Add Fingerprint" - final Preference preference = new Preference(mContext); - preference.setKey(KEY_FINGERPRINT_ADD); - mFragment.onPreferenceTreeClick(preference); - - verify(mFragment, times(0)).startActivityForResult(any(), eq(ADD_FINGERPRINT_REQUEST)); - verify(mFragmentTransaction).add(any(), eq(BiometricsSplitScreenDialog.class.getName())); } private void setSensor() { diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java index dbc60dce731..12a540d7c33 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java @@ -30,6 +30,8 @@ import static com.android.settings.password.ChooseLockGeneric.ChooseLockGenericF import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_DEVICE_PASSWORD_REQUIREMENT_ONLY; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS; +import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE; +import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; @@ -126,7 +128,9 @@ public class ChooseLockGenericTest { when(mFaceManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn( - false); + true); + ShadowUtils.setFingerprintManager(mFingerprintManager); + ShadowUtils.setFaceManager(mFaceManager); } @After @@ -540,35 +544,63 @@ public class ChooseLockGenericTest { @Test public void updatePreferenceText_supportBiometrics_showFaceAndFingerprint() { - ShadowLockPatternUtils.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW); - final PasswordPolicy policy = new PasswordPolicy(); - policy.quality = PASSWORD_QUALITY_ALPHABETIC; - ShadowLockPatternUtils.setRequestedProfilePasswordMetrics(policy.getMinMetrics()); - + ShadowStorageManager.setIsFileEncrypted(false); final Intent intent = new Intent().putExtra(EXTRA_KEY_FOR_BIOMETRICS, true); initActivity(intent); - final Intent passwordIntent = mFragment.getLockPatternIntent(); - assertThat(passwordIntent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY, - PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_LOW); final String supportFingerprint = capitalize(mActivity.getResources().getString( R.string.security_settings_fingerprint)); final String supportFace = capitalize(mActivity.getResources().getString( R.string.keywords_face_settings)); + String pinTitle = + (String) mFragment.findPreference(ScreenLockType.PIN.preferenceKey).getTitle(); + String patternTitle = + (String) mFragment.findPreference(ScreenLockType.PATTERN.preferenceKey).getTitle(); + String passwordTitle = + (String) mFragment.findPreference(ScreenLockType.PASSWORD.preferenceKey).getTitle(); - assertThat(mFragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains( - supportFingerprint); - assertThat(mFragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains( - supportFace); - assertThat(mFragment.getBiometricsPreferenceTitle(ScreenLockType.PATTERN)).contains( - supportFingerprint); - assertThat(mFragment.getBiometricsPreferenceTitle(ScreenLockType.PATTERN)).contains( - supportFace); - assertThat(mFragment.getBiometricsPreferenceTitle(ScreenLockType.PASSWORD)).contains( - supportFingerprint); - assertThat(mFragment.getBiometricsPreferenceTitle(ScreenLockType.PASSWORD)).contains( - supportFace); + assertThat(pinTitle).contains(supportFingerprint); + assertThat(pinTitle).contains(supportFace); + assertThat(patternTitle).contains(supportFingerprint); + assertThat(patternTitle).contains(supportFace); + assertThat(passwordTitle).contains(supportFingerprint); + assertThat(passwordTitle).contains(supportFace); + } + + @Test + public void updatePreferenceText_supportFingerprint_showFingerprint() { + ShadowStorageManager.setIsFileEncrypted(false); + final Intent intent = new Intent().putExtra(EXTRA_KEY_FOR_FINGERPRINT, true); + initActivity(intent); + mFragment.updatePreferencesOrFinish(false /* isRecreatingActivity */); + + assertThat(mFragment.findPreference(ScreenLockType.PIN.preferenceKey).getTitle()).isEqualTo( + mFragment.getString(R.string.fingerprint_unlock_set_unlock_pin)); + assertThat(mFragment.findPreference( + ScreenLockType.PATTERN.preferenceKey).getTitle()).isEqualTo( + mFragment.getString(R.string.fingerprint_unlock_set_unlock_pattern)); + assertThat(mFragment.findPreference( + ScreenLockType.PASSWORD.preferenceKey).getTitle()).isEqualTo( + mFragment.getString(R.string.fingerprint_unlock_set_unlock_password)); + } + + @Test + public void updatePreferenceText_supportFace_showFace() { + + ShadowStorageManager.setIsFileEncrypted(false); + final Intent intent = new Intent().putExtra(EXTRA_KEY_FOR_FACE, true); + initActivity(intent); + mFragment.updatePreferencesOrFinish(false /* isRecreatingActivity */); + + assertThat(mFragment.findPreference(ScreenLockType.PIN.preferenceKey).getTitle()).isEqualTo( + mFragment.getString(R.string.face_unlock_set_unlock_pin)); + assertThat(mFragment.findPreference( + ScreenLockType.PATTERN.preferenceKey).getTitle()).isEqualTo( + mFragment.getString(R.string.face_unlock_set_unlock_pattern)); + assertThat(mFragment.findPreference( + ScreenLockType.PASSWORD.preferenceKey).getTitle()).isEqualTo( + mFragment.getString(R.string.face_unlock_set_unlock_password)); } private void initActivity(@Nullable Intent intent) {