diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.java index 14d859dbffc..ecec36f50de 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.java @@ -44,6 +44,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.fragment.app.Fragment; +import androidx.lifecycle.LiveData; import androidx.lifecycle.ViewModelProvider; import com.android.settings.R; @@ -120,15 +121,6 @@ public class FingerprintEnrollIntroFragment extends Fragment { footerTitle2.setText( R.string.security_settings_fingerprint_enroll_introduction_footer_title_2); - return mView; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - final Context context = view.getContext(); - final TextView footerLink = mView.findViewById(R.id.footer_learn_more); footerLink.setMovementMethod(LinkMovementMethod.getInstance()); final String footerLinkStr = getContext().getString( @@ -139,18 +131,28 @@ public class FingerprintEnrollIntroFragment extends Fragment { // footer buttons mPrimaryFooterButton = new FooterButton.Builder(context) .setText(R.string.security_settings_fingerprint_enroll_introduction_agree) - .setListener(mViewModel::onNextButtonClick) .setButtonType(FooterButton.ButtonType.OPT_IN) .setTheme(R.style.SudGlifButton_Primary) .build(); mSecondaryFooterButton = new FooterButton.Builder(context) - .setListener(mViewModel::onSkipOrCancelButtonClick) .setButtonType(FooterButton.ButtonType.NEXT) .setTheme(R.style.SudGlifButton_Primary) .build(); getFooterBarMixin().setPrimaryButton(mPrimaryFooterButton); getFooterBarMixin().setSecondaryButton(mSecondaryFooterButton, true /* usePrimaryStyle */); + return mView; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + final Context context = view.getContext(); + + mPrimaryFooterButton.setOnClickListener(mViewModel::onNextButtonClick); + mSecondaryFooterButton.setOnClickListener(mViewModel::onSkipOrCancelButtonClick); + if (mViewModel.canAssumeUdfps()) { mFooterMessage6.setVisibility(View.VISIBLE); mIconShield.setVisibility(View.VISIBLE); @@ -158,7 +160,7 @@ public class FingerprintEnrollIntroFragment extends Fragment { mFooterMessage6.setVisibility(View.GONE); mIconShield.setVisibility(View.GONE); } - mSecondaryFooterButton.setText(getContext(), + mSecondaryFooterButton.setText(context, mViewModel.getEnrollmentRequest().isAfterSuwOrSuwSuggestedAction() ? R.string.security_settings_fingerprint_enroll_introduction_cancel : R.string.security_settings_fingerprint_enroll_introduction_no_thanks); @@ -174,18 +176,31 @@ public class FingerprintEnrollIntroFragment extends Fragment { setHeaderText(getActivity(), R.string.security_settings_fingerprint_enroll_introduction_title); } + observePageStatusLiveDataIfNeed(); + } - mViewModel.getPageStatusLiveData().observe(this, this::updateFooterButtons); + private void observePageStatusLiveDataIfNeed() { + final LiveData statusLiveData = + mViewModel.getPageStatusLiveData(); + final FingerprintEnrollIntroStatus status = statusLiveData.getValue(); + if (status != null && status.hasScrollToBottom()) { + // Do not requireScrollWithButton() again when "I agree" or "Done" button is visible, + // because if we requireScrollWithButton() again, it will become "More" after scroll-up. + return; + } final RequireScrollMixin requireScrollMixin = getLayout() .getMixin(RequireScrollMixin.class); requireScrollMixin.requireScrollWithButton(getActivity(), mPrimaryFooterButton, getMoreButtonTextRes(), mViewModel::onNextButtonClick); - requireScrollMixin.setOnRequireScrollStateChangedListener(scrollNeeded -> { - if (!scrollNeeded) { - mViewModel.setHasScrolledToBottom(); - } - }); + + // Always set true to setHasScrolledToBottom() before registering listener through + // setOnRequireScrollStateChangedListener(), because listener will not be called if first + // scrollNeeded is true + mViewModel.setHasScrolledToBottom(true); + requireScrollMixin.setOnRequireScrollStateChangedListener( + scrollNeeded -> mViewModel.setHasScrolledToBottom(!scrollNeeded)); + statusLiveData.observe(this, this::updateFooterButtons); } @Override diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java index 991aeba74d2..1f67100afcf 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java @@ -95,14 +95,9 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { mViewModel = viewModelProvider.get(FingerprintEnrollmentViewModel.class); mViewModel.setRequest(new EnrollmentRequest(getIntent(), getApplicationContext())); mViewModel.setSavedInstanceState(savedInstanceState); - getLifecycle().addObserver(mViewModel); mAutoCredentialViewModel = viewModelProvider.get(AutoCredentialViewModel.class); mAutoCredentialViewModel.setCredentialModel(savedInstanceState, getIntent()); - mAutoCredentialViewModel.getGenerateChallengeFailLiveData().observe(this, - this::onGenerateChallengeFail); - - mViewModel.getSetResultLiveData().observe(this, this::onSetActivityResult); checkCredential(); // Theme @@ -113,16 +108,10 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { // fragment setContentView(R.layout.biometric_enrollment_container); - final FingerprintEnrollIntroViewModel fingerprintEnrollIntroViewModel = + final FingerprintEnrollIntroViewModel introViewModel = viewModelProvider.get(FingerprintEnrollIntroViewModel.class); - fingerprintEnrollIntroViewModel.setEnrollmentRequest(mViewModel.getRequest()); - fingerprintEnrollIntroViewModel.setUserId(mAutoCredentialViewModel.getUserId()); - - // Clear ActionLiveData in FragmentViewModel to prevent getting previous action when - // recreate - fingerprintEnrollIntroViewModel.clearActionLiveData(); - fingerprintEnrollIntroViewModel.getActionLiveData().observe( - this, this::observeIntroAction); + introViewModel.setEnrollmentRequest(mViewModel.getRequest()); + introViewModel.setUserId(mAutoCredentialViewModel.getUserId()); if (savedInstanceState == null) { final String tag = "FingerprintEnrollIntroFragment"; getSupportFragmentManager().beginTransaction() @@ -131,9 +120,21 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { tag) .commit(); } + + // observe LiveData + getLifecycle().addObserver(mViewModel); + mViewModel.getSetResultLiveData().observe(this, this::onSetActivityResult); + + mAutoCredentialViewModel.getGenerateChallengeFailedLiveData().observe(this, + this::onGenerateChallengeFailed); + + // Clear ActionLiveData in FragmentViewModel to prevent getting previous action during + // recreate, like press 'I agree' then press 'back' in FingerprintEnrollFindSensor activity. + introViewModel.clearActionLiveData(); + introViewModel.getActionLiveData().observe(this, this::observeIntroAction); } - private void onGenerateChallengeFail(@NonNull Boolean isFail) { + private void onGenerateChallengeFailed(@NonNull Boolean ignoredBoolean) { onSetActivityResult(new ActivityResult(RESULT_CANCELED, null)); } @@ -148,7 +149,7 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { private void checkCredential() { switch (mAutoCredentialViewModel.checkCredential()) { case CREDENTIAL_FAIL_NEED_TO_CHOOSE_LOCK: { - final Intent intent = mAutoCredentialViewModel.getChooseLockIntent(this, + final Intent intent = mAutoCredentialViewModel.createChooseLockIntent(this, mViewModel.getRequest().isSuw(), mViewModel.getRequest().getSuwExtras()); if (!mViewModel.isWaitingActivityResult().compareAndSet(false, true)) { Log.w(TAG, "chooseLock, fail to set isWaiting flag to true"); @@ -157,7 +158,7 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { return; } case CREDENTIAL_FAIL_NEED_TO_CONFIRM_LOCK: { - final boolean launched = mAutoCredentialViewModel.getConfirmLockLauncher( + final boolean launched = mAutoCredentialViewModel.createConfirmLockLauncher( this, LAUNCH_CONFIRM_LOCK_ACTIVITY, getString(R.string.security_settings_fingerprint_preference_title) @@ -215,7 +216,7 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { final Intent intent = new Intent(this, isSuw ? SetupFingerprintEnrollFindSensor.class : FingerprintEnrollFindSensor.class); - intent.putExtras(mAutoCredentialViewModel.getCredentialIntentExtra()); + intent.putExtras(mAutoCredentialViewModel.createCredentialIntentExtra()); intent.putExtras(mViewModel.getNextActivityBaseIntentExtras()); mNextActivityLauncher.launch(intent); } diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java index a443e69a855..3b7a436fe5c 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java @@ -68,7 +68,7 @@ public class AutoCredentialViewModel extends AndroidViewModel { private static final boolean DEBUG = false; /** - * Valid credential, activity doesn't need to do anything. + * Valid credential, activity does nothing. */ public static final int CREDENTIAL_VALID = 0; @@ -170,7 +170,7 @@ public class AutoCredentialViewModel extends AndroidViewModel { @NonNull private final LockPatternUtils mLockPatternUtils; @NonNull private final ChallengeGenerator mChallengeGenerator; private CredentialModel mCredentialModel = null; - @NonNull private final MutableLiveData mGenerateChallengeFailLiveData = + @NonNull private final MutableLiveData mGenerateChallengeFailedLiveData = new MutableLiveData<>(); public AutoCredentialViewModel( @@ -186,11 +186,13 @@ public class AutoCredentialViewModel extends AndroidViewModel { * Set CredentialModel, the source is coming from savedInstanceState or activity intent */ public void setCredentialModel(@Nullable Bundle savedInstanceState, @NonNull Intent intent) { - mCredentialModel = new CredentialModel( - savedInstanceState != null - ? savedInstanceState.getBundle(KEY_CREDENTIAL_MODEL) - : intent.getExtras(), - SystemClock.elapsedRealtimeClock()); + final Bundle bundle; + if (savedInstanceState != null) { + bundle = savedInstanceState.getBundle(KEY_CREDENTIAL_MODEL); + } else { + bundle = intent.getExtras(); + } + mCredentialModel = new CredentialModel(bundle, SystemClock.elapsedRealtimeClock()); if (DEBUG) { Log.d(TAG, "setCredentialModel " + mCredentialModel + ", savedInstanceState exist:" @@ -206,8 +208,8 @@ public class AutoCredentialViewModel extends AndroidViewModel { } @NonNull - public LiveData getGenerateChallengeFailLiveData() { - return mGenerateChallengeFailLiveData; + public LiveData getGenerateChallengeFailedLiveData() { + return mGenerateChallengeFailedLiveData; } /** @@ -238,7 +240,7 @@ public class AutoCredentialViewModel extends AndroidViewModel { mCredentialModel.setToken(newToken); } catch (IllegalStateException e) { Log.e(TAG, "generateChallenge, IllegalStateException", e); - mGenerateChallengeFailLiveData.postValue(true); + mGenerateChallengeFailedLiveData.postValue(true); return; } @@ -252,7 +254,7 @@ public class AutoCredentialViewModel extends AndroidViewModel { // Check credential again if (!isValidCredential()) { Log.w(TAG, "generateChallenge, invalid Credential"); - mGenerateChallengeFailLiveData.postValue(true); + mGenerateChallengeFailedLiveData.postValue(true); } }); mChallengeGenerator.generateChallenge(getUserId()); @@ -312,7 +314,7 @@ public class AutoCredentialViewModel extends AndroidViewModel { * Get Credential intent extra which will be used to launch next activity. */ @NonNull - public Bundle getCredentialIntentExtra() { + public Bundle createCredentialIntentExtra() { final Bundle retBundle = new Bundle(); final long gkPwHandle = mCredentialModel.getGkPwHandle(); if (CredentialModel.isValidGkPwHandle(gkPwHandle)) { @@ -332,10 +334,10 @@ public class AutoCredentialViewModel extends AndroidViewModel { } /** - * Get Intent for choosing lock + * Create Intent for choosing lock */ @NonNull - public Intent getChooseLockIntent(@NonNull Context context, boolean isSuw, + public Intent createChooseLockIntent(@NonNull Context context, boolean isSuw, @NonNull Bundle suwExtras) { final Intent intent = BiometricUtils.getChooseLockIntent(context, isSuw, suwExtras); @@ -352,10 +354,10 @@ public class AutoCredentialViewModel extends AndroidViewModel { } /** - * Get ConfirmLockLauncher + * Create ConfirmLockLauncher */ @NonNull - public ChooseLockSettingsHelper getConfirmLockLauncher(@NonNull Activity activity, + public ChooseLockSettingsHelper createConfirmLockLauncher(@NonNull Activity activity, int requestCode, @NonNull String title) { final ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(activity); diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.java index 3274eb29565..72611a7c791 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.java @@ -145,7 +145,7 @@ public class FingerprintEnrollIntroViewModel extends AndroidViewModel } /** - * Clear user's action live data (like clicking Agree, Skip, or Done) + * Clear user's action live data */ public void clearActionLiveData() { mActionLiveData.setValue(null); @@ -168,8 +168,8 @@ public class FingerprintEnrollIntroViewModel extends AndroidViewModel /** * Update onboarding intro page has scrolled to bottom */ - public void setHasScrolledToBottom() { - mHasScrolledToBottomLiveData.postValue(true); + public void setHasScrolledToBottom(boolean value) { + mHasScrolledToBottomLiveData.postValue(value); } /** diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.java index a11650ebe84..3abbca6cb68 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.java @@ -26,6 +26,8 @@ import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_SENS import static com.android.settings.biometrics2.ui.model.CredentialModel.INVALID_CHALLENGE; import static com.android.settings.biometrics2.ui.model.CredentialModel.INVALID_GK_PW_HANDLE; import static com.android.settings.biometrics2.ui.model.CredentialModel.INVALID_SENSOR_ID; +import static com.android.settings.biometrics2.ui.model.CredentialModel.isValidGkPwHandle; +import static com.android.settings.biometrics2.ui.model.CredentialModel.isValidToken; import static com.android.settings.biometrics2.ui.model.CredentialModelTest.newCredentialModelIntentExtras; import static com.android.settings.biometrics2.ui.model.CredentialModelTest.newGkPwHandleCredentialIntentExtras; import static com.android.settings.biometrics2.ui.model.CredentialModelTest.newInvalidChallengeCredentialIntentExtras; @@ -58,9 +60,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.VerifyCredentialResponse; -import com.android.settings.biometrics2.ui.model.CredentialModel; import com.android.settings.password.ChooseLockPattern; -import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.testutils.InstantTaskExecutorRule; import org.junit.Before; @@ -79,12 +79,12 @@ public class AutoCredentialViewModelTest { @Mock private LockPatternUtils mLockPatternUtils; private TestChallengeGenerator mChallengeGenerator = null; - private AutoCredentialViewModel mAutoCredentialViewModel; + private AutoCredentialViewModel mViewModel; @Before public void setUp() { mChallengeGenerator = new TestChallengeGenerator(); - mAutoCredentialViewModel = new AutoCredentialViewModel( + mViewModel = new AutoCredentialViewModel( ApplicationProvider.getApplicationContext(), mLockPatternUtils, mChallengeGenerator); @@ -99,22 +99,21 @@ public class AutoCredentialViewModelTest { } @Test - public void testGetCredentialIntentExtra_sameResultFromSavedInstanceOrIntent() { + public void testSetCredentialModel_sameResultFromSavedInstanceOrIntent() { final Bundle extras = newCredentialModelIntentExtras(12, 33, 1, new byte[] { 2, 3 }, 3L); - AutoCredentialViewModel autoCredentialViewModel2 = new AutoCredentialViewModel( + AutoCredentialViewModel viewModel2 = new AutoCredentialViewModel( ApplicationProvider.getApplicationContext(), mLockPatternUtils, mChallengeGenerator); - mAutoCredentialViewModel.setCredentialModel(null, - new Intent().putExtras(extras)); + mViewModel.setCredentialModel(null, new Intent().putExtras(extras)); final Bundle savedInstance = new Bundle(); savedInstance.putBundle(KEY_CREDENTIAL_MODEL, extras); - autoCredentialViewModel2.setCredentialModel(savedInstance, new Intent()); + viewModel2.setCredentialModel(savedInstance, new Intent()); - final Bundle bundle1 = mAutoCredentialViewModel.getCredentialIntentExtra(); - final Bundle bundle2 = autoCredentialViewModel2.getCredentialIntentExtra(); + final Bundle bundle1 = mViewModel.createCredentialIntentExtra(); + final Bundle bundle2 = viewModel2.createCredentialIntentExtra(); assertThat(bundle1.getLong(EXTRA_KEY_GK_PW_HANDLE)) .isEqualTo(bundle2.getLong(EXTRA_KEY_GK_PW_HANDLE)); assertThat(bundle1.getLong(Intent.EXTRA_USER_ID)) @@ -134,23 +133,22 @@ public class AutoCredentialViewModelTest { } @Test - public void testGetCredentialIntentExtra_sameResultFromSavedInstanceOrIntent_invalidValues() { + public void testSetCredentialModel_sameResultFromSavedInstanceOrIntent_invalidValues() { final Bundle extras = newCredentialModelIntentExtras(UserHandle.USER_NULL, INVALID_CHALLENGE, INVALID_SENSOR_ID, null, INVALID_GK_PW_HANDLE); - AutoCredentialViewModel autoCredentialViewModel2 = new AutoCredentialViewModel( + AutoCredentialViewModel viewModel2 = new AutoCredentialViewModel( ApplicationProvider.getApplicationContext(), mLockPatternUtils, mChallengeGenerator); - mAutoCredentialViewModel.setCredentialModel(null, - new Intent().putExtras(extras)); + mViewModel.setCredentialModel(null, new Intent().putExtras(extras)); final Bundle savedInstance = new Bundle(); savedInstance.putBundle(KEY_CREDENTIAL_MODEL, extras); - autoCredentialViewModel2.setCredentialModel(savedInstance, new Intent()); + viewModel2.setCredentialModel(savedInstance, new Intent()); - final Bundle bundle1 = mAutoCredentialViewModel.getCredentialIntentExtra(); - final Bundle bundle2 = autoCredentialViewModel2.getCredentialIntentExtra(); + final Bundle bundle1 = mViewModel.createCredentialIntentExtra(); + final Bundle bundle2 = viewModel2.createCredentialIntentExtra(); assertThat(bundle1.containsKey(EXTRA_KEY_GK_PW_HANDLE)).isFalse(); assertThat(bundle2.containsKey(EXTRA_KEY_GK_PW_HANDLE)).isFalse(); assertThat(bundle1.containsKey(EXTRA_KEY_CHALLENGE_TOKEN)).isFalse(); @@ -164,83 +162,83 @@ public class AutoCredentialViewModelTest { @Test public void testCheckCredential_validCredentialCase() { final int userId = 99; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newValidTokenCredentialIntentExtras(userId))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_SOMETHING); // Run credential check - @CredentialAction final int action = mAutoCredentialViewModel.checkCredential(); + @CredentialAction final int action = mViewModel.checkCredential(); assertThat(action).isEqualTo(CREDENTIAL_VALID); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckCredential_needToChooseLock() { final int userId = 100; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newInvalidChallengeCredentialIntentExtras(userId))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_UNSPECIFIED); // Run credential check - @CredentialAction final int action = mAutoCredentialViewModel.checkCredential(); + @CredentialAction final int action = mViewModel.checkCredential(); assertThat(action).isEqualTo(CREDENTIAL_FAIL_NEED_TO_CHOOSE_LOCK); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckCredential_needToConfirmLockFoSomething() { final int userId = 101; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newInvalidChallengeCredentialIntentExtras(userId))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_SOMETHING); // Run credential check - @CredentialAction final int action = mAutoCredentialViewModel.checkCredential(); + @CredentialAction final int action = mViewModel.checkCredential(); assertThat(action).isEqualTo(CREDENTIAL_FAIL_NEED_TO_CONFIRM_LOCK); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckCredential_needToConfirmLockForNumeric() { final int userId = 102; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newInvalidChallengeCredentialIntentExtras(userId))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_NUMERIC); // Run credential check - @CredentialAction final int action = mAutoCredentialViewModel.checkCredential(); + @CredentialAction final int action = mViewModel.checkCredential(); assertThat(action).isEqualTo(CREDENTIAL_FAIL_NEED_TO_CONFIRM_LOCK); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckCredential_needToConfirmLockForAlphabetic() { final int userId = 103; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newInvalidChallengeCredentialIntentExtras(userId))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_ALPHABETIC); // Run credential check - @CredentialAction final int action = mAutoCredentialViewModel.checkCredential(); + @CredentialAction final int action = mViewModel.checkCredential(); assertThat(action).isEqualTo(CREDENTIAL_FAIL_NEED_TO_CONFIRM_LOCK); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckCredential_generateChallenge() { final int userId = 104; final long gkPwHandle = 1111L; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_SOMETHING); @@ -252,17 +250,15 @@ public class AutoCredentialViewModelTest { .thenReturn(newGoodCredential(gkPwHandle, new byte[] { 1 })); // Run credential check - @CredentialAction final int action = mAutoCredentialViewModel.checkCredential(); + @CredentialAction final int action = mViewModel.checkCredential(); assertThat(action).isEqualTo(CREDENTIAL_IS_GENERATING_CHALLENGE); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); - final Bundle extras = mAutoCredentialViewModel.getCredentialIntentExtra(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); + final Bundle extras = mViewModel.createCredentialIntentExtra(); assertThat(extras.getInt(EXTRA_KEY_SENSOR_ID)).isEqualTo(newSensorId); assertThat(extras.getLong(EXTRA_KEY_CHALLENGE)).isEqualTo(newChallenge); - assertThat(CredentialModel.isValidToken(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN))) - .isTrue(); - assertThat(CredentialModel.isValidGkPwHandle(extras.getLong(EXTRA_KEY_GK_PW_HANDLE))) - .isFalse(); + assertThat(isValidToken(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN))).isTrue(); + assertThat(isValidGkPwHandle(extras.getLong(EXTRA_KEY_GK_PW_HANDLE))).isFalse(); assertThat(mChallengeGenerator.mCallbackRunCount).isEqualTo(1); } @@ -270,7 +266,7 @@ public class AutoCredentialViewModelTest { public void testCheckCredential_generateChallengeFail() { final int userId = 104; final long gkPwHandle = 1111L; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_SOMETHING); @@ -282,21 +278,21 @@ public class AutoCredentialViewModelTest { .thenReturn(newBadCredential(0)); // Run credential check - @CredentialAction final int action = mAutoCredentialViewModel.checkCredential(); + @CredentialAction final int action = mViewModel.checkCredential(); assertThat(action).isEqualTo(CREDENTIAL_IS_GENERATING_CHALLENGE); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isTrue(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isTrue(); assertThat(mChallengeGenerator.mCallbackRunCount).isEqualTo(1); } @Test public void testGetUserId_fromIntent() { final int userId = 106; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newInvalidChallengeCredentialIntentExtras(userId))); // Get userId - assertThat(mAutoCredentialViewModel.getUserId()).isEqualTo(userId); + assertThat(mViewModel.getUserId()).isEqualTo(userId); } @Test @@ -305,79 +301,79 @@ public class AutoCredentialViewModelTest { final Bundle savedInstance = new Bundle(); savedInstance.putBundle(KEY_CREDENTIAL_MODEL, newInvalidChallengeCredentialIntentExtras(userId)); - mAutoCredentialViewModel.setCredentialModel(savedInstance, new Intent()); + mViewModel.setCredentialModel(savedInstance, new Intent()); // Get userId - assertThat(mAutoCredentialViewModel.getUserId()).isEqualTo(userId); + assertThat(mViewModel.getUserId()).isEqualTo(userId); } @Test public void testCheckNewCredentialFromActivityResult_invalidChooseLock() { final int userId = 107; final long gkPwHandle = 3333L; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))); final Intent intent = new Intent(); - intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, gkPwHandle); + intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, gkPwHandle); // run checkNewCredentialFromActivityResult() - final boolean ret = mAutoCredentialViewModel.checkNewCredentialFromActivityResult(true, + final boolean ret = mViewModel.checkNewCredentialFromActivityResult(true, new ActivityResult(ChooseLockPattern.RESULT_FINISHED + 1, intent)); assertThat(ret).isFalse(); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckNewCredentialFromActivityResult_invalidConfirmLock() { final int userId = 107; final long gkPwHandle = 3333L; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))); final Intent intent = new Intent(); - intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, gkPwHandle); + intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, gkPwHandle); // run checkNewCredentialFromActivityResult() - final boolean ret = mAutoCredentialViewModel.checkNewCredentialFromActivityResult(false, + final boolean ret = mViewModel.checkNewCredentialFromActivityResult(false, new ActivityResult(Activity.RESULT_OK + 1, intent)); assertThat(ret).isFalse(); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckNewCredentialFromActivityResult_nullDataChooseLock() { final int userId = 108; final long gkPwHandle = 4444L; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))); // run checkNewCredentialFromActivityResult() - final boolean ret = mAutoCredentialViewModel.checkNewCredentialFromActivityResult(true, + final boolean ret = mViewModel.checkNewCredentialFromActivityResult(true, new ActivityResult(ChooseLockPattern.RESULT_FINISHED, null)); assertThat(ret).isFalse(); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckNewCredentialFromActivityResult_nullDataConfirmLock() { final int userId = 109; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newInvalidChallengeCredentialIntentExtras(userId))); // run checkNewCredentialFromActivityResult() - final boolean ret = mAutoCredentialViewModel.checkNewCredentialFromActivityResult(false, + final boolean ret = mViewModel.checkNewCredentialFromActivityResult(false, new ActivityResult(Activity.RESULT_OK, null)); assertThat(ret).isFalse(); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); } @Test public void testCheckNewCredentialFromActivityResult_validChooseLock() { final int userId = 108; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newInvalidChallengeCredentialIntentExtras(userId))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_SOMETHING); @@ -390,20 +386,17 @@ public class AutoCredentialViewModelTest { .thenReturn(newGoodCredential(gkPwHandle, new byte[] { 1 })); // Run checkNewCredentialFromActivityResult() - final Intent intent = new Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, - gkPwHandle); - final boolean ret = mAutoCredentialViewModel.checkNewCredentialFromActivityResult(true, + final Intent intent = new Intent().putExtra(EXTRA_KEY_GK_PW_HANDLE, gkPwHandle); + final boolean ret = mViewModel.checkNewCredentialFromActivityResult(true, new ActivityResult(ChooseLockPattern.RESULT_FINISHED, intent)); assertThat(ret).isTrue(); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); - final Bundle extras = mAutoCredentialViewModel.getCredentialIntentExtra(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); + final Bundle extras = mViewModel.createCredentialIntentExtra(); assertThat(extras.getInt(EXTRA_KEY_SENSOR_ID)).isEqualTo(newSensorId); assertThat(extras.getLong(EXTRA_KEY_CHALLENGE)).isEqualTo(newChallenge); - assertThat(CredentialModel.isValidToken(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN))) - .isTrue(); - assertThat(CredentialModel.isValidGkPwHandle(extras.getLong(EXTRA_KEY_GK_PW_HANDLE))) - .isFalse(); + assertThat(isValidToken(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN))).isTrue(); + assertThat(isValidGkPwHandle(extras.getLong(EXTRA_KEY_GK_PW_HANDLE))).isFalse(); assertThat(mChallengeGenerator.mCallbackRunCount).isEqualTo(1); } @@ -411,7 +404,7 @@ public class AutoCredentialViewModelTest { @Test public void testCheckNewCredentialFromActivityResult_validConfirmLock() { final int userId = 109; - mAutoCredentialViewModel.setCredentialModel(null, + mViewModel.setCredentialModel(null, new Intent().putExtras(newInvalidChallengeCredentialIntentExtras(userId))); when(mLockPatternUtils.getActivePasswordQuality(userId)).thenReturn( PASSWORD_QUALITY_SOMETHING); @@ -424,20 +417,17 @@ public class AutoCredentialViewModelTest { .thenReturn(newGoodCredential(gkPwHandle, new byte[] { 1 })); // Run checkNewCredentialFromActivityResult() - final Intent intent = new Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, - gkPwHandle); - final boolean ret = mAutoCredentialViewModel.checkNewCredentialFromActivityResult(false, + final Intent intent = new Intent().putExtra(EXTRA_KEY_GK_PW_HANDLE, gkPwHandle); + final boolean ret = mViewModel.checkNewCredentialFromActivityResult(false, new ActivityResult(Activity.RESULT_OK, intent)); assertThat(ret).isTrue(); - assertThat(mAutoCredentialViewModel.getGenerateChallengeFailLiveData().getValue()).isNull(); - final Bundle extras = mAutoCredentialViewModel.getCredentialIntentExtra(); + assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); + final Bundle extras = mViewModel.createCredentialIntentExtra(); assertThat(extras.getInt(EXTRA_KEY_SENSOR_ID)).isEqualTo(newSensorId); assertThat(extras.getLong(EXTRA_KEY_CHALLENGE)).isEqualTo(newChallenge); - assertThat(CredentialModel.isValidToken(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN))) - .isTrue(); - assertThat(CredentialModel.isValidGkPwHandle(extras.getLong(EXTRA_KEY_GK_PW_HANDLE))) - .isFalse(); + assertThat(isValidToken(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN))).isTrue(); + assertThat(isValidGkPwHandle(extras.getLong(EXTRA_KEY_GK_PW_HANDLE))).isFalse(); assertThat(mChallengeGenerator.mCallbackRunCount).isEqualTo(1); } diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.java index 921f1822809..a9536cffcbf 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.java @@ -215,11 +215,13 @@ public class FingerprintEnrollIntroViewModelTest { @Test public void testSetHasScrolledToBottom() { - mViewModel.setHasScrolledToBottom(); - + mViewModel.setHasScrolledToBottom(true); FingerprintEnrollIntroStatus status = mViewModel.getPageStatusLiveData().getValue(); - assertThat(status.hasScrollToBottom()).isEqualTo(true); + + mViewModel.setHasScrolledToBottom(false); + status = mViewModel.getPageStatusLiveData().getValue(); + assertThat(status.hasScrollToBottom()).isEqualTo(false); } @Test