Merge "Attach FingerprintEnrollFinishFragment to activity"

This commit is contained in:
TreeHugger Robot
2023-02-15 05:04:57 +00:00
committed by Android (Google) Code Review
8 changed files with 283 additions and 399 deletions

View File

@@ -47,7 +47,7 @@ public class FingerprintEnrollFinish extends BiometricEnrollBase {
private static final String ACTION_FINGERPRINT_SETTINGS = private static final String ACTION_FINGERPRINT_SETTINGS =
"android.settings.FINGERPRINT_SETTINGS"; "android.settings.FINGERPRINT_SETTINGS";
@VisibleForTesting @VisibleForTesting
static final String FINGERPRINT_SUGGESTION_ACTIVITY = public static final String FINGERPRINT_SUGGESTION_ACTIVITY =
"com.android.settings.SetupFingerprintSuggestionActivity"; "com.android.settings.SetupFingerprintSuggestionActivity";
private FingerprintManager mFingerprintManager; private FingerprintManager mFingerprintManager;

View File

@@ -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.content.ComponentName;
import android.content.pm.PackageManager;
/**
* This repository is used to call all APIs in {@link PackageManager}
*/
public class PackageManagerRepository {
private final PackageManager mPackageManager;
public PackageManagerRepository(PackageManager packageManager) {
mPackageManager = packageManager;
}
/**
* Set the enabled setting for a package component (activity, receiver, service, provider).
* This setting will override any enabled state which may have been set by the component in its
* manifest.
*/
public void setComponentEnabledSetting(@NonNull ComponentName componentName,
@PackageManager.EnabledState int newState, @PackageManager.EnabledFlags int flags) {
mPackageManager.setComponentEnabledSetting(componentName, newState, flags);
}
}

View File

@@ -17,7 +17,6 @@
package com.android.settings.biometrics2.factory; package com.android.settings.biometrics2.factory;
import android.app.Application; import android.app.Application;
import android.app.KeyguardManager;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -38,6 +37,7 @@ import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel;
import com.android.settings.biometrics2.ui.viewmodel.DeviceRotationViewModel; import com.android.settings.biometrics2.ui.viewmodel.DeviceRotationViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel;
@@ -103,8 +103,7 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory {
final FingerprintRepository repository = provider.getFingerprintRepository(application); final FingerprintRepository repository = provider.getFingerprintRepository(application);
final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY); final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
if (repository != null && request != null) { if (repository != null && request != null) {
return (T) new FingerprintEnrollmentViewModel(application, repository, return (T) new FingerprintEnrollmentViewModel(application, repository, request);
application.getSystemService(KeyguardManager.class), request);
} }
} else if (modelClass.isAssignableFrom(FingerprintEnrollProgressViewModel.class)) { } else if (modelClass.isAssignableFrom(FingerprintEnrollProgressViewModel.class)) {
final Integer userId = extras.get(USER_ID_KEY); final Integer userId = extras.get(USER_ID_KEY);
@@ -123,6 +122,15 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory {
return (T) new FingerprintEnrollEnrollingViewModel(application, userId, fingerprint, return (T) new FingerprintEnrollEnrollingViewModel(application, userId, fingerprint,
accessibility, vibrator); accessibility, vibrator);
} }
} else if (modelClass.isAssignableFrom(FingerprintEnrollFinishViewModel.class)) {
final Integer userId = extras.get(USER_ID_KEY);
final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
final FingerprintRepository fingerprint = provider.getFingerprintRepository(
application);
if (fingerprint != null && userId != null) {
return (T) new FingerprintEnrollFinishViewModel(application, userId, request,
fingerprint);
}
} }
return create(modelClass); return create(modelClass);
} }

View File

@@ -26,7 +26,6 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import com.android.settings.R; import com.android.settings.R;
@@ -36,37 +35,23 @@ import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupdesign.GlifLayout; import com.google.android.setupdesign.GlifLayout;
/** /**
* Fragment which concludes fingerprint enrollment. * Fragment which concludes fingerprint enrollment.
*/ */
public class FingerprintEnrollFinishFragment extends Fragment { public class FingerprintEnrollFinishFragment extends Fragment {
private static final String TAG = FingerprintEnrollFinishFragment.class.getSimpleName(); private FingerprintEnrollFinishViewModel mViewModel;
private FingerprintEnrollFinishViewModel mFingerprintEnrollFinishViewModel;
private boolean mCanAssumeSfps;
private View mView;
private FooterBarMixin mFooterBarMixin;
private final View.OnClickListener mAddButtonClickListener = private final View.OnClickListener mAddButtonClickListener =
(v) -> mFingerprintEnrollFinishViewModel.onAddButtonClick(); (v) -> mViewModel.onAddButtonClick();
private final View.OnClickListener mNextButtonClickListener = private final View.OnClickListener mNextButtonClickListener =
(v) -> mFingerprintEnrollFinishViewModel.onNextButtonClick(); (v) -> mViewModel.onNextButtonClick();
@Override @Override
public void onAttach(@NonNull Context context) { public void onAttach(@NonNull Context context) {
super.onAttach(context); super.onAttach(context);
final FragmentActivity activity = getActivity(); final ViewModelProvider provider = new ViewModelProvider(getActivity());
final ViewModelProvider provider = new ViewModelProvider(activity); mViewModel = provider.get(FingerprintEnrollFinishViewModel.class);
mFingerprintEnrollFinishViewModel = provider.get(FingerprintEnrollFinishViewModel.class);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCanAssumeSfps = mFingerprintEnrollFinishViewModel.canAssumeSfps();
} }
@Nullable @Nullable
@@ -74,55 +59,45 @@ public class FingerprintEnrollFinishFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) { @Nullable Bundle savedInstanceState) {
if (mCanAssumeSfps) { GlifLayout view = (GlifLayout) inflater.inflate(
mView = inflater.inflate(R.layout.sfps_enroll_finish, container, false); mViewModel.canAssumeSfps()
} else { ? R.layout.sfps_enroll_finish
mView = inflater.inflate(R.layout.fingerprint_enroll_finish, container, false); : R.layout.fingerprint_enroll_finish,
} container,
false);
final Activity activity = getActivity(); final Activity activity = getActivity();
final GlifLayoutHelper glifLayoutHelper = new GlifLayoutHelper(activity, final GlifLayoutHelper glifLayoutHelper = new GlifLayoutHelper(activity, view);
(GlifLayout) mView);
glifLayoutHelper.setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title); glifLayoutHelper.setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title);
glifLayoutHelper.setDescriptionText(getString( if (mViewModel.canAssumeSfps() && mViewModel.isAnotherFingerprintEnrollable()) {
R.string.security_settings_fingerprint_enroll_finish_v2_message)); glifLayoutHelper.setDescriptionText(getString(R.string
.security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message));
final int maxEnrollments = mFingerprintEnrollFinishViewModel.getMaxFingerprints(); } else {
final int enrolled = mFingerprintEnrollFinishViewModel.getNumOfEnrolledFingerprintsSize(); glifLayoutHelper.setDescriptionText(getString(
if (mCanAssumeSfps) { R.string.security_settings_fingerprint_enroll_finish_v2_message));
if (enrolled < maxEnrollments) {
glifLayoutHelper.setDescriptionText(getString(R.string
.security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message));
}
} }
mFooterBarMixin = ((GlifLayout) mView).getMixin(FooterBarMixin.class); final FooterBarMixin footerBarMixin = view.getMixin(FooterBarMixin.class);
mFooterBarMixin.setSecondaryButton( footerBarMixin.setPrimaryButton(
new FooterButton.Builder(getActivity()) new FooterButton.Builder(activity)
.setText(R.string.fingerprint_enroll_button_add) .setText(mViewModel.getRequest().isSuw()
.setButtonType(FooterButton.ButtonType.SKIP) ? R.string.next_label
.setTheme(R.style.SudGlifButton_Secondary) : R.string.security_settings_fingerprint_enroll_done)
.build()
);
mFooterBarMixin.setPrimaryButton(
new FooterButton.Builder(getActivity())
.setText(R.string.security_settings_fingerprint_enroll_done)
.setListener(mNextButtonClickListener) .setListener(mNextButtonClickListener)
.setButtonType(FooterButton.ButtonType.NEXT) .setButtonType(FooterButton.ButtonType.NEXT)
.setTheme(R.style.SudGlifButton_Primary) .setTheme(R.style.SudGlifButton_Primary)
.build() .build()
); );
if (mViewModel.isAnotherFingerprintEnrollable()) {
FooterButton addButton = mFooterBarMixin.getSecondaryButton(); footerBarMixin.setSecondaryButton(new FooterButton.Builder(activity)
if (enrolled >= maxEnrollments) { .setText(R.string.fingerprint_enroll_button_add)
addButton.setVisibility(View.INVISIBLE); .setListener(mAddButtonClickListener)
} else { .setButtonType(FooterButton.ButtonType.SKIP)
addButton.setOnClickListener(mAddButtonClickListener); .setTheme(R.style.SudGlifButton_Secondary)
.build());
} }
return mView; return view;
} }
} }

View File

@@ -40,6 +40,9 @@ import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFin
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_SKIP;
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START;
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FingerprintEnrollFindSensorAction; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FingerprintEnrollFindSensorAction;
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel.FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK;
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel.FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK;
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel.FingerprintEnrollFinishAction;
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_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_DONE_AND_FINISH;
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel.FINGERPRINT_ENROLL_INTRO_ACTION_SKIP_OR_CANCEL; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel.FINGERPRINT_ENROLL_INTRO_ACTION_SKIP_OR_CANCEL;
@@ -73,8 +76,6 @@ import androidx.lifecycle.viewmodel.MutableCreationExtras;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollFinish;
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFinish;
import com.android.settings.biometrics2.data.repository.FingerprintRepository; import com.android.settings.biometrics2.data.repository.FingerprintRepository;
import com.android.settings.biometrics2.factory.BiometricsViewModelFactory; import com.android.settings.biometrics2.factory.BiometricsViewModelFactory;
import com.android.settings.biometrics2.ui.model.CredentialModel; import com.android.settings.biometrics2.ui.model.CredentialModel;
@@ -84,6 +85,7 @@ import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.Fin
import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel; import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel;
@@ -156,11 +158,14 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
onEnrollingErrorDialogAction(action); onEnrollingErrorDialogAction(action);
} }
}; };
private final ActivityResultCallback<ActivityResult> mNextActivityResultCallback = private final Observer<Integer> mFinishActionObserver = action -> {
result -> mViewModel.onContinueEnrollActivityResult(result, if (DEBUG) {
mAutoCredentialViewModel.getUserId()); Log.d(TAG, "mFinishActionObserver(" + action + ")");
private final ActivityResultLauncher<Intent> mNextActivityLauncher = }
registerForActivityResult(new StartActivityForResult(), mNextActivityResultCallback); if (action != null) {
onFinishAction(action);
}
};
private final ActivityResultCallback<ActivityResult> mChooseLockResultCallback = private final ActivityResultCallback<ActivityResult> mChooseLockResultCallback =
result -> onChooseOrConfirmLockResult(true /* isChooseLock */, result); result -> onChooseOrConfirmLockResult(true /* isChooseLock */, result);
private final ActivityResultLauncher<Intent> mChooseLockLauncher = private final ActivityResultLauncher<Intent> mChooseLockLauncher =
@@ -195,6 +200,7 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
} else { } else {
final FragmentManager manager = getSupportFragmentManager(); final FragmentManager manager = getSupportFragmentManager();
String[] tags = new String[] { String[] tags = new String[] {
FINISH_TAG,
ENROLLING_UDFPS_TAG, ENROLLING_UDFPS_TAG,
ENROLLING_SFPS_TAG, ENROLLING_SFPS_TAG,
ENROLLING_RFPS_TAG, ENROLLING_RFPS_TAG,
@@ -217,10 +223,15 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
|| tag.equals(FIND_RFPS_TAG)) { || tag.equals(FIND_RFPS_TAG)) {
attachFindSensorViewModel(); attachFindSensorViewModel();
attachIntroViewModel(); attachIntroViewModel();
} else { // ENROLLING_UDFPS_TAG, ENROLLING_SFPS_TAG, ENROLLING_RFPS_TAG } else if (tag.equals(ENROLLING_UDFPS_TAG) || tag.equals(ENROLLING_SFPS_TAG)
|| tag.equals(ENROLLING_RFPS_TAG)) {
attachEnrollingViewModel(); attachEnrollingViewModel();
attachFindSensorViewModel(); attachFindSensorViewModel();
attachIntroViewModel(); attachIntroViewModel();
} else { // FINISH_TAG
attachFinishViewModel();
attachFindSensorViewModel();
attachIntroViewModel();
} }
break; break;
} }
@@ -330,59 +341,37 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
mEnrollingErrorDialogActionObserver); mEnrollingErrorDialogActionObserver);
} }
private void startFinishActivity() { private void startFinishFragment() {
final FingerprintEnrollEnrollingViewModel enrollingViewModel = attachFinishViewModel();
mViewModelProvider.get(FingerprintEnrollEnrollingViewModel.class);
enrollingViewModel.clearActionLiveData();
final boolean isSuw = mViewModel.getRequest().isSuw(); getSupportFragmentManager().beginTransaction()
if (!mViewModel.isWaitingActivityResult().compareAndSet(false, true)) { .setReorderingAllowed(true)
Log.w(TAG, "startNext, isSuw:" + isSuw + ", fail to set isWaiting flag"); .setCustomAnimations(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out,
} R.anim.sud_slide_back_in, R.anim.sud_slide_back_out)
Intent intent = new Intent(this, isSuw .replace(R.id.fragment_container_view, FingerprintEnrollFinishFragment.class, null,
? SetupFingerprintEnrollFinish.class FINISH_TAG)
: FingerprintEnrollFinish.class); .addToBackStack(FINISH_TAG)
intent.putExtras(mAutoCredentialViewModel.createCredentialIntentExtra()); .commit();
intent.putExtras(mViewModel.getNextActivityBaseIntentExtras()); }
mNextActivityLauncher.launch(intent);
private void attachFinishViewModel() {
final FingerprintEnrollFinishViewModel viewModel =
mViewModelProvider.get(FingerprintEnrollFinishViewModel.class);
viewModel.clearActionLiveData();
viewModel.getActionLiveData().observe(this, mFinishActionObserver);
} }
private void onGenerateChallengeFailed(@NonNull Boolean ignoredBoolean) { private void onGenerateChallengeFailed(@NonNull Boolean ignoredBoolean) {
onSetActivityResult(new ActivityResult(RESULT_CANCELED, null)); onSetActivityResult(new ActivityResult(RESULT_CANCELED, null));
} }
/**
* Get intent which passing back to FingerprintSettings for late generateChallenge()
*/
@Nullable
private Intent createSetResultIntentWithGeneratingChallengeExtra(
@Nullable Intent activityResultIntent) {
if (!mViewModel.getRequest().isFromSettingsSummery()) {
return activityResultIntent;
}
final Bundle extra = mAutoCredentialViewModel.createGeneratingChallengeExtras();
if (extra != null) {
if (activityResultIntent == null) {
activityResultIntent = new Intent();
}
activityResultIntent.putExtras(extra);
}
return activityResultIntent;
}
private void onSetActivityResult(@NonNull ActivityResult result) { private void onSetActivityResult(@NonNull ActivityResult result) {
final int resultCode = mViewModel.getRequest().isAfterSuwOrSuwSuggestedAction() final ActivityResult overrideResult = mViewModel.getOverrideActivityResult(
? RESULT_CANCELED result, mAutoCredentialViewModel.createGeneratingChallengeExtras());
: result.getResultCode();
final Intent intent = resultCode == BiometricEnrollBase.RESULT_FINISHED
? createSetResultIntentWithGeneratingChallengeExtra(result.getData())
: result.getData();
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onSetActivityResult(" + result + "), call setResult(" + resultCode Log.d(TAG, "onSetActivityResult(" + result + "), override:" + overrideResult + ")");
+ ", " + intent + ")");
} }
setResult(resultCode, intent); setResult(overrideResult.getResultCode(), overrideResult.getData());
finish(); finish();
} }
@@ -471,7 +460,12 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
private void onEnrollingAction(@FingerprintEnrollEnrollingAction int action) { private void onEnrollingAction(@FingerprintEnrollEnrollingAction int action) {
switch (action) { switch (action) {
case FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE: { case FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE: {
startFinishActivity(); mViewModel.setIsNewFingerprintAdded();
// Remove Enrolling page from backstack, and add Finish page. Latest backstack will
// be changed from Intro->FindSensor->Enrolling to Intro->FindSensor->Finish
getSupportFragmentManager().popBackStack();
startFinishFragment();
break; break;
} }
case FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP: { case FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP: {
@@ -488,7 +482,18 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
break; break;
} }
case FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED: { case FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED: {
getSupportFragmentManager().popBackStack(); if (mViewModel.isNewFingerprintAdded()) {
// Add another fingerprint case. Remove Enrolling page from
// backstack, and add Finish page. Latest backstack will be changed from
// Intro->FindSensor->Enrolling to Intro->FindSensor->Finish
getSupportFragmentManager().popBackStack();
startFinishFragment();
} else {
// First fingerprint case. Remove Enrolling page from backstack, and add Finish
// page. Latest backstack will be changed from
// Intro->FindSensor->Enrolling to Intro->FindSensor
getSupportFragmentManager().popBackStack();
}
break; break;
} }
} }
@@ -505,12 +510,40 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
} }
} }
private void onFinishAction(@FingerprintEnrollFinishAction int action) {
switch (action) {
case FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK: {
getSupportFragmentManager().popBackStack(); // Remove Finish page from backstack
startEnrollingFragment();
break;
}
case FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK: {
final Intent data;
if (mViewModel.getRequest().isSuw()) {
data = new Intent();
data.putExtras(mViewModel.getSuwFingerprintCountExtra(
mAutoCredentialViewModel.getUserId()));
} else {
data = null;
}
onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_FINISHED, data));
break;
}
}
}
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
mViewModel.checkFinishActivityDuringOnPause(isFinishing(), isChangingConfigurations()); mViewModel.checkFinishActivityDuringOnPause(isFinishing(), isChangingConfigurations());
} }
@Override
protected void onDestroy() {
mViewModel.updateFingerprintSuggestionEnableState(mAutoCredentialViewModel.getUserId());
super.onDestroy();
}
@Override @Override
protected void onApplyThemeResource(Resources.Theme theme, @StyleRes int resid, boolean first) { protected void onApplyThemeResource(Resources.Theme theme, @StyleRes int resid, boolean first) {
theme.applyStyle(R.style.SetupWizardPartnerResource, true); theme.applyStyle(R.style.SetupWizardPartnerResource, true);

View File

@@ -16,17 +16,20 @@
package com.android.settings.biometrics2.ui.viewmodel; package com.android.settings.biometrics2.ui.viewmodel;
import android.annotation.IntDef;
import android.app.Application; import android.app.Application;
import android.content.ComponentName; import android.util.Log;
import android.content.pm.PackageManager;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.android.settings.biometrics2.data.repository.FingerprintRepository; import com.android.settings.biometrics2.data.repository.FingerprintRepository;
import com.android.settings.biometrics2.data.repository.PackageManagerRepository; import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** /**
* Finish ViewModel handles the state of the fingerprint renroll final stage * Finish ViewModel handles the state of the fingerprint renroll final stage
@@ -34,29 +37,43 @@ import com.android.settings.biometrics2.data.repository.PackageManagerRepository
public class FingerprintEnrollFinishViewModel extends AndroidViewModel { public class FingerprintEnrollFinishViewModel extends AndroidViewModel {
private static final String TAG = FingerprintEnrollFinishViewModel.class.getSimpleName(); private static final String TAG = FingerprintEnrollFinishViewModel.class.getSimpleName();
private static final boolean DEBUG = false;
private static final String FINGERPRINT_SUGGESTION_ACTIVITY = /**
"com.android.settings.SetupFingerprintSuggestionActivity"; * User clicks "Add" button
*/
public static final int FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK = 0;
private static final int ACTION_NONE = -1; /**
private static final int ACTION_ADD_BUTTON_CLICK = 0; * User clicks "Next" button
private static final int ACTION_NEXT_BUTTON_CLICK = 1; */
public static final int FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK = 1;
private final FingerprintRepository mFingerprintRepository; @IntDef(prefix = { "FINGERPRINT_ENROLL_FINISH_ACTION_" }, value = {
private final PackageManagerRepository mPackageManagerRepository; FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK,
FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK
})
@Retention(RetentionPolicy.SOURCE)
public @interface FingerprintEnrollFinishAction {}
@NonNull private final FingerprintRepository mFingerprintRepository;
@NonNull private final EnrollmentRequest mRequest;
private final int mUserId; private final int mUserId;
private final MutableLiveData<Integer> mActionLiveData = new MutableLiveData<>(); private final MutableLiveData<Integer> mActionLiveData = new MutableLiveData<>();
public FingerprintEnrollFinishViewModel(@NonNull Application application, public FingerprintEnrollFinishViewModel(@NonNull Application application, int userId,
FingerprintRepository fingerprintRepository, @NonNull EnrollmentRequest request,
PackageManagerRepository packageManagerRepository, @NonNull FingerprintRepository fingerprintRepository) {
int userId) {
super(application); super(application);
mFingerprintRepository = fingerprintRepository;
mPackageManagerRepository = packageManagerRepository;
mUserId = userId; mUserId = userId;
mActionLiveData.setValue(ACTION_NONE); mRequest = request;
mFingerprintRepository = fingerprintRepository;
}
@NonNull
public EnrollmentRequest getRequest() {
return mRequest;
} }
/** /**
@@ -67,57 +84,46 @@ public class FingerprintEnrollFinishViewModel extends AndroidViewModel {
} }
/** /**
* Get number of fingerprints that this user enrolled. * Device allows user to enroll another fingerprint or not.
*/ */
public int getNumOfEnrolledFingerprintsSize() { public boolean isAnotherFingerprintEnrollable() {
return mFingerprintRepository.getNumOfEnrolledFingerprintsSize(mUserId); return mFingerprintRepository.getNumOfEnrolledFingerprintsSize(mUserId)
< mFingerprintRepository.getMaxFingerprints();
} }
/** /**
* Get max possible number of fingerprints for a user * Clear action LiveData
*/ */
public int getMaxFingerprints() { public void clearActionLiveData() {
return mFingerprintRepository.getMaxFingerprints(); mActionLiveData.setValue(null);
} }
/** /**
* Clear life data * Get action LiveData
*/ */
public void clearLiveData() { public LiveData<Integer> getActionLiveData() {
mActionLiveData.setValue(ACTION_NONE); return mActionLiveData;
} }
/** /**
* Handle add button Click * Handle add button Click
*/ */
public void onAddButtonClick() { public void onAddButtonClick() {
mActionLiveData.postValue(ACTION_ADD_BUTTON_CLICK); final int action = FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK;
if (DEBUG) {
Log.d(TAG, "onAddButtonClick post(" + action + ")");
}
mActionLiveData.postValue(action);
} }
/** /**
* Handle next button Click * Handle next button Click
*/ */
public void onNextButtonClick() { public void onNextButtonClick() {
updateFingerprintSuggestionEnableState(); final int action = FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK;
mActionLiveData.postValue(ACTION_NEXT_BUTTON_CLICK); if (DEBUG) {
} Log.d(TAG, "onNextButtonClick post(" + action + ")");
}
/** mActionLiveData.postValue(action);
* Handle back key pressed
*/
public void onBackKeyPressed() {
updateFingerprintSuggestionEnableState();
}
private void updateFingerprintSuggestionEnableState() {
final int enrollNum = mFingerprintRepository.getNumOfEnrolledFingerprintsSize(mUserId);
final int flag = (enrollNum == 1) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
ComponentName componentName = new ComponentName(getApplication(),
FINGERPRINT_SUGGESTION_ACTIVITY);
mPackageManagerRepository.setComponentEnabledSetting(componentName, flag,
PackageManager.DONT_KILL_APP);
} }
} }

View File

@@ -16,15 +16,13 @@
package com.android.settings.biometrics2.ui.viewmodel; package com.android.settings.biometrics2.ui.viewmodel;
import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY; import static com.android.settings.biometrics.fingerprint.FingerprintEnrollFinish.FINGERPRINT_SUGGESTION_ACTIVITY;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_SKIP;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
import static com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction.EXTRA_FINGERPRINT_ENROLLED_COUNT; import static com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction.EXTRA_FINGERPRINT_ENROLLED_COUNT;
import android.app.Application; import android.app.Application;
import android.app.KeyguardManager; import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
@@ -39,7 +37,6 @@ import androidx.lifecycle.MutableLiveData;
import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics2.data.repository.FingerprintRepository; import com.android.settings.biometrics2.data.repository.FingerprintRepository;
import com.android.settings.biometrics2.ui.model.EnrollmentRequest; import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
import com.android.settings.password.SetupSkipDialog;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@@ -53,21 +50,22 @@ public class FingerprintEnrollmentViewModel extends AndroidViewModel {
@VisibleForTesting @VisibleForTesting
static final String SAVED_STATE_IS_WAITING_ACTIVITY_RESULT = "is_waiting_activity_result"; static final String SAVED_STATE_IS_WAITING_ACTIVITY_RESULT = "is_waiting_activity_result";
@VisibleForTesting
static final String SAVED_STATE_IS_NEW_FINGERPRINT_ADDED = "is_new_fingerprint_added";
@NonNull private final FingerprintRepository mFingerprintRepository; @NonNull private final FingerprintRepository mFingerprintRepository;
@Nullable private final KeyguardManager mKeyguardManager;
private final AtomicBoolean mIsWaitingActivityResult = new AtomicBoolean(false); private final AtomicBoolean mIsWaitingActivityResult = new AtomicBoolean(false);
private final MutableLiveData<ActivityResult> mSetResultLiveData = new MutableLiveData<>(); private final MutableLiveData<ActivityResult> mSetResultLiveData = new MutableLiveData<>();
@NonNull private final EnrollmentRequest mRequest; @NonNull private final EnrollmentRequest mRequest;
private boolean mIsNewFingerprintAdded = false;
public FingerprintEnrollmentViewModel( public FingerprintEnrollmentViewModel(
@NonNull Application application, @NonNull Application application,
@NonNull FingerprintRepository fingerprintRepository, @NonNull FingerprintRepository fingerprintRepository,
@Nullable KeyguardManager keyguardManager,
@NonNull EnrollmentRequest request) { @NonNull EnrollmentRequest request) {
super(application); super(application);
mFingerprintRepository = fingerprintRepository; mFingerprintRepository = fingerprintRepository;
mKeyguardManager = keyguardManager;
mRequest = request; mRequest = request;
} }
@@ -80,41 +78,31 @@ public class FingerprintEnrollmentViewModel extends AndroidViewModel {
} }
/** /**
* Copy necessary extra data from activity intent * Get override activity result as current ViewModel status.
*
* FingerprintEnrollmentActivity supports user enrolls 2nd fingerprint or starts a new flow
* through Deferred-SUW, Portal-SUW, or SUW Suggestion. Use a method to get override activity
* result instead of putting these if-else on every setResult(), .
*/ */
@NonNull @NonNull
public Bundle getNextActivityBaseIntentExtras() { public ActivityResult getOverrideActivityResult(@NonNull ActivityResult result,
final Bundle bundle = mRequest.getSuwExtras(); @Nullable Bundle generatingChallengeExtras) {
bundle.putBoolean(EXTRA_FROM_SETTINGS_SUMMARY, mRequest.isFromSettingsSummery()); // TODO write tests
return bundle; final int newResultCode = mIsNewFingerprintAdded
} ? BiometricEnrollBase.RESULT_FINISHED
: (mRequest.isAfterSuwOrSuwSuggestedAction()
? BiometricEnrollBase.RESULT_CANCELED
: result.getResultCode());
/** Intent newData = result.getData();
* Handle activity result from FingerprintFindSensor if (newResultCode == BiometricEnrollBase.RESULT_FINISHED
*/ && generatingChallengeExtras != null) {
public void onContinueEnrollActivityResult(@NonNull ActivityResult result, int userId) { if (newData == null) {
if (!mIsWaitingActivityResult.compareAndSet(true, false)) { newData = new Intent();
Log.w(TAG, "fail to reset isWaiting flag for enrollment");
}
if (result.getResultCode() == RESULT_FINISHED
|| result.getResultCode() == RESULT_TIMEOUT) {
Intent data = result.getData();
if (mRequest.isSuw() && isKeyguardSecure()
&& result.getResultCode() == RESULT_FINISHED) {
if (data == null) {
data = new Intent();
}
data.putExtras(getSuwFingerprintCountExtra(userId));
} }
mSetResultLiveData.postValue(new ActivityResult(result.getResultCode(), data)); newData.putExtras(generatingChallengeExtras);
} else if (result.getResultCode() == RESULT_SKIP
|| result.getResultCode() == SetupSkipDialog.RESULT_SKIP) {
mSetResultLiveData.postValue(result);
} }
} return new ActivityResult(newResultCode, newData);
private boolean isKeyguardSecure() {
return mKeyguardManager != null && mKeyguardManager.isKeyguardSecure();
} }
/** /**
@@ -130,11 +118,15 @@ public class FingerprintEnrollmentViewModel extends AndroidViewModel {
return; return;
} }
mSetResultLiveData.postValue(new ActivityResult(BiometricEnrollBase.RESULT_TIMEOUT, null)); mSetResultLiveData.postValue(
new ActivityResult(BiometricEnrollBase.RESULT_TIMEOUT, null));
} }
/**
* Get Suw fingerprint count extra for statistics
*/
@NonNull @NonNull
private Bundle getSuwFingerprintCountExtra(int userId) { public Bundle getSuwFingerprintCountExtra(int userId) {
final Bundle bundle = new Bundle(); final Bundle bundle = new Bundle();
bundle.putInt(EXTRA_FINGERPRINT_ENROLLED_COUNT, bundle.putInt(EXTRA_FINGERPRINT_ENROLLED_COUNT,
mFingerprintRepository.getNumOfEnrolledFingerprintsSize(userId)); mFingerprintRepository.getNumOfEnrolledFingerprintsSize(userId));
@@ -161,6 +153,8 @@ public class FingerprintEnrollmentViewModel extends AndroidViewModel {
mIsWaitingActivityResult.set( mIsWaitingActivityResult.set(
savedInstanceState.getBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, false) savedInstanceState.getBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, false)
); );
mIsNewFingerprintAdded = savedInstanceState.getBoolean(
SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, false);
} }
/** /**
@@ -168,6 +162,7 @@ public class FingerprintEnrollmentViewModel extends AndroidViewModel {
*/ */
public void onSaveInstanceState(@NonNull Bundle outState) { public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, mIsWaitingActivityResult.get()); outState.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, mIsWaitingActivityResult.get());
outState.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, mIsNewFingerprintAdded);
} }
/** /**
@@ -183,4 +178,35 @@ public class FingerprintEnrollmentViewModel extends AndroidViewModel {
public boolean canAssumeSfps() { public boolean canAssumeSfps() {
return mFingerprintRepository.canAssumeSfps(); return mFingerprintRepository.canAssumeSfps();
} }
public boolean isNewFingerprintAdded() {
return mIsNewFingerprintAdded;
}
/**
* Sets mIsNewFingerprintAdded to true
*/
public void setIsNewFingerprintAdded() {
mIsNewFingerprintAdded = true;
}
/**
* Update FINGERPRINT_SUGGESTION_ACTIVITY into package manager
*/
public void updateFingerprintSuggestionEnableState(int userId) {
final int enrolled = mFingerprintRepository.getNumOfEnrolledFingerprintsSize(userId);
// Only show "Add another fingerprint" if the user already enrolled one.
// "Add fingerprint" will be shown in the main flow if the user hasn't enrolled any
// fingerprints. If the user already added more than one fingerprint, they already know
// to add multiple fingerprints so we don't show the suggestion.
final int flag = (enrolled == 1) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
ComponentName componentName = new ComponentName(getApplication(),
FINGERPRINT_SUGGESTION_ACTIVITY);
getApplication().getPackageManager().setComponentEnabledSetting(componentName, flag,
PackageManager.DONT_KILL_APP);
Log.d(TAG, FINGERPRINT_SUGGESTION_ACTIVITY + " enabled state = " + (enrolled == 1));
}
} }

View File

@@ -16,31 +16,20 @@
package com.android.settings.biometrics2.ui.viewmodel; package com.android.settings.biometrics2.ui.viewmodel;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel.SAVED_STATE_IS_NEW_FINGERPRINT_ADDED;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_SKIP;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
import static com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction.EXTRA_FINGERPRINT_ENROLLED_COUNT;
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel.SAVED_STATE_IS_WAITING_ACTIVITY_RESULT; 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.EnrollmentRequestUtils.newAllFalseRequest;
import static com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newIsSuwRequest;
import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.app.Application; import android.app.Application;
import android.app.KeyguardManager;
import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle; import android.os.Bundle;
import androidx.activity.result.ActivityResult;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.biometrics2.data.repository.FingerprintRepository; import com.android.settings.biometrics2.data.repository.FingerprintRepository;
import com.android.settings.password.SetupSkipDialog;
import com.android.settings.testutils.InstantTaskExecutorRule; import com.android.settings.testutils.InstantTaskExecutorRule;
import org.junit.Before; import org.junit.Before;
@@ -58,7 +47,6 @@ public class FingerprintEnrollmentViewModelTest {
@Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule(); @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
@Mock private FingerprintManager mFingerprintManager; @Mock private FingerprintManager mFingerprintManager;
@Mock private KeyguardManager mKeyguardManager;
private Application mApplication; private Application mApplication;
private FingerprintRepository mFingerprintRepository; private FingerprintRepository mFingerprintRepository;
@@ -69,7 +57,7 @@ public class FingerprintEnrollmentViewModelTest {
mApplication = ApplicationProvider.getApplicationContext(); mApplication = ApplicationProvider.getApplicationContext();
mFingerprintRepository = new FingerprintRepository(mFingerprintManager); mFingerprintRepository = new FingerprintRepository(mFingerprintManager);
mViewModel = new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository, mViewModel = new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository,
mKeyguardManager, newAllFalseRequest(mApplication)); newAllFalseRequest(mApplication));
} }
@Test @Test
@@ -77,165 +65,56 @@ public class FingerprintEnrollmentViewModelTest {
assertThat(mViewModel.getRequest()).isNotNull(); assertThat(mViewModel.getRequest()).isNotNull();
} }
@Test
public void testGetNextActivityBaseIntentExtras() {
assertThat(mViewModel.getNextActivityBaseIntentExtras()).isNotNull();
}
@Test
public void testOnContinueEnrollActivityResult_shouldRelaySkip1Result() {
final ActivityResult result = new ActivityResult(RESULT_SKIP, null);
// Run onContinueEnrollActivityResult
mViewModel.onContinueEnrollActivityResult(result, 100);
assertThat(mViewModel.getSetResultLiveData().getValue()).isEqualTo(result);
}
@Test
public void testOnContinueEnrollActivityResult_shouldRelaySkip2Result() {
final ActivityResult result = new ActivityResult(SetupSkipDialog.RESULT_SKIP, null);
// Run onContinueEnrollActivityResult
mViewModel.onContinueEnrollActivityResult(result, 100);
assertThat(mViewModel.getSetResultLiveData().getValue()).isEqualTo(result);
}
@Test
public void testOnContinueEnrollActivityResult_shouldRelayNullDataTimeoutResult() {
final ActivityResult result = new ActivityResult(RESULT_TIMEOUT, null);
// Run onContinueEnrollActivityResult
mViewModel.onContinueEnrollActivityResult(result, 100);
final ActivityResult setResult = mViewModel.getSetResultLiveData().getValue();
assertThat(setResult).isNotNull();
assertThat(setResult.getResultCode()).isEqualTo(result.getResultCode());
assertThat(setResult.getData()).isEqualTo(result.getData());
}
@Test
public void testOnContinueEnrollActivityResult_shouldRelayWithDataTimeoutResult() {
final Intent intent = new Intent("testAction");
intent.putExtra("testKey", "testValue");
final ActivityResult result = new ActivityResult(RESULT_TIMEOUT, intent);
// Run onContinueEnrollActivityResult
mViewModel.onContinueEnrollActivityResult(result, 100);
final ActivityResult setResult = mViewModel.getSetResultLiveData().getValue();
assertThat(setResult).isNotNull();
assertThat(setResult.getResultCode()).isEqualTo(result.getResultCode());
assertThat(setResult.getData()).isEqualTo(intent);
}
@Test
public void testOnContinueEnrollActivityResult_shouldRelayNullDataFinishResult() {
final ActivityResult result = new ActivityResult(RESULT_FINISHED, null);
// Run onContinueEnrollActivityResult
mViewModel.onContinueEnrollActivityResult(result, 100);
final ActivityResult setResult = mViewModel.getSetResultLiveData().getValue();
assertThat(setResult).isNotNull();
assertThat(setResult.getResultCode()).isEqualTo(result.getResultCode());
assertThat(setResult.getData()).isEqualTo(result.getData());
}
@Test
public void testOnContinueEnrollActivityResult_shouldRelayWithDataFinishResult() {
final Intent intent = new Intent("testAction");
intent.putExtra("testKey", "testValue");
final ActivityResult result = new ActivityResult(RESULT_FINISHED, intent);
// Run onContinueEnrollActivityResult
mViewModel.onContinueEnrollActivityResult(result, 100);
final ActivityResult setResult = mViewModel.getSetResultLiveData().getValue();
assertThat(setResult).isNotNull();
assertThat(setResult.getResultCode()).isEqualTo(result.getResultCode());
assertThat(setResult.getData()).isEqualTo(intent);
}
@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);
final ActivityResult result = new ActivityResult(RESULT_FINISHED, null);
// Run onContinueEnrollActivityResult
mViewModel.onContinueEnrollActivityResult(result, userId);
final ActivityResult setResult = mViewModel.getSetResultLiveData().getValue();
assertThat(setResult).isNotNull();
assertThat(setResult.getResultCode()).isEqualTo(result.getResultCode());
assertThat(setResult.getData()).isNotNull();
assertThat(setResult.getData().getExtras()).isNotNull();
assertThat(setResult.getData().getExtras().getInt(EXTRA_FINGERPRINT_ENROLLED_COUNT, -1))
.isEqualTo(numOfFp);
}
@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);
final String action = "testAction";
final String key = "testKey";
final String value = "testValue";
final Intent intent = new Intent(action);
intent.putExtra(key, value);
final ActivityResult result = new ActivityResult(RESULT_FINISHED, intent);
// Run onContinueEnrollActivityResult
mViewModel.onContinueEnrollActivityResult(result, userId);
final ActivityResult setResult = mViewModel.getSetResultLiveData().getValue();
assertThat(setResult).isNotNull();
assertThat(setResult.getResultCode()).isEqualTo(result.getResultCode());
assertThat(setResult.getData()).isNotNull();
assertThat(setResult.getData().getExtras()).isNotNull();
assertThat(setResult.getData().getExtras().getInt(EXTRA_FINGERPRINT_ENROLLED_COUNT, -1))
.isEqualTo(numOfFp);
assertThat(setResult.getData().getExtras().getString(key)).isEqualTo(value);
}
@Test @Test
public void testSetSavedInstanceState() { public void testSetSavedInstanceState() {
final Bundle bundle = new Bundle();
mViewModel.isWaitingActivityResult().set(true);
// setSavedInstanceState() as false // setSavedInstanceState() as false
final Bundle bundle = new Bundle();
bundle.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, false); bundle.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, false);
mViewModel.setSavedInstanceState(bundle); mViewModel.setSavedInstanceState(bundle);
assertThat(mViewModel.isWaitingActivityResult().get()).isFalse(); assertThat(mViewModel.isWaitingActivityResult().get()).isFalse();
// setSavedInstanceState() as false // setSavedInstanceState() as false
bundle.clear();
bundle.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, true); bundle.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, true);
mViewModel.setSavedInstanceState(bundle); mViewModel.setSavedInstanceState(bundle);
assertThat(mViewModel.isWaitingActivityResult().get()).isTrue(); assertThat(mViewModel.isWaitingActivityResult().get()).isTrue();
// setSavedInstanceState() as false
bundle.clear();
bundle.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, false);
mViewModel.setSavedInstanceState(bundle);
assertThat(mViewModel.isNewFingerprintAdded()).isFalse();
// setSavedInstanceState() as false
bundle.clear();
bundle.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, true);
mViewModel.setSavedInstanceState(bundle);
assertThat(mViewModel.isNewFingerprintAdded()).isTrue();
} }
@Test @Test
public void testOnSaveInstanceState() { public void testOnSaveInstanceState() {
final Bundle bundle = new Bundle(); // Test isWaitingActivityResult false
// setSavedInstanceState() as false
mViewModel.isWaitingActivityResult().set(false); mViewModel.isWaitingActivityResult().set(false);
final Bundle bundle = new Bundle();
mViewModel.onSaveInstanceState(bundle); mViewModel.onSaveInstanceState(bundle);
assertThat(bundle.getBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT)).isFalse(); assertThat(bundle.getBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT)).isFalse();
// setSavedInstanceState() as false // Test isWaitingActivityResult true
mViewModel.isWaitingActivityResult().set(true); mViewModel.isWaitingActivityResult().set(true);
bundle.clear();
mViewModel.onSaveInstanceState(bundle); mViewModel.onSaveInstanceState(bundle);
assertThat(bundle.getBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT)).isTrue(); assertThat(bundle.getBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT)).isTrue();
// Test isNewFingerprintAdded default false
bundle.clear();
mViewModel.onSaveInstanceState(bundle);
assertThat(bundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isFalse();
// Test isNewFingerprintAdded true
mViewModel.setIsNewFingerprintAdded();
bundle.clear();
mViewModel.onSaveInstanceState(bundle);
assertThat(bundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
} }
} }