diff --git a/src/com/android/settings/biometrics2/data/repository/AccessibilityRepository.java b/src/com/android/settings/biometrics2/data/repository/AccessibilityRepository.java deleted file mode 100644 index 20d7f1fc70f..00000000000 --- a/src/com/android/settings/biometrics2/data/repository/AccessibilityRepository.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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.data.repository; - -import android.view.View; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityManager; - -import androidx.annotation.NonNull; - -/** - * This repository is used to call all APIs in {@link AccessibilityManager} - */ -public class AccessibilityRepository { - - private final AccessibilityManager mAccessibilityManager; - - public AccessibilityRepository(AccessibilityManager accessibilityManager) { - mAccessibilityManager = accessibilityManager; - } - - /** - * Requests interruption of the accessibility feedback from all accessibility services. - */ - public void interrupt() { - mAccessibilityManager.interrupt(); - } - - /** - * Returns if the {@link AccessibilityManager} is enabled. - * - * @return True if this {@link AccessibilityManager} is enabled, false otherwise. - */ - public boolean isEnabled() { - return mAccessibilityManager.isEnabled(); - } - - /** - * Sends an {@link AccessibilityEvent}. - * - * @param event The event to send. - * - * @throws IllegalStateException if accessibility is not enabled. - * - * Note: The preferred mechanism for sending custom accessibility - * events is through calling - * {@link android.view.ViewParent#requestSendAccessibilityEvent(View, AccessibilityEvent)} - * instead of this method to allow predecessors to augment/filter events sent by - * their descendants. - */ - public void sendAccessibilityEvent(@NonNull AccessibilityEvent event) { - mAccessibilityManager.sendAccessibilityEvent(event); - } - - /** - * Returns if the touch exploration in the system is enabled. - * - * @return True if touch exploration is enabled, false otherwise. - */ - public boolean isTouchExplorationEnabled() { - return mAccessibilityManager.isTouchExplorationEnabled(); - } -} diff --git a/src/com/android/settings/biometrics2/data/repository/VibratorRepository.java b/src/com/android/settings/biometrics2/data/repository/VibratorRepository.java deleted file mode 100644 index cccafffe28f..00000000000 --- a/src/com/android/settings/biometrics2/data/repository/VibratorRepository.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.data.repository; - -import android.annotation.NonNull; -import android.os.VibrationAttributes; -import android.os.VibrationEffect; -import android.os.Vibrator; - -/** - * This repository is used to call all APIs in {@link Vibrator} - */ -public class VibratorRepository { - - private final Vibrator mVibrator; - - public VibratorRepository(Vibrator vibrator) { - mVibrator = vibrator; - } - - /** - * Like {@link #vibrate(VibrationEffect, VibrationAttributes)}, but allows the - * caller to specify the vibration is owned by someone else and set a reason for vibration. - */ - public void vibrate(int uid, String opPkg, @NonNull VibrationEffect vibe, - String reason, @NonNull VibrationAttributes attributes) { - mVibrator.vibrate(uid, opPkg, vibe, reason, attributes); - } -} diff --git a/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProvider.java b/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProvider.java index 8e17ba45d97..fdc5745e926 100644 --- a/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProvider.java +++ b/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProvider.java @@ -21,9 +21,7 @@ import android.app.Application; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.settings.biometrics2.data.repository.AccessibilityRepository; import com.android.settings.biometrics2.data.repository.FingerprintRepository; -import com.android.settings.biometrics2.data.repository.VibratorRepository; /** * Interface for BiometricsRepositoryProvider @@ -35,16 +33,4 @@ public interface BiometricsRepositoryProvider { */ @Nullable FingerprintRepository getFingerprintRepository(@NonNull Application application); - - /** - * Get VibtatorRepository - */ - @Nullable - VibratorRepository getVibratorRepository(@NonNull Application application); - - /** - * Get AccessibilityRepository - */ - @Nullable - AccessibilityRepository getAccessibilityRepository(@NonNull Application application); } diff --git a/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProviderImpl.java b/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProviderImpl.java index 7b1fe162a8e..22409c849d7 100644 --- a/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProviderImpl.java +++ b/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProviderImpl.java @@ -18,16 +18,12 @@ package com.android.settings.biometrics2.factory; import android.app.Application; import android.hardware.fingerprint.FingerprintManager; -import android.os.Vibrator; -import android.view.accessibility.AccessibilityManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.settings.Utils; -import com.android.settings.biometrics2.data.repository.AccessibilityRepository; import com.android.settings.biometrics2.data.repository.FingerprintRepository; -import com.android.settings.biometrics2.data.repository.VibratorRepository; /** * Implementation for BiometricsRepositoryProvider @@ -35,8 +31,6 @@ import com.android.settings.biometrics2.data.repository.VibratorRepository; public class BiometricsRepositoryProviderImpl implements BiometricsRepositoryProvider { private static volatile FingerprintRepository sFingerprintRepository; - private static volatile VibratorRepository sVibratorRepository; - private static volatile AccessibilityRepository sAccessibilityRepository; /** * Get FingerprintRepository @@ -58,49 +52,4 @@ public class BiometricsRepositoryProviderImpl implements BiometricsRepositoryPro } return sFingerprintRepository; } - - /** - * Get VibratorRepository - */ - @Nullable - @Override - public VibratorRepository getVibratorRepository(@NonNull Application application) { - - final Vibrator vibrator = application.getSystemService(Vibrator.class); - if (vibrator == null) { - return null; - } - - if (sVibratorRepository == null) { - synchronized (VibratorRepository.class) { - if (sVibratorRepository == null) { - sVibratorRepository = new VibratorRepository(vibrator); - } - } - } - return sVibratorRepository; - } - - /** - * Get AccessibilityRepository - */ - @Nullable - @Override - public AccessibilityRepository getAccessibilityRepository(@NonNull Application application) { - - final AccessibilityManager accessibilityManager = application.getSystemService( - AccessibilityManager.class); - if (accessibilityManager == null) { - return null; - } - - if (sAccessibilityRepository == null) { - synchronized (AccessibilityRepository.class) { - if (sAccessibilityRepository == null) { - sAccessibilityRepository = new AccessibilityRepository(accessibilityManager); - } - } - } - return sAccessibilityRepository; - } } diff --git a/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java b/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java index 970ed0279a2..dd5b6738ab0 100644 --- a/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java +++ b/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java @@ -27,9 +27,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.AccessibilityRepository; import com.android.settings.biometrics2.data.repository.FingerprintRepository; -import com.android.settings.biometrics2.data.repository.VibratorRepository; 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; @@ -115,12 +113,9 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory { final Integer userId = extras.get(USER_ID_KEY); final FingerprintRepository fingerprint = provider.getFingerprintRepository( application); - final AccessibilityRepository accessibility = provider.getAccessibilityRepository( - application); - final VibratorRepository vibrator = provider.getVibratorRepository(application); - if (fingerprint != null && accessibility != null && vibrator != null) { - return (T) new FingerprintEnrollEnrollingViewModel(application, userId, fingerprint, - accessibility, vibrator); + if (fingerprint != null) { + return (T) new FingerprintEnrollEnrollingViewModel(application, userId, + fingerprint); } } else if (modelClass.isAssignableFrom(FingerprintEnrollFinishViewModel.class)) { final Integer userId = extras.get(USER_ID_KEY); diff --git a/src/com/android/settings/biometrics2/ui/model/CredentialModel.java b/src/com/android/settings/biometrics2/ui/model/CredentialModel.java index a6e8b6e7173..caff80a8e2a 100644 --- a/src/com/android/settings/biometrics2/ui/model/CredentialModel.java +++ b/src/com/android/settings/biometrics2/ui/model/CredentialModel.java @@ -17,7 +17,6 @@ package com.android.settings.biometrics2.ui.model; import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_CHALLENGE; -import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_SENSOR_ID; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE; @@ -34,10 +33,9 @@ import java.time.Clock; /** * Secret credential data including * 1. userId - * 2. sensorId - * 3. challenge - * 4. token - * 5. gkPwHandle + * 2. challenge + * 3. token + * 4. gkPwHandle */ public final class CredentialModel { @@ -53,22 +51,12 @@ public final class CredentialModel { @VisibleForTesting public static final long INVALID_GK_PW_HANDLE = 0L; - /** - * Default value for a invalid sensor id - */ - @VisibleForTesting - public static final int INVALID_SENSOR_ID = -1; - private final Clock mClock; private final long mInitMillis; private final int mUserId; - private int mSensorId; - @Nullable - private Long mUpdateSensorIdMillis = null; - private long mChallenge; @Nullable private Long mUpdateChallengeMillis = null; @@ -87,7 +75,6 @@ public final class CredentialModel { 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); mToken = bundle.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN); mGkPwHandle = bundle.getLong(EXTRA_KEY_GK_PW_HANDLE, INVALID_GK_PW_HANDLE); @@ -102,7 +89,6 @@ public final class CredentialModel { public Bundle getBundle() { final Bundle bundle = new Bundle(); bundle.putInt(Intent.EXTRA_USER_ID, mUserId); - bundle.putInt(EXTRA_KEY_SENSOR_ID, mSensorId); bundle.putLong(EXTRA_KEY_CHALLENGE, mChallenge); bundle.putByteArray(EXTRA_KEY_CHALLENGE_TOKEN, mToken); bundle.putLong(EXTRA_KEY_GK_PW_HANDLE, mGkPwHandle); @@ -190,21 +176,6 @@ public final class CredentialModel { return mGkPwHandle != INVALID_GK_PW_HANDLE; } - /** - * Get sensor id - */ - public int getSensorId() { - return mSensorId; - } - - /** - * Set sensor id - */ - public void setSensorId(int value) { - mUpdateSensorIdMillis = mClock.millis(); - mSensorId = value; - } - /** * Returns a string representation of the object */ @@ -221,7 +192,6 @@ public final class CredentialModel { + ", updateMillis:" + mUpdateTokenMillis + "}" + ", gkPwHandle:{len:" + gkPwHandleLen + ", isValid:" + isValidGkPwHandle() + ", clearMillis:" + mClearGkPwHandleMillis + "}" - + ", mSensorId:{id:" + mSensorId + ", updateMillis:" + mUpdateSensorIdMillis + "}" + " }"; } } diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java index 8e022e0c091..8a4ed633222 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java @@ -418,7 +418,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { private void showIconTouchDialog() { mIconTouchCount = 0; - mEnrollingViewModel.onIconTouchDialogShow(); + mEnrollingViewModel.showIconTouchDialog(); } private final Runnable mShowDialogRunnable = () -> showIconTouchDialog(); diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java index ab772e3771b..720857c32b0 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java @@ -540,8 +540,7 @@ public class FingerprintEnrollEnrollingSfpsFragment extends Fragment { private void showIconTouchDialog() { mIconTouchCount = 0; - //TODO EnrollingActivity should observe live data and add dialog fragment - mEnrollingViewModel.onIconTouchDialogShow(); + mEnrollingViewModel.showIconTouchDialog(); } private final Runnable mShowDialogRunnable = () -> showIconTouchDialog(); diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java index ff43e8bea30..7f69b91d9e8 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java @@ -30,8 +30,8 @@ import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnr import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG; -import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingAction; @@ -503,7 +503,7 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { startFinishFragment(); break; } - case FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP: { + case FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP: { onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_SKIP, null)); break; } diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java index 2b7b3b79d6f..7e48f82136d 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.java @@ -19,9 +19,7 @@ package com.android.settings.biometrics2.ui.viewmodel; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_CHALLENGE; -import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_SENSOR_ID; import static com.android.settings.biometrics2.ui.model.CredentialModel.INVALID_GK_PW_HANDLE; -import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE; import android.annotation.IntDef; @@ -268,7 +266,6 @@ public class AutoCredentialViewModel extends AndroidViewModel { mChallengeGenerator.setCallback((sensorId, userId, challenge) -> { try { final byte[] newToken = requestGatekeeperHat(gkPwHandle, challenge, userId); - mCredentialModel.setSensorId(sensorId); mCredentialModel.setChallenge(challenge); mCredentialModel.setToken(newToken); } catch (IllegalStateException e) { @@ -354,26 +351,6 @@ public class AutoCredentialViewModel extends AndroidViewModel { return response.getGatekeeperHAT(); } - /** - * Get Credential intent extra which will be used to launch next activity. - */ - @NonNull - public Bundle createCredentialIntentExtra() { - final Bundle retBundle = new Bundle(); - if (mCredentialModel.isValidGkPwHandle()) { - retBundle.putLong(EXTRA_KEY_GK_PW_HANDLE, mCredentialModel.getGkPwHandle()); - } - if (mCredentialModel.isValidToken()) { - retBundle.putByteArray(EXTRA_KEY_CHALLENGE_TOKEN, mCredentialModel.getToken()); - } - if (mCredentialModel.isValidUserId()) { - retBundle.putInt(Intent.EXTRA_USER_ID, mCredentialModel.getUserId()); - } - retBundle.putLong(EXTRA_KEY_CHALLENGE, mCredentialModel.getChallenge()); - retBundle.putInt(EXTRA_KEY_SENSOR_ID, mCredentialModel.getSensorId()); - return retBundle; - } - /** * Create Intent for choosing lock */ diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java index 194bc1e2ed9..025c58bca95 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java @@ -21,6 +21,7 @@ import android.app.Application; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.VibrationAttributes; import android.os.VibrationEffect; +import android.os.Vibrator; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; @@ -31,9 +32,7 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import com.android.settings.biometrics2.data.repository.AccessibilityRepository; import com.android.settings.biometrics2.data.repository.FingerprintRepository; -import com.android.settings.biometrics2.data.repository.VibratorRepository; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -51,25 +50,25 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { private static final VibrationAttributes FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES = VibrationAttributes.createForUsage(VibrationAttributes.USAGE_ACCESSIBILITY); - /** - * Enrolling skipped - */ - public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP = 0; - /** * Enrolling finished */ - public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE = 1; + public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE = 0; /** * Icon touch dialog show */ - public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG = 2; + public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG = 1; /** * Icon touch dialog dismiss */ - public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG = 3; + public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG = 2; + + /** + * Has got latest cancelled event due to user skip + */ + public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP = 3; /** * Has got latest cancelled event due to back key @@ -77,10 +76,10 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED = 4; @IntDef(prefix = { "FINGERPRINT_ENROLL_ENROLLING_ACTION_" }, value = { - FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP, FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE, FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG, FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG, + FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP, FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED }) @Retention(RetentionPolicy.SOURCE) @@ -112,25 +111,22 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { private final int mUserId; private boolean mOnBackPressed; private boolean mOnSkipPressed; - private final FingerprintRepository mFingerprintRepository; - private final AccessibilityRepository mAccessibilityRepository; - private final VibratorRepository mVibratorRepository; + @NonNull private final FingerprintRepository mFingerprintRepository; + private final AccessibilityManager mAccessibilityManager; + private final Vibrator mVibrator; private final MutableLiveData mActionLiveData = new MutableLiveData<>(); private final MutableLiveData mIconTouchDialogLiveData = new MutableLiveData<>(); private final MutableLiveData mErrorDialogLiveData = new MutableLiveData<>(); private final MutableLiveData mErrorDialogActionLiveData = new MutableLiveData<>(); - public FingerprintEnrollEnrollingViewModel(Application application, - int userId, - FingerprintRepository fingerprintRepository, - AccessibilityRepository accessibilityRepository, - VibratorRepository vibratorRepository) { + public FingerprintEnrollEnrollingViewModel(@NonNull Application application, + int userId, @NonNull FingerprintRepository fingerprintRepository) { super(application); mUserId = userId; mFingerprintRepository = fingerprintRepository; - mAccessibilityRepository = accessibilityRepository; - mVibratorRepository = vibratorRepository; + mAccessibilityManager = application.getSystemService(AccessibilityManager.class); + mVibrator = application.getSystemService(Vibrator.class); } /** @@ -184,7 +180,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { * Enrolling is cacelled because user clicks skip */ public void onCancelledDueToOnSkipPressed() { - final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP; + final int action = FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP; if (DEBUG) { Log.d(TAG, "onSkipButtonClick, post action " + action); } @@ -229,12 +225,12 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { /** * Icon touch dialog show */ - public void onIconTouchDialogShow() { + public void showIconTouchDialog() { final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG; if (DEBUG) { Log.d(TAG, "onIconTouchDialogShow, post action " + action); } - mIconTouchDialogLiveData.postValue(action); + mActionLiveData.postValue(action); } /** @@ -245,7 +241,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { if (DEBUG) { Log.d(TAG, "onIconTouchDialogDismiss, post action " + action); } - mIconTouchDialogLiveData.postValue(action); + mActionLiveData.postValue(action); } /** @@ -266,7 +262,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { * Requests interruption of the accessibility feedback from all accessibility services. */ public void clearTalkback() { - mAccessibilityRepository.interrupt(); + mAccessibilityManager.interrupt(); } /** @@ -275,7 +271,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { * @return True if this {@link AccessibilityManager} is enabled, false otherwise. */ public boolean isAccessibilityEnabled() { - return mAccessibilityRepository.isEnabled(); + return mAccessibilityManager.isEnabled(); } /** @@ -287,7 +283,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { e.setClassName(getClass().getName()); e.setPackageName(getApplication().getPackageName()); e.getText().add(announcement); - mAccessibilityRepository.sendAccessibilityEvent(e); + mAccessibilityManager.sendAccessibilityEvent(e); } /** @@ -296,7 +292,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { * @return True if touch exploration is enabled, false otherwise. */ public boolean isTouchExplorationEnabled() { - return mAccessibilityRepository.isTouchExplorationEnabled(); + return mAccessibilityManager.isTouchExplorationEnabled(); } /** @@ -304,7 +300,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { * caller to specify the vibration is owned by someone else and set a reason for vibration. */ public void vibrateError(String reason) { - mVibratorRepository.vibrate(mUserId, getApplication().getOpPackageName(), + mVibrator.vibrate(mUserId, getApplication().getOpPackageName(), VIBRATE_EFFECT_ERROR, reason, FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES); } diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java index 4f07ae6bacd..3c779c95104 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java @@ -179,10 +179,6 @@ public class FingerprintEnrollmentViewModel extends AndroidViewModel { return mFingerprintRepository.canAssumeSfps(); } - public boolean isNewFingerprintAdded() { - return mIsNewFingerprintAdded; - } - /** * Sets mIsNewFingerprintAdded to true */ diff --git a/tests/unit/src/com/android/settings/biometrics2/repository/FingerprintRepositoryTest.java b/tests/unit/src/com/android/settings/biometrics2/repository/FingerprintRepositoryTest.java index 727559b55eb..89895955f58 100644 --- a/tests/unit/src/com/android/settings/biometrics2/repository/FingerprintRepositoryTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/repository/FingerprintRepositoryTest.java @@ -29,9 +29,16 @@ import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils. import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; + import android.content.Context; import android.content.res.Resources; +import android.hardware.biometrics.SensorProperties; import android.hardware.fingerprint.FingerprintManager; +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; +import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -46,6 +53,8 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; +import java.util.ArrayList; + @RunWith(AndroidJUnit4.class) public class FingerprintRepositoryTest { @@ -139,4 +148,56 @@ public class FingerprintRepositoryTest { assertThat(repository.getMaxFingerprintsInSuw(mResources)).isEqualTo(20); } + @Test + public void testGetFirstFingerprintSensorPropertiesInternal() { + final ArrayList props = new ArrayList<>(); + final FingerprintSensorPropertiesInternal prop = new FingerprintSensorPropertiesInternal( + 0 /* sensorId */, + SensorProperties.STRENGTH_STRONG, + 5, + new ArrayList<>() /* componentInfo */, + TYPE_UDFPS_OPTICAL, + true /* resetLockoutRequiresHardwareAuthToken */); + props.add(prop); + doAnswer(invocation -> { + final IFingerprintAuthenticatorsRegisteredCallback callback = + invocation.getArgument(0); + callback.onAllAuthenticatorsRegistered(props); + return null; + }).when(mFingerprintManager).addAuthenticatorsRegisteredCallback(any()); + + final FingerprintRepository repository = new FingerprintRepository(mFingerprintManager); + assertThat(repository.getFirstFingerprintSensorPropertiesInternal()).isEqualTo(prop); + } + + @Test + public void testGetEnrollStageCount() { + final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager, + TYPE_UNKNOWN, 999); + + final int expectedValue = 24; + doReturn(expectedValue).when(mFingerprintManager).getEnrollStageCount(); + + assertThat(repository.getEnrollStageCount()).isEqualTo(expectedValue); + } + + @Test + public void testGetEnrollStageThreshold() { + final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager, + TYPE_UNKNOWN, 999); + + final float expectedValue0 = 0.42f; + final float expectedValue1 = 0.24f; + final float expectedValue2 = 0.33f; + final float expectedValue3 = 0.90f; + doReturn(expectedValue0).when(mFingerprintManager).getEnrollStageThreshold(0); + doReturn(expectedValue1).when(mFingerprintManager).getEnrollStageThreshold(1); + doReturn(expectedValue2).when(mFingerprintManager).getEnrollStageThreshold(2); + doReturn(expectedValue3).when(mFingerprintManager).getEnrollStageThreshold(3); + + assertThat(repository.getEnrollStageThreshold(2)).isEqualTo(expectedValue2); + assertThat(repository.getEnrollStageThreshold(1)).isEqualTo(expectedValue1); + assertThat(repository.getEnrollStageThreshold(3)).isEqualTo(expectedValue3); + assertThat(repository.getEnrollStageThreshold(0)).isEqualTo(expectedValue0); + } } 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 57b74205c5a..8dfca016093 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 @@ -48,11 +48,10 @@ public class CredentialModelTest { private final Clock mClock = SystemClock.elapsedRealtimeClock(); - public static Bundle newCredentialModelIntentExtras(int userId, long challenge, int sensorId, + public static Bundle newCredentialModelIntentExtras(int userId, long challenge, @Nullable byte[] token, long gkPwHandle) { final Bundle bundle = new Bundle(); bundle.putInt(Intent.EXTRA_USER_ID, userId); - bundle.putInt(EXTRA_KEY_SENSOR_ID, sensorId); bundle.putLong(EXTRA_KEY_CHALLENGE, challenge); bundle.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); bundle.putLong(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, gkPwHandle); @@ -60,17 +59,17 @@ public class CredentialModelTest { } public static Bundle newValidTokenCredentialIntentExtras(int userId) { - return newCredentialModelIntentExtras(userId, 1L, 1, new byte[] { 0, 1, 2 }, + return newCredentialModelIntentExtras(userId, 1L, new byte[] { 0, 1, 2 }, INVALID_GK_PW_HANDLE); } public static Bundle newOnlySensorValidCredentialIntentExtras(int userId) { - return newCredentialModelIntentExtras(userId, INVALID_CHALLENGE, 1, null, + return newCredentialModelIntentExtras(userId, INVALID_CHALLENGE, null, INVALID_GK_PW_HANDLE); } public static Bundle newGkPwHandleCredentialIntentExtras(int userId, long gkPwHandle) { - return newCredentialModelIntentExtras(userId, INVALID_CHALLENGE, 1, null, gkPwHandle); + return newCredentialModelIntentExtras(userId, INVALID_CHALLENGE, null, gkPwHandle); } private static void checkBundleLongValue(@NonNull Bundle bundle1, @NonNull Bundle bundle2, @@ -118,7 +117,6 @@ public class CredentialModelTest { @NonNull CredentialModel model2) { assertThat(model1.getUserId()).isEqualTo(model2.getUserId()); - assertThat(model1.getSensorId()).isEqualTo(model2.getSensorId()); assertThat(model1.getChallenge()).isEqualTo(model2.getChallenge()); assertThat(model1.getGkPwHandle()).isEqualTo(model2.getGkPwHandle()); @@ -154,7 +152,7 @@ public class CredentialModelTest { @Test public void testSameValueFromBundle() { - final Bundle bundle = newCredentialModelIntentExtras(1234, 6677L, 1, + final Bundle bundle = newCredentialModelIntentExtras(1234, 6677L, new byte[] { 33, 44, 55 }, 987654321); final CredentialModel model1 = new CredentialModel(bundle, mClock); @@ -165,7 +163,7 @@ public class CredentialModelTest { @Test public void testSameValueFromBundle_nullToken() { - final Bundle bundle = newCredentialModelIntentExtras(22, 33L, 1, null, 21L); + final Bundle bundle = newCredentialModelIntentExtras(22, 33L, null, 21L); final CredentialModel model1 = new CredentialModel(bundle, mClock); final CredentialModel model2 = new CredentialModel(model1.getBundle(), mClock); 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 c12be68e54d..05a7239e95d 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 @@ -22,10 +22,8 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_CHALLENGE; -import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_SENSOR_ID; 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.CredentialModelTest.newCredentialModelIntentExtras; import static com.android.settings.biometrics2.ui.model.CredentialModelTest.newGkPwHandleCredentialIntentExtras; import static com.android.settings.biometrics2.ui.model.CredentialModelTest.newOnlySensorValidCredentialIntentExtras; @@ -103,7 +101,7 @@ public class AutoCredentialViewModelTest { @Test public void testSetCredentialModel_sameResultFromSavedInstanceOrIntent() { - final Bundle extras = newCredentialModelIntentExtras(12, 33, 1, new byte[] { 2, 3 }, 3L); + final Bundle extras = newCredentialModelIntentExtras(12, 33, new byte[] { 2, 3 }, 3L); AutoCredentialViewModel viewModel2 = new AutoCredentialViewModel( ApplicationProvider.getApplicationContext(), @@ -115,18 +113,9 @@ public class AutoCredentialViewModelTest { mViewModel.onSaveInstanceState(savedInstance); viewModel2.setCredentialModel(savedInstance, new Intent()); - 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)) - .isEqualTo(bundle2.getLong(Intent.EXTRA_USER_ID)); - assertThat(bundle1.getLong(EXTRA_KEY_CHALLENGE)) - .isEqualTo(bundle2.getLong(EXTRA_KEY_CHALLENGE)); - assertThat(bundle1.getInt(EXTRA_KEY_SENSOR_ID)) - .isEqualTo(bundle2.getInt(EXTRA_KEY_SENSOR_ID)); - final byte[] token1 = bundle1.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN); - final byte[] token2 = bundle2.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN); + assertThat(mViewModel.getUserId()).isEqualTo(viewModel2.getUserId()); + final byte[] token1 = mViewModel.getToken(); + final byte[] token2 = viewModel2.getToken(); assertThat(token1).isNotNull(); assertThat(token2).isNotNull(); assertThat(token1.length).isEqualTo(token2.length); @@ -138,7 +127,7 @@ public class AutoCredentialViewModelTest { @Test public void testSetCredentialModel_sameResultFromSavedInstanceOrIntent_invalidValues() { final Bundle extras = newCredentialModelIntentExtras(UserHandle.USER_NULL, - INVALID_CHALLENGE, INVALID_SENSOR_ID, null, INVALID_GK_PW_HANDLE); + INVALID_CHALLENGE, null, INVALID_GK_PW_HANDLE); AutoCredentialViewModel viewModel2 = new AutoCredentialViewModel( ApplicationProvider.getApplicationContext(), @@ -150,16 +139,10 @@ public class AutoCredentialViewModelTest { mViewModel.onSaveInstanceState(savedInstance); viewModel2.setCredentialModel(savedInstance, new Intent()); - 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(); - assertThat(bundle2.containsKey(EXTRA_KEY_CHALLENGE_TOKEN)).isFalse(); - assertThat(bundle1.containsKey(EXTRA_KEY_SENSOR_ID)).isTrue(); - assertThat(bundle2.containsKey(EXTRA_KEY_SENSOR_ID)).isTrue(); - assertThat(bundle1.containsKey(Intent.EXTRA_USER_ID)).isFalse(); - assertThat(bundle2.containsKey(Intent.EXTRA_USER_ID)).isFalse(); + assertThat(mViewModel.getUserId()).isEqualTo(UserHandle.USER_NULL); + assertThat(viewModel2.getUserId()).isEqualTo(UserHandle.USER_NULL); + assertThat(mViewModel.getToken()).isNull(); + assertThat(viewModel2.getToken()).isNull(); } @Test @@ -316,12 +299,7 @@ public class AutoCredentialViewModelTest { assertThat(mViewModel.getGenerateChallengeFailedLiveData().getValue()).isNull(); // Check data inside CredentialModel - final Bundle extras = mViewModel.createCredentialIntentExtra(); - assertThat(extras.getInt(EXTRA_KEY_SENSOR_ID)).isEqualTo(newSensorId); - assertThat(extras.getLong(EXTRA_KEY_CHALLENGE)).isEqualTo(newChallenge); - assertThat(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN)).isNotNull(); - assertThat(extras.getLong(EXTRA_KEY_GK_PW_HANDLE)).isEqualTo(INVALID_GK_PW_HANDLE); - assertThat(extras.getLong(EXTRA_KEY_CHALLENGE)).isNotEqualTo(INVALID_CHALLENGE); + assertThat(mViewModel.getToken()).isNotNull(); assertThat(mChallengeGenerator.mCallbackRunCount).isEqualTo(1); assertThat(hasCalledRemoveGkPwHandle.get()).isFalse(); @@ -534,11 +512,7 @@ public class AutoCredentialViewModelTest { assertThat(ret).isTrue(); 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(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN)).isNotNull(); - assertThat(extras.getLong(EXTRA_KEY_GK_PW_HANDLE)).isEqualTo(INVALID_GK_PW_HANDLE); + assertThat(mViewModel.getToken()).isNotNull(); assertThat(mChallengeGenerator.mCallbackRunCount).isEqualTo(1); assertThat(hasCalledRemoveGkPwHandle.get()).isTrue(); } @@ -571,17 +545,13 @@ public class AutoCredentialViewModelTest { assertThat(ret).isTrue(); 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(extras.getByteArray(EXTRA_KEY_CHALLENGE_TOKEN)).isNotNull(); - assertThat(extras.getLong(EXTRA_KEY_GK_PW_HANDLE)).isEqualTo(INVALID_GK_PW_HANDLE); + assertThat(mViewModel.getToken()).isNotNull(); assertThat(mChallengeGenerator.mCallbackRunCount).isEqualTo(1); assertThat(hasCalledRemoveGkPwHandle.get()).isTrue(); } public static class TestChallengeGenerator implements ChallengeGenerator { - public int mSensorId = INVALID_SENSOR_ID; + public int mSensorId = -1; public int mUserId = UserHandle.myUserId(); public long mChallenge = INVALID_CHALLENGE; public int mCallbackRunCount = 0; diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java new file mode 100644 index 00000000000..4de1057436a --- /dev/null +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java @@ -0,0 +1,231 @@ +/* + * 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 android.hardware.fingerprint.FingerprintSensorProperties.TYPE_REAR; +import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL; +import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC; + +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.ErrorDialogData; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ERROR_DIALOG_ACTION_RESTART; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FingerprintErrorDialogAction; +import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; + +import android.app.Application; +import android.hardware.biometrics.SensorProperties; +import android.hardware.fingerprint.FingerprintManager; +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; +import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback; + +import androidx.lifecycle.LiveData; +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.testutils.InstantTaskExecutorRule; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import java.util.ArrayList; + +@RunWith(AndroidJUnit4.class) +public class FingerprintEnrollEnrollingViewModelTest { + + private static final int TEST_USER_ID = 33; + + @Rule + public final MockitoRule mockito = MockitoJUnit.rule(); + @Rule + public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule(); + + @Mock + private FingerprintManager mFingerprintManager; + + private Application mApplication; + private FingerprintEnrollEnrollingViewModel mViewModel; + + @Before + public void setUp() { + mApplication = ApplicationProvider.getApplicationContext(); + mViewModel = new FingerprintEnrollEnrollingViewModel( + mApplication, + TEST_USER_ID, + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, 5) + ); + } + + @Test + public void testShowErrorDialogLiveData() { + assertThat(mViewModel.getErrorDialogLiveData().getValue()).isEqualTo(null); + + final ErrorDialogData data = new ErrorDialogData("errMsg", "errTitle", 0); + mViewModel.showErrorDialog(data); + assertThat(mViewModel.getErrorDialogLiveData().getValue()).isEqualTo(data); + } + + @Test + public void testIconTouchDialog() { + final LiveData actionLiveData = mViewModel.getActionLiveData(); + assertThat(actionLiveData.getValue()).isEqualTo(null); + + mViewModel.showIconTouchDialog(); + assertThat(actionLiveData.getValue()).isEqualTo( + FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG); + + mViewModel.onIconTouchDialogDismiss(); + assertThat(actionLiveData.getValue()).isEqualTo( + FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG); + } + + @Test + public void testErrorDialogActionLiveData() { + assertThat(mViewModel.getErrorDialogActionLiveData().getValue()).isEqualTo(null); + + @FingerprintErrorDialogAction int action = FINGERPRINT_ERROR_DIALOG_ACTION_RESTART; + mViewModel.onErrorDialogAction(action); + assertThat(mViewModel.getErrorDialogActionLiveData().getValue()).isEqualTo(action); + + action = FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT; + mViewModel.onErrorDialogAction(action); + assertThat(mViewModel.getErrorDialogActionLiveData().getValue()).isEqualTo(action); + + action = FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH; + mViewModel.onErrorDialogAction(action); + assertThat(mViewModel.getErrorDialogActionLiveData().getValue()).isEqualTo(action); + } + + @Test + public void tesBackPressedScenario() { + final LiveData actionLiveData = mViewModel.getActionLiveData(); + assertThat(actionLiveData.getValue()).isEqualTo(null); + assertThat(mViewModel.getOnBackPressed()).isEqualTo(false); + + mViewModel.setOnBackPressed(); + assertThat(mViewModel.getOnBackPressed()).isEqualTo(true); + + mViewModel.onCancelledDueToOnBackPressed(); + assertThat(mViewModel.getOnBackPressed()).isEqualTo(false); + assertThat(actionLiveData.getValue()).isEqualTo( + FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED); + } + + @Test + public void testSkipPressedScenario() { + final LiveData actionLiveData = mViewModel.getActionLiveData(); + assertThat(actionLiveData.getValue()).isEqualTo(null); + assertThat(mViewModel.getOnSkipPressed()).isEqualTo(false); + + mViewModel.setOnSkipPressed(); + assertThat(mViewModel.getOnSkipPressed()).isEqualTo(true); + + mViewModel.onCancelledDueToOnSkipPressed(); + assertThat(mViewModel.getOnSkipPressed()).isEqualTo(false); + assertThat(actionLiveData.getValue()).isEqualTo( + FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP); + } + + @Test + public void testCanAssumeUdfps_forUdfpsUltrasonicSensor() { + mViewModel = new FingerprintEnrollEnrollingViewModel( + mApplication, + TEST_USER_ID, + newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_ULTRASONIC, 5) + ); + assertThat(mViewModel.canAssumeUdfps()).isEqualTo(true); + } + + @Test + public void testCanAssumeUdfps_forRearSensor() { + mViewModel = new FingerprintEnrollEnrollingViewModel( + mApplication, + TEST_USER_ID, + newFingerprintRepository(mFingerprintManager, TYPE_REAR, 5) + ); + assertThat(mViewModel.canAssumeUdfps()).isEqualTo(false); + } + + @Test + public void testGetFirstFingerprintSensorPropertiesInternal() { + final ArrayList props = new ArrayList<>(); + final FingerprintSensorPropertiesInternal prop = new FingerprintSensorPropertiesInternal( + 0 /* sensorId */, + SensorProperties.STRENGTH_STRONG, + 5, + new ArrayList<>() /* componentInfo */, + TYPE_UDFPS_OPTICAL, + true /* resetLockoutRequiresHardwareAuthToken */); + props.add(prop); + doAnswer(invocation -> { + final IFingerprintAuthenticatorsRegisteredCallback callback = + invocation.getArgument(0); + callback.onAllAuthenticatorsRegistered(props); + return null; + }).when(mFingerprintManager).addAuthenticatorsRegisteredCallback(any()); + + mViewModel = new FingerprintEnrollEnrollingViewModel( + mApplication, + TEST_USER_ID, + new FingerprintRepository(mFingerprintManager) + ); + + assertThat(mViewModel.getFirstFingerprintSensorPropertiesInternal()).isEqualTo(prop); + } + + @Test + public void testGetEnrollStageCount() { + final int expectedValue = 24; + doReturn(expectedValue).when(mFingerprintManager).getEnrollStageCount(); + + assertThat(mViewModel.getEnrollStageCount()).isEqualTo(expectedValue); + } + + @Test + public void testGetEnrollStageThreshold() { + final float expectedValue0 = 0.42f; + final float expectedValue1 = 0.24f; + final float expectedValue2 = 0.33f; + final float expectedValue3 = 0.90f; + + doReturn(expectedValue0).when(mFingerprintManager).getEnrollStageThreshold(0); + doReturn(expectedValue1).when(mFingerprintManager).getEnrollStageThreshold(1); + doReturn(expectedValue2).when(mFingerprintManager).getEnrollStageThreshold(2); + doReturn(expectedValue3).when(mFingerprintManager).getEnrollStageThreshold(3); + + assertThat(mViewModel.getEnrollStageThreshold(2)).isEqualTo(expectedValue2); + assertThat(mViewModel.getEnrollStageThreshold(1)).isEqualTo(expectedValue1); + assertThat(mViewModel.getEnrollStageThreshold(3)).isEqualTo(expectedValue3); + assertThat(mViewModel.getEnrollStageThreshold(0)).isEqualTo(expectedValue0); + } +} 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 index 43df08dcfaa..a72175d56e4 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModelTest.java @@ -18,7 +18,6 @@ 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; @@ -40,61 +39,45 @@ public class FingerprintEnrollFindSensorViewModelTest { @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule(); private Application mApplication; + private FingerprintEnrollFindSensorViewModel mViewModel; @Before public void setUp() { mApplication = ApplicationProvider.getApplicationContext(); + mViewModel = new FingerprintEnrollFindSensorViewModel(mApplication, false); } @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( + public void testClickSkipButtonNotInSuw() { + mViewModel = new FingerprintEnrollFindSensorViewModel(mApplication, false); + mViewModel.onSkipButtonClick(); + assertThat(mViewModel.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( + mViewModel = new FingerprintEnrollFindSensorViewModel(mApplication, true); + mViewModel.onSkipButtonClick(); + assertThat(mViewModel.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( + mViewModel.onSkipDialogButtonClick(); + assertThat(mViewModel.getActionLiveData().getValue()).isEqualTo( FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP); } @Test public void testClearActionLiveData() { - final FingerprintEnrollFindSensorViewModel viewModel = - new FingerprintEnrollFindSensorViewModel(mApplication, false); + assertThat(mViewModel.getActionLiveData().getValue()).isNull(); - viewModel.onStartButtonClick(); - assertThat(viewModel.getActionLiveData().getValue()).isNotNull(); + mViewModel.onStartButtonClick(); + assertThat(mViewModel.getActionLiveData().getValue()).isNotNull(); - viewModel.clearActionLiveData(); - assertThat(viewModel.getActionLiveData().getValue()).isNull(); + mViewModel.clearActionLiveData(); + assertThat(mViewModel.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 fbcbb16c62c..41d82267e7e 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 @@ -211,7 +211,7 @@ public class FingerprintEnrollIntroViewModelTest { } @Test - public void textCanAssumeUdfps_forUdfpsUltrasonicSensor() { + public void testCanAssumeUdfps_forUdfpsUltrasonicSensor() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_ULTRASONIC, 5), newAllFalseRequest(mApplication)); @@ -220,7 +220,7 @@ public class FingerprintEnrollIntroViewModelTest { } @Test - public void textCanAssumeUdfps_forRearSensor() { + public void testCanAssumeUdfps_forRearSensor() { final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel( newFingerprintRepository(mFingerprintManager, TYPE_REAR, 5), newAllFalseRequest(mApplication)); 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 2c3fbf03b11..945ce8acbbc 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 @@ -69,27 +69,34 @@ public class FingerprintEnrollmentViewModelTest { public void testSetSavedInstanceState() { // setSavedInstanceState() as false final Bundle bundle = new Bundle(); + final Bundle outBundle = new Bundle(); + + // Set SAVED_STATE_IS_WAITING_ACTIVITY_RESULT to true bundle.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, false); mViewModel.setSavedInstanceState(bundle); assertThat(mViewModel.isWaitingActivityResult().get()).isFalse(); - // setSavedInstanceState() as false + // Set SAVED_STATE_IS_WAITING_ACTIVITY_RESULT to true bundle.clear(); bundle.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, true); mViewModel.setSavedInstanceState(bundle); assertThat(mViewModel.isWaitingActivityResult().get()).isTrue(); - // setSavedInstanceState() as false + // Set SAVED_STATE_IS_NEW_FINGERPRINT_ADDED to false bundle.clear(); bundle.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, false); mViewModel.setSavedInstanceState(bundle); - assertThat(mViewModel.isNewFingerprintAdded()).isFalse(); + outBundle.clear(); + mViewModel.onSaveInstanceState(outBundle); + assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isFalse(); - // setSavedInstanceState() as false + // Set SAVED_STATE_IS_NEW_FINGERPRINT_ADDED to true bundle.clear(); bundle.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, true); mViewModel.setSavedInstanceState(bundle); - assertThat(mViewModel.isNewFingerprintAdded()).isTrue(); + outBundle.clear(); + mViewModel.onSaveInstanceState(outBundle); + assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue(); } @Test