[BiometricsV2] Refine fingerprint ui and flow
1. Fix "No thanks" become 2 lines, and fix the status when new
fingerprint enrolled.
2. Fix Finish page shows again after pressing back from a new Finish
page
3. Fix FindSensor page shows again after max number of fingerprint
has reached.
4. Add missing tests, and remove some bypass-only tests
Bug: 279134177
Bug: 279380583
Bug: 279386539
Bug: 279394069
Test: atest FingerprintEnrollIntroViewModelTest
FingerprintEnrollFindSensorViewModelTest
FingerprintEnrollEnrollingViewModelTest
FingerprintEnrollmentViewModelTest FingerprintEnrollmentActivityTest
Test: manually test 1, 2, and 3
Change-Id: I3797ceed8e7d6c10a4b4711f8bff8d7f222f0923
This commit is contained in:
@@ -16,9 +16,7 @@
|
||||
|
||||
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_SHOW_ICON_TOUCH_DIALOG;
|
||||
@@ -151,26 +149,6 @@ public class FingerprintEnrollEnrollingViewModelTest {
|
||||
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<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
|
||||
|
||||
@@ -18,6 +18,7 @@ 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;
|
||||
|
||||
@@ -70,6 +71,13 @@ public class FingerprintEnrollFindSensorViewModelTest {
|
||||
FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClickStartDialogButton() {
|
||||
mViewModel.onStartButtonClick();
|
||||
assertThat(mViewModel.getActionLiveData().getValue()).isEqualTo(
|
||||
FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClearActionLiveData() {
|
||||
assertThat(mViewModel.getActionLiveData().getValue()).isNull();
|
||||
|
||||
@@ -16,9 +16,7 @@
|
||||
|
||||
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.model.FingerprintEnrollIntroStatus.FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX;
|
||||
import static com.android.settings.biometrics2.ui.model.FingerprintEnrollIntroStatus.FINGERPRINT_ENROLLABLE_OK;
|
||||
@@ -100,6 +98,25 @@ public class FingerprintEnrollIntroViewModelTest {
|
||||
assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPageStatusLiveDataRefreshWhenRefetch() {
|
||||
final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
|
||||
TYPE_UDFPS_OPTICAL, 1);
|
||||
final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel(
|
||||
repository,
|
||||
newAllFalseRequest(mApplication));
|
||||
FingerprintEnrollIntroStatus status = viewModel.getPageStatusLiveData().getValue();
|
||||
assertThat(status.hasScrollToBottom()).isFalse();
|
||||
assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_OK);
|
||||
|
||||
setupFingerprintEnrolledFingerprints(mFingerprintManager, TEST_USER_ID, 1);
|
||||
|
||||
// Refetch PageStatusLiveData
|
||||
status = viewModel.getPageStatusLiveData().getValue();
|
||||
assertThat(status.hasScrollToBottom()).isFalse();
|
||||
assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClearActionLiveData() {
|
||||
final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel(
|
||||
@@ -210,24 +227,6 @@ public class FingerprintEnrollIntroViewModelTest {
|
||||
assertThat(status.getEnrollableStatus()).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanAssumeUdfps_forUdfpsUltrasonicSensor() {
|
||||
final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel(
|
||||
newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_ULTRASONIC, 5),
|
||||
newAllFalseRequest(mApplication));
|
||||
|
||||
assertThat(viewModel.canAssumeUdfps()).isEqualTo(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanAssumeUdfps_forRearSensor() {
|
||||
final FingerprintEnrollIntroViewModel viewModel = newFingerprintEnrollIntroViewModel(
|
||||
newFingerprintRepository(mFingerprintManager, TYPE_REAR, 5),
|
||||
newAllFalseRequest(mApplication));
|
||||
|
||||
assertThat(viewModel.canAssumeUdfps()).isEqualTo(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsParentalConsentRequired() {
|
||||
// We shall not mock FingerprintRepository, but
|
||||
|
||||
@@ -16,16 +16,22 @@
|
||||
|
||||
package com.android.settings.biometrics2.ui.viewmodel;
|
||||
|
||||
import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
|
||||
|
||||
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel.SAVED_STATE_IS_NEW_FINGERPRINT_ADDED;
|
||||
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel.SAVED_STATE_IS_WAITING_ACTIVITY_RESULT;
|
||||
import static com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newAllFalseRequest;
|
||||
import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository;
|
||||
import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.Intent;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.activity.result.ActivityResult;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
@@ -55,7 +61,8 @@ public class FingerprintEnrollmentViewModelTest {
|
||||
@Before
|
||||
public void setUp() {
|
||||
mApplication = ApplicationProvider.getApplicationContext();
|
||||
mFingerprintRepository = new FingerprintRepository(mFingerprintManager);
|
||||
mFingerprintRepository = newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL,
|
||||
5);
|
||||
mViewModel = new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository,
|
||||
newAllFalseRequest(mApplication));
|
||||
}
|
||||
@@ -124,4 +131,130 @@ public class FingerprintEnrollmentViewModelTest {
|
||||
mViewModel.onSaveInstanceState(bundle);
|
||||
assertThat(bundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOverrideActivityResult_shallKeepNullIntent_woChallengeExtra() {
|
||||
final ActivityResult retResult = mViewModel.getOverrideActivityResult(
|
||||
new ActivityResult(22, null), null);
|
||||
|
||||
assertThat(retResult).isNotNull();
|
||||
assertThat(retResult.getData()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOverrideActivityResult_shallKeepNullIntent_noIntent_woChallengeExtra() {
|
||||
final Intent intent = new Intent();
|
||||
|
||||
final ActivityResult retResult = mViewModel.getOverrideActivityResult(
|
||||
new ActivityResult(33, intent), null);
|
||||
|
||||
assertThat(retResult).isNotNull();
|
||||
assertThat(retResult.getData()).isEqualTo(intent);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOverrideActivityResult_shallKeepNull_woAdded_woIntent_withChallenge() {
|
||||
final Bundle extra = new Bundle();
|
||||
extra.putString("test1", "test123");
|
||||
|
||||
final ActivityResult retResult = mViewModel.getOverrideActivityResult(
|
||||
new ActivityResult(33, null), extra);
|
||||
|
||||
assertThat(retResult).isNotNull();
|
||||
assertThat(retResult.getData()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOverrideActivityResult_shallCreateNew_woIntent_withChallenge() {
|
||||
final String key1 = "test1";
|
||||
final String key2 = "test2";
|
||||
final Bundle extra = new Bundle();
|
||||
extra.putString(key1, "test123");
|
||||
extra.putInt(key2, 9999);
|
||||
|
||||
mViewModel.setIsNewFingerprintAdded();
|
||||
final ActivityResult retResult = mViewModel.getOverrideActivityResult(
|
||||
new ActivityResult(33, null), extra);
|
||||
|
||||
assertThat(retResult).isNotNull();
|
||||
final Intent retIntent = retResult.getData();
|
||||
assertThat(retIntent).isNotNull();
|
||||
final Bundle retExtra = retIntent.getExtras();
|
||||
assertThat(retExtra).isNotNull();
|
||||
assertThat(retExtra.getSize()).isEqualTo(extra.getSize());
|
||||
assertThat(retExtra.getString(key1)).isEqualTo(extra.getString(key1));
|
||||
assertThat(retExtra.getInt(key2)).isEqualTo(extra.getInt(key2));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOverrideActivityResult_shallNotMerge_nonAdded_woIntent_withChallenge() {
|
||||
final Bundle extra = new Bundle();
|
||||
extra.putString("test2", "test123");
|
||||
|
||||
final Intent intent = new Intent();
|
||||
final String key2 = "test2";
|
||||
intent.putExtra(key2, 3456L);
|
||||
|
||||
final ActivityResult retResult = mViewModel.getOverrideActivityResult(
|
||||
new ActivityResult(33, intent), extra);
|
||||
|
||||
assertThat(retResult).isNotNull();
|
||||
final Intent retIntent = retResult.getData();
|
||||
assertThat(retIntent).isNotNull();
|
||||
final Bundle retExtra = retIntent.getExtras();
|
||||
assertThat(retExtra).isNotNull();
|
||||
assertThat(retExtra.getSize()).isEqualTo(intent.getExtras().getSize());
|
||||
assertThat(retExtra.getString(key2)).isEqualTo(intent.getExtras().getString(key2));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOverrideActivityResult_shallMerge_added_woIntent_withChallenge() {
|
||||
final String key1 = "test1";
|
||||
final String key2 = "test2";
|
||||
final Bundle extra = new Bundle();
|
||||
extra.putString(key1, "test123");
|
||||
extra.putInt(key2, 9999);
|
||||
|
||||
final Intent intent = new Intent();
|
||||
final String key3 = "test3";
|
||||
intent.putExtra(key3, 3456L);
|
||||
|
||||
mViewModel.setIsNewFingerprintAdded();
|
||||
final ActivityResult retResult = mViewModel.getOverrideActivityResult(
|
||||
new ActivityResult(33, intent), extra);
|
||||
|
||||
assertThat(retResult).isNotNull();
|
||||
final Intent retIntent = retResult.getData();
|
||||
assertThat(retIntent).isNotNull();
|
||||
final Bundle retExtra = retIntent.getExtras();
|
||||
assertThat(retExtra).isNotNull();
|
||||
assertThat(retExtra.getSize()).isEqualTo(extra.getSize() + intent.getExtras().getSize());
|
||||
assertThat(retExtra.getString(key1)).isEqualTo(extra.getString(key1));
|
||||
assertThat(retExtra.getInt(key2)).isEqualTo(extra.getInt(key2));
|
||||
assertThat(retExtra.getLong(key3)).isEqualTo(intent.getExtras().getLong(key3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsMaxEnrolledReached() {
|
||||
final int uid = 100;
|
||||
mFingerprintRepository = newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL,
|
||||
3);
|
||||
mViewModel = new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository,
|
||||
newAllFalseRequest(mApplication));
|
||||
|
||||
setupFingerprintEnrolledFingerprints(mFingerprintManager, uid, 0);
|
||||
assertThat(mViewModel.isMaxEnrolledReached(uid)).isFalse();
|
||||
|
||||
setupFingerprintEnrolledFingerprints(mFingerprintManager, uid, 1);
|
||||
assertThat(mViewModel.isMaxEnrolledReached(uid)).isFalse();
|
||||
|
||||
setupFingerprintEnrolledFingerprints(mFingerprintManager, uid, 2);
|
||||
assertThat(mViewModel.isMaxEnrolledReached(uid)).isFalse();
|
||||
|
||||
setupFingerprintEnrolledFingerprints(mFingerprintManager, uid, 3);
|
||||
assertThat(mViewModel.isMaxEnrolledReached(uid)).isTrue();
|
||||
|
||||
setupFingerprintEnrolledFingerprints(mFingerprintManager, uid, 4);
|
||||
assertThat(mViewModel.isMaxEnrolledReached(uid)).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user