diff --git a/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java b/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java index ac4727d81e4..0c4337539aa 100644 --- a/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java +++ b/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java @@ -29,6 +29,7 @@ import androidx.lifecycle.viewmodel.CreationExtras; import com.android.internal.widget.LockPatternUtils; import com.android.settings.biometrics.fingerprint.FingerprintUpdater; import com.android.settings.biometrics2.data.repository.FingerprintRepository; +import com.android.settings.biometrics2.ui.model.EnrollmentRequest; import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel; import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.ChallengeGenerator; import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel; @@ -47,8 +48,11 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory { private static final String TAG = "BiometricsViewModelFact"; - public static final CreationExtras.Key CHALLENGE_GENERATOR = - new CreationExtras.Key() {}; + public static final CreationExtras.Key CHALLENGE_GENERATOR_KEY = + new CreationExtras.Key<>() {}; + public static final CreationExtras.Key ENROLLMENT_REQUEST_KEY = + new CreationExtras.Key<>() {}; + public static final CreationExtras.Key USER_ID_KEY = new CreationExtras.Key<>() {}; @NonNull @Override @@ -68,7 +72,7 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory { if (modelClass.isAssignableFrom(AutoCredentialViewModel.class)) { final LockPatternUtils lockPatternUtils = featureFactory.getSecurityFeatureProvider().getLockPatternUtils(application); - final ChallengeGenerator challengeGenerator = extras.get(CHALLENGE_GENERATOR); + final ChallengeGenerator challengeGenerator = extras.get(CHALLENGE_GENERATOR_KEY); if (challengeGenerator != null) { return (T) new AutoCredentialViewModel(application, lockPatternUtils, challengeGenerator); @@ -79,21 +83,31 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory { } else if (modelClass.isAssignableFrom(DeviceRotationViewModel.class)) { return (T) new DeviceRotationViewModel(application); } else if (modelClass.isAssignableFrom(FingerprintEnrollFindSensorViewModel.class)) { - return (T) new FingerprintEnrollFindSensorViewModel(application); + final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY); + if (request != null) { + return (T) new FingerprintEnrollFindSensorViewModel(application, request.isSuw()); + } } else if (modelClass.isAssignableFrom(FingerprintEnrollIntroViewModel.class)) { final FingerprintRepository repository = provider.getFingerprintRepository(application); - if (repository != null) { - return (T) new FingerprintEnrollIntroViewModel(application, repository); + final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY); + final Integer userId = extras.get(USER_ID_KEY); + if (repository != null && request != null && userId != null) { + return (T) new FingerprintEnrollIntroViewModel(application, repository, request, + userId); } } else if (modelClass.isAssignableFrom(FingerprintEnrollmentViewModel.class)) { final FingerprintRepository repository = provider.getFingerprintRepository(application); - if (repository != null) { + final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY); + if (repository != null && request != null) { return (T) new FingerprintEnrollmentViewModel(application, repository, - application.getSystemService(KeyguardManager.class)); + application.getSystemService(KeyguardManager.class), request); } } else if (modelClass.isAssignableFrom(FingerprintEnrollProgressViewModel.class)) { - return (T) new FingerprintEnrollProgressViewModel(application, - new FingerprintUpdater(application)); + final Integer userId = extras.get(USER_ID_KEY); + if (userId != null) { + return (T) new FingerprintEnrollProgressViewModel(application, + new FingerprintUpdater(application), userId); + } } return create(modelClass); } diff --git a/src/com/android/settings/biometrics2/ui/model/CredentialModel.java b/src/com/android/settings/biometrics2/ui/model/CredentialModel.java index 8f2f45b8831..a6e8b6e7173 100644 --- a/src/com/android/settings/biometrics2/ui/model/CredentialModel.java +++ b/src/com/android/settings/biometrics2/ui/model/CredentialModel.java @@ -82,7 +82,10 @@ public final class CredentialModel { @Nullable private Long mClearGkPwHandleMillis = null; - public CredentialModel(@NonNull Bundle bundle, @NonNull Clock clock) { + public CredentialModel(@Nullable Bundle bundle, @NonNull Clock clock) { + if (bundle == null) { + bundle = new Bundle(); + } mUserId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId()); mSensorId = bundle.getInt(EXTRA_KEY_SENSOR_ID, INVALID_SENSOR_ID); mChallenge = bundle.getLong(EXTRA_KEY_CHALLENGE, INVALID_CHALLENGE); diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.java index f6e06f9d938..4299c3f4b9b 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.java @@ -163,7 +163,7 @@ public class FingerprintEnrollIntroFragment extends Fragment { mIconShield.setVisibility(View.GONE); } mSecondaryFooterButton.setText(context, - mViewModel.getEnrollmentRequest().isAfterSuwOrSuwSuggestedAction() + mViewModel.getRequest().isAfterSuwOrSuwSuggestedAction() ? R.string.security_settings_fingerprint_enroll_introduction_cancel : R.string.security_settings_fingerprint_enroll_introduction_no_thanks); @@ -209,16 +209,9 @@ public class FingerprintEnrollIntroFragment extends Fragment { public void onAttach(@NonNull Context context) { mViewModel = new ViewModelProvider(getActivity()) .get(FingerprintEnrollIntroViewModel.class); - getLifecycle().addObserver(mViewModel); super.onAttach(context); } - @Override - public void onDetach() { - getLifecycle().removeObserver(mViewModel); - super.onDetach(); - } - @NonNull private PorterDuffColorFilter getIconColorFilter(@NonNull Context context) { if (mIconColorFilter == null) { diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java index 366b7acef18..dddd641e7cd 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java @@ -19,7 +19,9 @@ package com.android.settings.biometrics2.ui.view; import static androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; import static androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY; -import static com.android.settings.biometrics2.factory.BiometricsViewModelFactory.CHALLENGE_GENERATOR; +import static com.android.settings.biometrics2.factory.BiometricsViewModelFactory.CHALLENGE_GENERATOR_KEY; +import static com.android.settings.biometrics2.factory.BiometricsViewModelFactory.ENROLLMENT_REQUEST_KEY; +import static com.android.settings.biometrics2.factory.BiometricsViewModelFactory.USER_ID_KEY; import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_FAIL_NEED_TO_CHOOSE_LOCK; import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_FAIL_NEED_TO_CONFIRM_LOCK; import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_IS_GENERATING_CHALLENGE; @@ -37,9 +39,11 @@ import android.annotation.StyleRes; import android.app.Application; import android.content.Intent; import android.content.res.ColorStateList; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.os.Bundle; +import android.os.SystemClock; import android.util.Log; import androidx.activity.result.ActivityResult; @@ -63,9 +67,11 @@ import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling; import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollEnrolling; import com.android.settings.biometrics2.data.repository.FingerprintRepository; import com.android.settings.biometrics2.factory.BiometricsViewModelFactory; +import com.android.settings.biometrics2.ui.model.CredentialModel; import com.android.settings.biometrics2.ui.model.EnrollmentRequest; import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel; import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.FingerprintChallengeGenerator; +import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel; @@ -126,7 +132,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { mViewModelProvider = new ViewModelProvider(this); mViewModel = mViewModelProvider.get(FingerprintEnrollmentViewModel.class); - mViewModel.setRequest(new EnrollmentRequest(getIntent(), getApplicationContext())); mViewModel.setSavedInstanceState(savedInstanceState); mAutoCredentialViewModel = mViewModelProvider.get(AutoCredentialViewModel.class); @@ -173,7 +178,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { } // observe LiveData - getLifecycle().addObserver(mViewModel); mViewModel.getSetResultLiveData().observe(this, this::onSetActivityResult); mAutoCredentialViewModel.getGenerateChallengeFailedLiveData().observe(this, @@ -193,9 +197,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { final FingerprintEnrollIntroViewModel introViewModel = mViewModelProvider.get(FingerprintEnrollIntroViewModel.class); - introViewModel.setEnrollmentRequest(mViewModel.getRequest()); - introViewModel.setUserId(mAutoCredentialViewModel.getUserId()); - // Clear ActionLiveData in FragmentViewModel to prevent getting previous action during // recreate, like press 'Agree' then press 'back' in FingerprintEnrollFindSensor activity. introViewModel.clearActionLiveData(); @@ -224,12 +225,10 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { if (initProgressViewModel) { final FingerprintEnrollProgressViewModel progressViewModel = mViewModelProvider.get(FingerprintEnrollProgressViewModel.class); - progressViewModel.setUserId(mAutoCredentialViewModel.getUserId()); progressViewModel.setToken(mAutoCredentialViewModel.getToken()); } final FingerprintEnrollFindSensorViewModel findSensorViewModel = mViewModelProvider.get(FingerprintEnrollFindSensorViewModel.class); - findSensorViewModel.setIsSuw(mViewModel.getRequest().isSuw()); getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .setCustomAnimations(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out, @@ -408,9 +407,19 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { super.getDefaultViewModelCreationExtras().get(APPLICATION_KEY); final MutableCreationExtras ret = new MutableCreationExtras(); ret.set(APPLICATION_KEY, application); + final FingerprintRepository repository = FeatureFactory.getFactory(application) .getBiometricsRepositoryProvider().getFingerprintRepository(application); - ret.set(CHALLENGE_GENERATOR, new FingerprintChallengeGenerator(repository)); + ret.set(CHALLENGE_GENERATOR_KEY, new FingerprintChallengeGenerator(repository)); + + ret.set(ENROLLMENT_REQUEST_KEY, new EnrollmentRequest(getIntent(), + getApplicationContext())); + + Bundle extras = getIntent().getExtras(); + final CredentialModel credentialModel = new CredentialModel(extras, + SystemClock.elapsedRealtimeClock()); + ret.set(USER_ID_KEY, credentialModel.getUserId()); + return ret; } @@ -433,9 +442,9 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { } @Override - protected void onDestroy() { - getLifecycle().removeObserver(mViewModel); - super.onDestroy(); + public void onConfigurationChanged(@NonNull Configuration newConfig) { + mViewModelProvider.get(DeviceFoldedViewModel.class).onConfigurationChanged(newConfig); + super.onConfigurationChanged(newConfig); } @Override diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java index aa20f23dab9..2b7b3b79d6f 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java @@ -201,8 +201,7 @@ public class AutoCredentialViewModel extends AndroidViewModel { } else { bundle = intent.getExtras(); } - mCredentialModel = new CredentialModel(bundle != null ? bundle : new Bundle(), - SystemClock.elapsedRealtimeClock()); + mCredentialModel = new CredentialModel(bundle, SystemClock.elapsedRealtimeClock()); if (DEBUG) { Log.d(TAG, "setCredentialModel " + mCredentialModel + ", savedInstanceState exist:" diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModel.java index 6ea60b149a1..7dc13282d1d 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModel.java @@ -16,6 +16,7 @@ package com.android.settings.biometrics2.ui.viewmodel; +import android.content.res.Configuration; import android.util.Log; import androidx.annotation.NonNull; @@ -51,6 +52,13 @@ public class DeviceFoldedViewModel extends ViewModel { mScreenSizeFoldProvider.registerCallback(mIsFoldedCallback, executor); } + /** + * Calls this method when activity gets configuration change + */ + public void onConfigurationChanged(@NonNull Configuration newConfig) { + mScreenSizeFoldProvider.onConfigurationChange(newConfig); + } + /** * Returns FoldedLiveData */ diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModel.java index c9135fb6f0b..3bed9fb70c8 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModel.java @@ -29,17 +29,25 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import com.android.internal.annotations.VisibleForTesting; + /** * ViewModel explaining the fingerprint sensor location for fingerprint enrollment. */ public class DeviceRotationViewModel extends AndroidViewModel { private static final boolean DEBUG = false; - private static final String TAG = "RotationViewModel"; + private static final String TAG = "DeviceRotationViewModel"; private final DisplayManager mDisplayManager; + private final boolean mIsReverseDefaultRotation; @NonNull private final DisplayInfo mDisplayInfo = new DisplayInfo(); - private final DisplayListener mDisplayListener = new DisplayListener() { + + /** {@link android.hardware.display.DisplayManager} is a final class, set this member visibility + * to 'protected' for testing + */ + @VisibleForTesting + protected final DisplayListener mDisplayListener = new DisplayListener() { @Override public void onDisplayAdded(int displayId) { } @@ -58,29 +66,43 @@ public class DeviceRotationViewModel extends AndroidViewModel { } }; - @NonNull private final MutableLiveData mLiveData = - new MutableLiveData<>(getRotation()); + @NonNull private final MutableLiveData mLiveData = new MutableLiveData<>(); public DeviceRotationViewModel(@NonNull Application application) { super(application); mDisplayManager = application.getSystemService(DisplayManager.class); mDisplayManager.registerDisplayListener(mDisplayListener, application.getMainThreadHandler()); + mIsReverseDefaultRotation = application.getResources().getBoolean( + com.android.internal.R.bool.config_reverseDefaultRotation); } /** - * Returns current rotation + * Returns current rotation. + * + * {@link android.view.Display} is a final class, set this method visibility to "protected" for + * inheriting it in test */ + @VisibleForTesting @Surface.Rotation - private int getRotation() { + protected int getRotation() { getApplication().getDisplay().getDisplayInfo(mDisplayInfo); - return mDisplayInfo.rotation; + if (mIsReverseDefaultRotation) { + return (mDisplayInfo.rotation + 1) % 4; + } else { + return mDisplayInfo.rotation; + } } /** * Returns RotationLiveData */ public LiveData getLiveData() { + if (mLiveData.getValue() == null) { + // Init data here because if we set it through getDisplay().getRotation() or through + // getDisplay().getDisplayInfo() in constructor(), we always get incorrect value. + mLiveData.setValue(getRotation()); + } return mLiveData; } diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModel.java index a871fe120a8..00c67c4ca35 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModel.java @@ -62,18 +62,12 @@ public class FingerprintEnrollFindSensorViewModel extends AndroidViewModel { private final AccessibilityManager mAccessibilityManager; - private boolean mIsSuw = false; + private final boolean mIsSuw; @NonNull private final MutableLiveData mActionLiveData = new MutableLiveData<>(); - public FingerprintEnrollFindSensorViewModel(@NonNull Application application) { + public FingerprintEnrollFindSensorViewModel(@NonNull Application application, boolean isSuw) { super(application); mAccessibilityManager = application.getSystemService(AccessibilityManager.class); - } - - /** - * Sets isSetupWizard or not - */ - public void setIsSuw(boolean isSuw) { mIsSuw = isSuw; } diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.java index 228ea19a8d4..a9ca7b447e7 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.java @@ -22,13 +22,10 @@ import static com.android.settings.biometrics2.ui.model.FingerprintEnrollIntroSt import android.annotation.IntDef; import android.app.Application; -import android.os.UserHandle; import android.util.Log; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; -import androidx.lifecycle.DefaultLifecycleObserver; -import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; import androidx.lifecycle.MediatorLiveData; import androidx.lifecycle.MutableLiveData; @@ -43,8 +40,7 @@ import java.lang.annotation.RetentionPolicy; /** * Fingerprint intro onboarding page view model implementation */ -public class FingerprintEnrollIntroViewModel extends AndroidViewModel - implements DefaultLifecycleObserver { +public class FingerprintEnrollIntroViewModel extends AndroidViewModel { private static final String TAG = "FingerprintEnrollIntroViewModel"; private static final boolean HAS_SCROLLED_TO_BOTTOM_DEFAULT = false; @@ -82,13 +78,16 @@ public class FingerprintEnrollIntroViewModel extends AndroidViewModel private final MediatorLiveData mPageStatusLiveData = new MediatorLiveData<>(); private final MutableLiveData mActionLiveData = new MutableLiveData<>(); - private int mUserId = UserHandle.myUserId(); - private EnrollmentRequest mEnrollmentRequest = null; + private final int mUserId; + @NonNull private final EnrollmentRequest mRequest; public FingerprintEnrollIntroViewModel(@NonNull Application application, - @NonNull FingerprintRepository fingerprintRepository) { + @NonNull FingerprintRepository fingerprintRepository, + @NonNull EnrollmentRequest request, int userId) { super(application); mFingerprintRepository = fingerprintRepository; + mRequest = request; + mUserId = userId; mPageStatusLiveData.addSource( mEnrollableStatusLiveData, @@ -108,27 +107,21 @@ public class FingerprintEnrollIntroViewModel extends AndroidViewModel enrollableValue != null ? enrollableValue : ENROLLABLE_STATUS_DEFAULT); mPageStatusLiveData.setValue(status); }); - } - public void setUserId(int userId) { - mUserId = userId; - } - - public void setEnrollmentRequest(@NonNull EnrollmentRequest enrollmentRequest) { - mEnrollmentRequest = enrollmentRequest; + updateEnrollableStatus(); } /** * Get enrollment request */ - public EnrollmentRequest getEnrollmentRequest() { - return mEnrollmentRequest; + public EnrollmentRequest getRequest() { + return mRequest; } private void updateEnrollableStatus() { final int num = mFingerprintRepository.getNumOfEnrolledFingerprintsSize(mUserId); final int max = - mEnrollmentRequest.isSuw() && !mEnrollmentRequest.isAfterSuwOrSuwSuggestedAction() + mRequest.isSuw() && !mRequest.isAfterSuwOrSuwSuggestedAction() ? mFingerprintRepository.getMaxFingerprintsInSuw(getApplication().getResources()) : mFingerprintRepository.getMaxFingerprints(); mEnrollableStatusLiveData.postValue(num >= max @@ -208,10 +201,4 @@ public class FingerprintEnrollIntroViewModel extends AndroidViewModel public void onSkipOrCancelButtonClick() { mActionLiveData.postValue(FINGERPRINT_ENROLL_INTRO_ACTION_SKIP_OR_CANCEL); } - - @Override - public void onStart(@NonNull LifecycleOwner owner) { - updateEnrollableStatus(); - } - } diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java index 0483c6fd38d..cbc74c04b9b 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java @@ -25,7 +25,6 @@ import android.hardware.fingerprint.FingerprintManager.EnrollReason; import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback; import android.os.CancellationSignal; import android.os.SystemClock; -import android.os.UserHandle; import android.util.Log; import androidx.annotation.NonNull; @@ -58,7 +57,7 @@ public class FingerprintEnrollProgressViewModel extends AndroidViewModel { new MutableLiveData<>(); private byte[] mToken = null; - private int mUserId = UserHandle.myUserId(); + private final int mUserId; private final FingerprintUpdater mFingerprintUpdater; private final MessageDisplayController mMessageDisplayController; @@ -90,9 +89,11 @@ public class FingerprintEnrollProgressViewModel extends AndroidViewModel { }; public FingerprintEnrollProgressViewModel(@NonNull Application application, - @NonNull FingerprintUpdater fingerprintUpdater) { + @NonNull FingerprintUpdater fingerprintUpdater, int userId) { super(application); mFingerprintUpdater = fingerprintUpdater; + mUserId = userId; + final Resources res = application.getResources(); mMessageDisplayController = res.getBoolean(R.bool.enrollment_message_display_controller_flag) @@ -112,10 +113,6 @@ public class FingerprintEnrollProgressViewModel extends AndroidViewModel { mToken = token; } - public void setUserId(int userId) { - mUserId = userId; - } - /** * clear progress */ diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java index 30ed2032edd..110ca278a9d 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java @@ -33,7 +33,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.AndroidViewModel; -import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; @@ -47,8 +46,7 @@ import java.util.concurrent.atomic.AtomicBoolean; /** * Fingerprint enrollment view model implementation */ -public class FingerprintEnrollmentViewModel extends AndroidViewModel implements - DefaultLifecycleObserver { +public class FingerprintEnrollmentViewModel extends AndroidViewModel { private static final String TAG = "FingerprintEnrollmentViewModel"; @@ -60,32 +58,23 @@ public class FingerprintEnrollmentViewModel extends AndroidViewModel implements private final AtomicBoolean mIsWaitingActivityResult = new AtomicBoolean(false); private final MutableLiveData mSetResultLiveData = new MutableLiveData<>(); - - /** - * Even this variable may be nullable, but activity will call setIntent() immediately during - * its onCreate(), we do not assign @Nullable for this variable here. - */ - private EnrollmentRequest mRequest = null; + @NonNull private final EnrollmentRequest mRequest; public FingerprintEnrollmentViewModel( @NonNull Application application, @NonNull FingerprintRepository fingerprintRepository, - @Nullable KeyguardManager keyguardManager) { + @Nullable KeyguardManager keyguardManager, + @NonNull EnrollmentRequest request) { super(application); mFingerprintRepository = fingerprintRepository; mKeyguardManager = keyguardManager; - } - - /** - * Set EnrollmentRequest - */ - public void setRequest(@NonNull EnrollmentRequest request) { mRequest = request; } /** * Get EnrollmentRequest */ + @NonNull public EnrollmentRequest getRequest() { return mRequest; } diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/model/CredentialModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/model/CredentialModelTest.java index 183543093da..57b74205c5a 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/model/CredentialModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/model/CredentialModelTest.java @@ -29,6 +29,7 @@ import android.annotation.NonNull; import android.content.Intent; import android.os.Bundle; import android.os.SystemClock; +import android.os.UserHandle; import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -145,7 +146,14 @@ public class CredentialModelTest { } @Test - public void sameValueFromBundle() { + public void testNullBundle() { + final CredentialModel credentialModel = new CredentialModel(null, mClock); + + assertThat(credentialModel.getUserId()).isEqualTo(UserHandle.myUserId()); + } + + @Test + public void testSameValueFromBundle() { final Bundle bundle = newCredentialModelIntentExtras(1234, 6677L, 1, new byte[] { 33, 44, 55 }, 987654321); @@ -156,7 +164,7 @@ public class CredentialModelTest { } @Test - public void sameValueFromBundle_nullToken() { + public void testSameValueFromBundle_nullToken() { final Bundle bundle = newCredentialModelIntentExtras(22, 33L, 1, null, 21L); final CredentialModel model1 = new CredentialModel(bundle, mClock); diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModelTest.java new file mode 100644 index 00000000000..c4ee18e07e2 --- /dev/null +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModelTest.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.biometrics2.ui.viewmodel; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.Application; +import android.content.res.Configuration; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.settings.testutils.InstantTaskExecutorRule; +import com.android.systemui.unfold.compat.ScreenSizeFoldProvider; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class DeviceFoldedViewModelTest { + + @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule(); + + private DeviceFoldedViewModel mViewModel; + + @Before + public void setUp() { + final Application application = ApplicationProvider.getApplicationContext(); + mViewModel = new DeviceFoldedViewModel(new ScreenSizeFoldProvider(application), + application.getMainExecutor()); + } + + @Test + public void testLiveData() { + final Configuration config1 = new Configuration(); + config1.smallestScreenWidthDp = 601; + mViewModel.onConfigurationChanged(config1); + assertThat(mViewModel.getLiveData().getValue()).isFalse(); + + final Configuration config2 = new Configuration(); + config2.smallestScreenWidthDp = 599; + mViewModel.onConfigurationChanged(config2); + assertThat(mViewModel.getLiveData().getValue()).isTrue(); + } +} diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModelTest.java new file mode 100644 index 00000000000..0b7c53c6b0a --- /dev/null +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModelTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.biometrics2.ui.viewmodel; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.Application; +import android.view.Surface; + +import androidx.annotation.NonNull; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.settings.testutils.InstantTaskExecutorRule; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +@RunWith(AndroidJUnit4.class) +public class DeviceRotationViewModelTest { + + @Rule public final MockitoRule mockito = MockitoJUnit.rule(); + @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule(); + + private TestDeviceRotationViewModel mViewModel; + + @Before + public void setUp() { + TestDeviceRotationViewModel.sTestRotation = 3; + mViewModel = new TestDeviceRotationViewModel(ApplicationProvider.getApplicationContext()); + } + + @Test + public void testDefaultLiveDataNotNull() { + assertThat(mViewModel.getLiveData().getValue()).isEqualTo(mViewModel.sTestRotation); + } + + @Test + public void testOnDisplayChange() { + mViewModel.sTestRotation = 3; + mViewModel.triggerOnDisplayChanged(); + assertThat(mViewModel.getLiveData().getValue()).isEqualTo(mViewModel.sTestRotation); + } + + public static class TestDeviceRotationViewModel extends DeviceRotationViewModel { + + @Surface.Rotation static int sTestRotation = 0; + + public TestDeviceRotationViewModel(@NonNull Application application) { + super(application); + } + + void triggerOnDisplayChanged() { + mDisplayListener.onDisplayChanged(0); + } + + @Override + protected int getRotation() { + return sTestRotation; + } + } +} diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModelTest.java new file mode 100644 index 00000000000..43df08dcfaa --- /dev/null +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModelTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.biometrics2.ui.viewmodel; + +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.Application; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.settings.testutils.InstantTaskExecutorRule; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class FingerprintEnrollFindSensorViewModelTest { + + @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule(); + + private Application mApplication; + + @Before + public void setUp() { + mApplication = ApplicationProvider.getApplicationContext(); + } + + @Test + public void testClickStartButton() { + final FingerprintEnrollFindSensorViewModel viewModel = + new FingerprintEnrollFindSensorViewModel(mApplication, false); + + viewModel.onStartButtonClick(); + assertThat(viewModel.getActionLiveData().getValue()).isEqualTo( + FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START); + } + + @Test + public void testClickSkipButton() { + final FingerprintEnrollFindSensorViewModel viewModel = + new FingerprintEnrollFindSensorViewModel(mApplication, false); + + viewModel.onSkipButtonClick(); + assertThat(viewModel.getActionLiveData().getValue()).isEqualTo( + FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP); + } + + @Test + public void testClickSkipButtonInSuw() { + final FingerprintEnrollFindSensorViewModel viewModel = + new FingerprintEnrollFindSensorViewModel(mApplication, true); + + viewModel.onSkipButtonClick(); + assertThat(viewModel.getActionLiveData().getValue()).isEqualTo( + FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG); + } + + @Test + public void testClickSkipDialogButton() { + final FingerprintEnrollFindSensorViewModel viewModel = + new FingerprintEnrollFindSensorViewModel(mApplication, true); + + viewModel.onSkipDialogButtonClick(); + assertThat(viewModel.getActionLiveData().getValue()).isEqualTo( + FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP); + } + + @Test + public void testClearActionLiveData() { + final FingerprintEnrollFindSensorViewModel viewModel = + new FingerprintEnrollFindSensorViewModel(mApplication, false); + + viewModel.onStartButtonClick(); + assertThat(viewModel.getActionLiveData().getValue()).isNotNull(); + + viewModel.clearActionLiveData(); + assertThat(viewModel.getActionLiveData().getValue()).isNull(); + } +} 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 06f8924da5b..fbcbb16c62c 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 @@ -22,7 +22,6 @@ import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFP import static com.android.settings.biometrics2.ui.model.FingerprintEnrollIntroStatus.FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX; import static com.android.settings.biometrics2.ui.model.FingerprintEnrollIntroStatus.FINGERPRINT_ENROLLABLE_OK; -import static com.android.settings.biometrics2.ui.model.FingerprintEnrollIntroStatus.FINGERPRINT_ENROLLABLE_UNKNOWN; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel.FINGERPRINT_ENROLL_INTRO_ACTION_CONTINUE_ENROLL; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel.FINGERPRINT_ENROLL_INTRO_ACTION_DONE_AND_FINISH; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel.FINGERPRINT_ENROLL_INTRO_ACTION_SKIP_OR_CANCEL; @@ -45,7 +44,6 @@ import android.content.res.Resources; import android.hardware.fingerprint.FingerprintManager; import androidx.annotation.NonNull; -import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.MutableLiveData; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -66,19 +64,22 @@ import org.mockito.junit.MockitoRule; @RunWith(AndroidJUnit4.class) public class FingerprintEnrollIntroViewModelTest { + private static final int TEST_USER_ID = 33; + @Rule public final MockitoRule mockito = MockitoJUnit.rule(); @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule(); @Mock private Resources mResources; - @Mock private LifecycleOwner mLifecycleOwner; @Mock private FingerprintManager mFingerprintManager; private Application mApplication; private FingerprintEnrollIntroViewModel newFingerprintEnrollIntroViewModel( - @NonNull FingerprintRepository fingerprintRepository) { + @NonNull FingerprintRepository fingerprintRepository, + @NonNull EnrollmentRequest enrollmentRequest) { final FingerprintEnrollIntroViewModel viewModel = - new FingerprintEnrollIntroViewModel(mApplication, fingerprintRepository); + new FingerprintEnrollIntroViewModel(mApplication, fingerprintRepository, + enrollmentRequest, TEST_USER_ID); // MediatorLiveData won't update itself unless observed viewModel.getPageStatusLiveData().observeForever(event -> {}); return viewModel; @@ -92,16 +93,18 @@ public class FingerprintEnrollIntroViewModelTest { @Test public void testPageStatusLiveDataDefaultValue() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newAllFalseRequest(mApplication)); final FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue(); assertThat(status.hasScrollToBottom()).isFalse(); - assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_UNKNOWN); + assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_OK); } @Test public void testClearActionLiveData() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newAllFalseRequest(mApplication)); final MutableLiveData actionLiveData = (MutableLiveData) viewModel.getActionLiveData(); @@ -116,40 +119,32 @@ public class FingerprintEnrollIntroViewModelTest { @Test public void testGetEnrollmentRequest() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); - final EnrollmentRequest request = newAllFalseRequest(mApplication); + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newAllFalseRequest(mApplication)); - viewModel.setEnrollmentRequest(request); - - assertThat(viewModel.getEnrollmentRequest()).isEqualTo(request); + assertThat(viewModel.getRequest()).isNotNull(); } @Test public void testOnStartToUpdateEnrollableStatusOk_isSuw() { - final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); - final int userId = 44; - viewModel.setUserId(userId); - viewModel.setEnrollmentRequest(newIsSuwRequest(mApplication)); - setupFingerprintEnrolledFingerprints(mFingerprintManager, userId, 0); + setupFingerprintEnrolledFingerprints(mFingerprintManager, TEST_USER_ID, 0); setupSuwMaxFingerprintsEnrollable(mApplication, mResources, 1); - viewModel.onStart(mLifecycleOwner); + final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newIsSuwRequest(mApplication)); final FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue(); assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_OK); } @Test public void testOnStartToUpdateEnrollableStatusReachMax_isSuw() { - final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); - final int userId = 44; - viewModel.setUserId(userId); - viewModel.setEnrollmentRequest(newIsSuwRequest(mApplication)); - setupFingerprintEnrolledFingerprints(mFingerprintManager, userId, 1); + setupFingerprintEnrolledFingerprints(mFingerprintManager, TEST_USER_ID, 1); setupSuwMaxFingerprintsEnrollable(mApplication, mResources, 1); - viewModel.onStart(mLifecycleOwner); + final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newIsSuwRequest(mApplication)); final FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue(); assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX); } @@ -196,27 +191,21 @@ public class FingerprintEnrollIntroViewModelTest { } private void testOnStartToUpdateEnrollableStatusOk(@NonNull EnrollmentRequest request) { - final int userId = 45; - final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); - viewModel.setUserId(userId); - viewModel.setEnrollmentRequest(request); - setupFingerprintEnrolledFingerprints(mFingerprintManager, userId, 0); + setupFingerprintEnrolledFingerprints(mFingerprintManager, TEST_USER_ID, 0); - viewModel.onStart(mLifecycleOwner); + final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + request); FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue(); assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_OK); } private void testOnStartToUpdateEnrollableStatusReachMax(@NonNull EnrollmentRequest request) { - final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); - final int userId = 45; - viewModel.setUserId(userId); - viewModel.setEnrollmentRequest(request); - setupFingerprintEnrolledFingerprints(mFingerprintManager, userId, 5); + setupFingerprintEnrolledFingerprints(mFingerprintManager, TEST_USER_ID, 5); - viewModel.onStart(mLifecycleOwner); + final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + request); FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue(); assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX); } @@ -224,7 +213,8 @@ public class FingerprintEnrollIntroViewModelTest { @Test public void textCanAssumeUdfps_forUdfpsUltrasonicSensor() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_ULTRASONIC, 5)); + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_ULTRASONIC, 5), + newAllFalseRequest(mApplication)); assertThat(viewModel.canAssumeUdfps()).isEqualTo(true); } @@ -232,7 +222,8 @@ public class FingerprintEnrollIntroViewModelTest { @Test public void textCanAssumeUdfps_forRearSensor() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_REAR, 5)); + newFingerprintRepository(mFingerprintManager, TYPE_REAR, 5), + newAllFalseRequest(mApplication)); assertThat(viewModel.canAssumeUdfps()).isEqualTo(false); } @@ -243,8 +234,9 @@ public class FingerprintEnrollIntroViewModelTest { // FingerprintRepository.isParentalConsentRequired() calls static method inside, we can't // mock static method final FingerprintRepository fingerprintRepository = mock(FingerprintRepository.class); - final FingerprintEnrollIntroViewModel viewModel = - new FingerprintEnrollIntroViewModel(mApplication, fingerprintRepository); + final FingerprintEnrollIntroViewModel viewModel = new FingerprintEnrollIntroViewModel( + mApplication, fingerprintRepository, newAllFalseRequest(mApplication), + TEST_USER_ID); when(fingerprintRepository.isParentalConsentRequired(mApplication)).thenReturn(true); assertThat(viewModel.isParentalConsentRequired()).isEqualTo(true); @@ -259,23 +251,22 @@ public class FingerprintEnrollIntroViewModelTest { // FingerprintRepository.isDisabledByAdmin() calls static method inside, we can't mock // static method final FingerprintRepository fingerprintRepository = mock(FingerprintRepository.class); - final FingerprintEnrollIntroViewModel viewModel = - new FingerprintEnrollIntroViewModel(mApplication, fingerprintRepository); + final FingerprintEnrollIntroViewModel viewModel = new FingerprintEnrollIntroViewModel( + mApplication, fingerprintRepository, newAllFalseRequest(mApplication), + TEST_USER_ID); - final int userId = 33; - viewModel.setUserId(userId); - - when(fingerprintRepository.isDisabledByAdmin(mApplication, userId)).thenReturn(true); + when(fingerprintRepository.isDisabledByAdmin(mApplication, TEST_USER_ID)).thenReturn(true); assertThat(viewModel.isBiometricUnlockDisabledByAdmin()).isEqualTo(true); - when(fingerprintRepository.isDisabledByAdmin(mApplication, userId)).thenReturn(false); + when(fingerprintRepository.isDisabledByAdmin(mApplication, TEST_USER_ID)).thenReturn(false); assertThat(viewModel.isBiometricUnlockDisabledByAdmin()).isEqualTo(false); } @Test public void testSetHasScrolledToBottom() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newAllFalseRequest(mApplication)); viewModel.setHasScrolledToBottom(true); FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue(); @@ -288,17 +279,13 @@ public class FingerprintEnrollIntroViewModelTest { @Test public void testOnNextButtonClick_enrollNext() { - final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); - final int userId = 46; - viewModel.setUserId(userId); - viewModel.setEnrollmentRequest(newIsSuwRequest(mApplication)); - // Set latest status to FINGERPRINT_ENROLLABLE_OK - setupFingerprintEnrolledFingerprints(mFingerprintManager, userId, 0); + setupFingerprintEnrolledFingerprints(mFingerprintManager, TEST_USER_ID, 0); setupSuwMaxFingerprintsEnrollable(mApplication, mResources, 1); - viewModel.onStart(mLifecycleOwner); + final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newIsSuwRequest(mApplication)); FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue(); assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_OK); @@ -311,17 +298,13 @@ public class FingerprintEnrollIntroViewModelTest { @Test public void testOnNextButtonClick_doneAndFinish() { - final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); - final int userId = 46; - viewModel.setUserId(userId); - viewModel.setEnrollmentRequest(newIsSuwRequest(mApplication)); - // Set latest status to FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX - setupFingerprintEnrolledFingerprints(mFingerprintManager, userId, 1); + setupFingerprintEnrolledFingerprints(mFingerprintManager, TEST_USER_ID, 1); setupSuwMaxFingerprintsEnrollable(mApplication, mResources, 1); - viewModel.onStart(mLifecycleOwner); + final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newIsSuwRequest(mApplication)); FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue(); assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX); @@ -335,7 +318,8 @@ public class FingerprintEnrollIntroViewModelTest { @Test public void testOnSkipOrCancelButtonClick() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( - newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5)); + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5), + newAllFalseRequest(mApplication)); viewModel.onSkipOrCancelButtonClick(); diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java index 16f7ff6e1af..9e3a6e6fc31 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java @@ -56,6 +56,8 @@ import org.mockito.junit.MockitoRule; @RunWith(AndroidJUnit4.class) public class FingerprintEnrollProgressViewModelTest { + private static final int TEST_USER_ID = 334; + @Rule public final MockitoRule mockito = MockitoJUnit.rule(); @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule(); @@ -70,23 +72,22 @@ public class FingerprintEnrollProgressViewModelTest { when(mApplication.getResources()).thenReturn(mResources); when(mResources.getBoolean(R.bool.enrollment_message_display_controller_flag)) .thenReturn(false); - mViewModel = new FingerprintEnrollProgressViewModel(mApplication, mFingerprintUpdater); + mViewModel = new FingerprintEnrollProgressViewModel(mApplication, mFingerprintUpdater, + TEST_USER_ID); } @Test public void testStartEnrollment() { @EnrollReason final int enrollReason = ENROLL_FIND_SENSOR; - final int userId = 334; final byte[] token = new byte[] { 1, 2, 3 }; mViewModel.setToken(token); - mViewModel.setUserId(userId); // Start enrollment final boolean ret = mViewModel.startEnrollment(enrollReason); assertThat(ret).isTrue(); verify(mFingerprintUpdater, only()).enroll(eq(token), any(CancellationSignal.class), - eq(userId), any(EnrollmentCallback.class), eq(enrollReason)); + eq(TEST_USER_ID), any(EnrollmentCallback.class), eq(enrollReason)); } @Test @@ -102,17 +103,15 @@ public class FingerprintEnrollProgressViewModelTest { @Test public void testCancelEnrollment() { @EnrollReason final int enrollReason = ENROLL_ENROLL; - final int userId = 334; final byte[] token = new byte[] { 1, 2, 3 }; mViewModel.setToken(token); - mViewModel.setUserId(userId); final TestWrapper signalWrapper = new TestWrapper<>(); doAnswer(invocation -> { signalWrapper.mValue = invocation.getArgument(1); return null; }).when(mFingerprintUpdater).enroll(any(byte[].class), any(CancellationSignal.class), - eq(userId), any(EnrollmentCallback.class), anyInt()); + eq(TEST_USER_ID), any(EnrollmentCallback.class), anyInt()); // Start enrollment final boolean ret = mViewModel.startEnrollment(enrollReason); @@ -128,17 +127,15 @@ public class FingerprintEnrollProgressViewModelTest { @Test public void testProgressUpdate() { @EnrollReason final int enrollReason = ENROLL_ENROLL; - final int userId = 334; final byte[] token = new byte[] { 1, 2, 3 }; mViewModel.setToken(token); - mViewModel.setUserId(userId); final TestWrapper callbackWrapper = new TestWrapper<>(); doAnswer(invocation -> { callbackWrapper.mValue = invocation.getArgument(3); return null; }).when(mFingerprintUpdater).enroll(any(byte[].class), any(CancellationSignal.class), - eq(userId), any(EnrollmentCallback.class), anyInt()); + eq(TEST_USER_ID), any(EnrollmentCallback.class), anyInt()); // Start enrollment final boolean ret = mViewModel.startEnrollment(enrollReason); diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.java index 3ab864f22d3..04295318b23 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.java @@ -40,7 +40,6 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.biometrics2.data.repository.FingerprintRepository; -import com.android.settings.biometrics2.ui.model.EnrollmentRequest; import com.android.settings.password.SetupSkipDialog; import com.android.settings.testutils.InstantTaskExecutorRule; @@ -70,28 +69,21 @@ public class FingerprintEnrollmentViewModelTest { mApplication = ApplicationProvider.getApplicationContext(); mFingerprintRepository = new FingerprintRepository(mFingerprintManager); mViewModel = new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository, - mKeyguardManager); + mKeyguardManager, newAllFalseRequest(mApplication)); } @Test public void testGetRequest() { - when(mKeyguardManager.isKeyguardSecure()).thenReturn(true); - assertThat(mViewModel.getRequest()).isNull(); - - final EnrollmentRequest request = newAllFalseRequest(mApplication); - mViewModel.setRequest(request); - assertThat(mViewModel.getRequest()).isEqualTo(request); + assertThat(mViewModel.getRequest()).isNotNull(); } @Test public void testGetNextActivityBaseIntentExtras() { - mViewModel.setRequest(newAllFalseRequest(mApplication)); assertThat(mViewModel.getNextActivityBaseIntentExtras()).isNotNull(); } @Test public void testOnContinueEnrollActivityResult_shouldRelaySkip1Result() { - mViewModel.setRequest(newAllFalseRequest(mApplication)); final ActivityResult result = new ActivityResult(RESULT_SKIP, null); // Run onContinueEnrollActivityResult @@ -102,7 +94,6 @@ public class FingerprintEnrollmentViewModelTest { @Test public void testOnContinueEnrollActivityResult_shouldRelaySkip2Result() { - mViewModel.setRequest(newAllFalseRequest(mApplication)); final ActivityResult result = new ActivityResult(SetupSkipDialog.RESULT_SKIP, null); // Run onContinueEnrollActivityResult @@ -113,7 +104,6 @@ public class FingerprintEnrollmentViewModelTest { @Test public void testOnContinueEnrollActivityResult_shouldRelayNullDataTimeoutResult() { - mViewModel.setRequest(newAllFalseRequest(mApplication)); final ActivityResult result = new ActivityResult(RESULT_TIMEOUT, null); // Run onContinueEnrollActivityResult @@ -127,7 +117,6 @@ public class FingerprintEnrollmentViewModelTest { @Test public void testOnContinueEnrollActivityResult_shouldRelayWithDataTimeoutResult() { - mViewModel.setRequest(newAllFalseRequest(mApplication)); final Intent intent = new Intent("testAction"); intent.putExtra("testKey", "testValue"); final ActivityResult result = new ActivityResult(RESULT_TIMEOUT, intent); @@ -143,7 +132,6 @@ public class FingerprintEnrollmentViewModelTest { @Test public void testOnContinueEnrollActivityResult_shouldRelayNullDataFinishResult() { - mViewModel.setRequest(newAllFalseRequest(mApplication)); final ActivityResult result = new ActivityResult(RESULT_FINISHED, null); // Run onContinueEnrollActivityResult @@ -157,7 +145,6 @@ public class FingerprintEnrollmentViewModelTest { @Test public void testOnContinueEnrollActivityResult_shouldRelayWithDataFinishResult() { - mViewModel.setRequest(newAllFalseRequest(mApplication)); final Intent intent = new Intent("testAction"); intent.putExtra("testKey", "testValue"); final ActivityResult result = new ActivityResult(RESULT_FINISHED, intent); @@ -173,11 +160,12 @@ public class FingerprintEnrollmentViewModelTest { @Test public void testOnContinueEnrollActivityResult_shouldRelayNullDataFinishResultAsNewData() { + mViewModel = new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository, + mKeyguardManager, newIsSuwRequest(mApplication)); when(mKeyguardManager.isKeyguardSecure()).thenReturn(true); final int userId = 111; final int numOfFp = 4; setupFingerprintEnrolledFingerprints(mFingerprintManager, userId, numOfFp); - mViewModel.setRequest(newIsSuwRequest(mApplication)); final ActivityResult result = new ActivityResult(RESULT_FINISHED, null); // Run onContinueEnrollActivityResult @@ -194,11 +182,12 @@ public class FingerprintEnrollmentViewModelTest { @Test public void testOnContinueEnrollActivityResult_shouldRelayWithDataFinishResultAsNewData() { + mViewModel = new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository, + mKeyguardManager, newIsSuwRequest(mApplication)); when(mKeyguardManager.isKeyguardSecure()).thenReturn(true); final int userId = 20; final int numOfFp = 9; setupFingerprintEnrolledFingerprints(mFingerprintManager, userId, numOfFp); - mViewModel.setRequest(newIsSuwRequest(mApplication)); final String action = "testAction"; final String key = "testKey"; final String value = "testValue";