Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df8d2d9d authored by Milton Wu's avatar Milton Wu
Browse files

Refine FingerprintEnrollmentActivity

1. Add missing test cases for DeviceFoldedViewModel,
   DeviceRotationViewModel, and FingerprintEnrollFindSensorViewModel
2. Move most of init value of ViewModels into
   getDefaultViewModelCreationExtras
3. Fix FindSfpsFragment lottie because of incorrect rotation value.
4. Feed configuration change into DeviceFoldedViewModel

Bug: 260957195
Test: atest CredentialModelTest AutoCredentialViewModelTest
      DeviceFoldedViewModelTest DeviceRotationViewModelTest
      FingerprintEnrollFindSensorViewModelTest
      FingerprintEnrollIntroViewModelTest
      FingerprintEnrollProgressViewModelTest
      FingerprintEnrollmentViewModelTest
      FingerprintEnrollmentActivityTest
Change-Id: Ied55a895bc1774af5bdd256eccd806aaaa1680ef
parent c7c4689e
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import androidx.lifecycle.viewmodel.CreationExtras;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.biometrics.fingerprint.FingerprintUpdater;
import com.android.settings.biometrics2.data.repository.FingerprintRepository;
import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel;
import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.ChallengeGenerator;
import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel;
@@ -47,8 +48,11 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory {

    private static final String TAG = "BiometricsViewModelFact";

    public static final CreationExtras.Key<ChallengeGenerator> CHALLENGE_GENERATOR =
            new CreationExtras.Key<ChallengeGenerator>() {};
    public static final CreationExtras.Key<ChallengeGenerator> CHALLENGE_GENERATOR_KEY =
            new CreationExtras.Key<>() {};
    public static final CreationExtras.Key<EnrollmentRequest> ENROLLMENT_REQUEST_KEY =
            new CreationExtras.Key<>() {};
    public static final CreationExtras.Key<Integer> USER_ID_KEY = new CreationExtras.Key<>() {};

    @NonNull
    @Override
@@ -68,7 +72,7 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory {
        if (modelClass.isAssignableFrom(AutoCredentialViewModel.class)) {
            final LockPatternUtils lockPatternUtils =
                    featureFactory.getSecurityFeatureProvider().getLockPatternUtils(application);
            final ChallengeGenerator challengeGenerator = extras.get(CHALLENGE_GENERATOR);
            final ChallengeGenerator challengeGenerator = extras.get(CHALLENGE_GENERATOR_KEY);
            if (challengeGenerator != null) {
                return (T) new AutoCredentialViewModel(application, lockPatternUtils,
                        challengeGenerator);
@@ -79,21 +83,31 @@ public class BiometricsViewModelFactory implements ViewModelProvider.Factory {
        } else if (modelClass.isAssignableFrom(DeviceRotationViewModel.class)) {
            return (T) new DeviceRotationViewModel(application);
        } else if (modelClass.isAssignableFrom(FingerprintEnrollFindSensorViewModel.class)) {
            return (T) new FingerprintEnrollFindSensorViewModel(application);
            final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
            if (request != null) {
                return (T) new FingerprintEnrollFindSensorViewModel(application, request.isSuw());
            }
        } else if (modelClass.isAssignableFrom(FingerprintEnrollIntroViewModel.class)) {
            final FingerprintRepository repository = provider.getFingerprintRepository(application);
            if (repository != null) {
                return (T) new FingerprintEnrollIntroViewModel(application, repository);
            final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
            final Integer userId = extras.get(USER_ID_KEY);
            if (repository != null && request != null && userId != null) {
                return (T) new FingerprintEnrollIntroViewModel(application, repository, request,
                        userId);
            }
        } else if (modelClass.isAssignableFrom(FingerprintEnrollmentViewModel.class)) {
            final FingerprintRepository repository = provider.getFingerprintRepository(application);
            if (repository != null) {
            final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
            if (repository != null && request != null) {
                return (T) new FingerprintEnrollmentViewModel(application, repository,
                        application.getSystemService(KeyguardManager.class));
                        application.getSystemService(KeyguardManager.class), request);
            }
        } else if (modelClass.isAssignableFrom(FingerprintEnrollProgressViewModel.class)) {
            final Integer userId = extras.get(USER_ID_KEY);
            if (userId != null) {
                return (T) new FingerprintEnrollProgressViewModel(application,
                    new FingerprintUpdater(application));
                        new FingerprintUpdater(application), userId);
            }
        }
        return create(modelClass);
    }
+4 −1
Original line number Diff line number Diff line
@@ -82,7 +82,10 @@ public final class CredentialModel {
    @Nullable
    private Long mClearGkPwHandleMillis = null;

    public CredentialModel(@NonNull Bundle bundle, @NonNull Clock clock) {
    public CredentialModel(@Nullable Bundle bundle, @NonNull Clock clock) {
        if (bundle == null) {
            bundle = new Bundle();
        }
        mUserId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId());
        mSensorId = bundle.getInt(EXTRA_KEY_SENSOR_ID, INVALID_SENSOR_ID);
        mChallenge = bundle.getLong(EXTRA_KEY_CHALLENGE, INVALID_CHALLENGE);
+1 −8
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@ public class FingerprintEnrollIntroFragment extends Fragment {
            mIconShield.setVisibility(View.GONE);
        }
        mSecondaryFooterButton.setText(context,
                mViewModel.getEnrollmentRequest().isAfterSuwOrSuwSuggestedAction()
                mViewModel.getRequest().isAfterSuwOrSuwSuggestedAction()
                ? R.string.security_settings_fingerprint_enroll_introduction_cancel
                : R.string.security_settings_fingerprint_enroll_introduction_no_thanks);

@@ -209,16 +209,9 @@ public class FingerprintEnrollIntroFragment extends Fragment {
    public void onAttach(@NonNull Context context) {
        mViewModel = new ViewModelProvider(getActivity())
                .get(FingerprintEnrollIntroViewModel.class);
        getLifecycle().addObserver(mViewModel);
        super.onAttach(context);
    }

    @Override
    public void onDetach() {
        getLifecycle().removeObserver(mViewModel);
        super.onDetach();
    }

    @NonNull
    private PorterDuffColorFilter getIconColorFilter(@NonNull Context context) {
        if (mIconColorFilter == null) {
+21 −12
Original line number Diff line number Diff line
@@ -19,7 +19,9 @@ package com.android.settings.biometrics2.ui.view;
import static androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;
import static androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY;

import static com.android.settings.biometrics2.factory.BiometricsViewModelFactory.CHALLENGE_GENERATOR;
import static com.android.settings.biometrics2.factory.BiometricsViewModelFactory.CHALLENGE_GENERATOR_KEY;
import static com.android.settings.biometrics2.factory.BiometricsViewModelFactory.ENROLLMENT_REQUEST_KEY;
import static com.android.settings.biometrics2.factory.BiometricsViewModelFactory.USER_ID_KEY;
import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_FAIL_NEED_TO_CHOOSE_LOCK;
import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_FAIL_NEED_TO_CONFIRM_LOCK;
import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_IS_GENERATING_CHALLENGE;
@@ -37,9 +39,11 @@ import android.annotation.StyleRes;
import android.app.Application;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;

import androidx.activity.result.ActivityResult;
@@ -63,9 +67,11 @@ import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling;
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollEnrolling;
import com.android.settings.biometrics2.data.repository.FingerprintRepository;
import com.android.settings.biometrics2.factory.BiometricsViewModelFactory;
import com.android.settings.biometrics2.ui.model.CredentialModel;
import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel;
import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.FingerprintChallengeGenerator;
import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel;
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel;
@@ -126,7 +132,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
        mViewModelProvider = new ViewModelProvider(this);

        mViewModel = mViewModelProvider.get(FingerprintEnrollmentViewModel.class);
        mViewModel.setRequest(new EnrollmentRequest(getIntent(), getApplicationContext()));
        mViewModel.setSavedInstanceState(savedInstanceState);

        mAutoCredentialViewModel = mViewModelProvider.get(AutoCredentialViewModel.class);
@@ -173,7 +178,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
        }

        // observe LiveData
        getLifecycle().addObserver(mViewModel);
        mViewModel.getSetResultLiveData().observe(this, this::onSetActivityResult);

        mAutoCredentialViewModel.getGenerateChallengeFailedLiveData().observe(this,
@@ -193,9 +197,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
        final FingerprintEnrollIntroViewModel introViewModel =
                mViewModelProvider.get(FingerprintEnrollIntroViewModel.class);

        introViewModel.setEnrollmentRequest(mViewModel.getRequest());
        introViewModel.setUserId(mAutoCredentialViewModel.getUserId());

        // Clear ActionLiveData in FragmentViewModel to prevent getting previous action during
        // recreate, like press 'Agree' then press 'back' in FingerprintEnrollFindSensor activity.
        introViewModel.clearActionLiveData();
@@ -224,12 +225,10 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
        if (initProgressViewModel) {
            final FingerprintEnrollProgressViewModel progressViewModel =
                    mViewModelProvider.get(FingerprintEnrollProgressViewModel.class);
            progressViewModel.setUserId(mAutoCredentialViewModel.getUserId());
            progressViewModel.setToken(mAutoCredentialViewModel.getToken());
        }
        final FingerprintEnrollFindSensorViewModel findSensorViewModel =
                mViewModelProvider.get(FingerprintEnrollFindSensorViewModel.class);
        findSensorViewModel.setIsSuw(mViewModel.getRequest().isSuw());
        getSupportFragmentManager().beginTransaction()
                .setReorderingAllowed(true)
                .setCustomAnimations(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out,
@@ -408,9 +407,19 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
                super.getDefaultViewModelCreationExtras().get(APPLICATION_KEY);
        final MutableCreationExtras ret = new MutableCreationExtras();
        ret.set(APPLICATION_KEY, application);

        final FingerprintRepository repository = FeatureFactory.getFactory(application)
                .getBiometricsRepositoryProvider().getFingerprintRepository(application);
        ret.set(CHALLENGE_GENERATOR, new FingerprintChallengeGenerator(repository));
        ret.set(CHALLENGE_GENERATOR_KEY, new FingerprintChallengeGenerator(repository));

        ret.set(ENROLLMENT_REQUEST_KEY, new EnrollmentRequest(getIntent(),
                getApplicationContext()));

        Bundle extras = getIntent().getExtras();
        final CredentialModel credentialModel = new CredentialModel(extras,
                SystemClock.elapsedRealtimeClock());
        ret.set(USER_ID_KEY, credentialModel.getUserId());

        return ret;
    }

@@ -433,9 +442,9 @@ public class FingerprintEnrollmentActivity extends FragmentActivity {
    }

    @Override
    protected void onDestroy() {
        getLifecycle().removeObserver(mViewModel);
        super.onDestroy();
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        mViewModelProvider.get(DeviceFoldedViewModel.class).onConfigurationChanged(newConfig);
        super.onConfigurationChanged(newConfig);
    }

    @Override
+1 −2
Original line number Diff line number Diff line
@@ -201,8 +201,7 @@ public class AutoCredentialViewModel extends AndroidViewModel {
        } else {
            bundle = intent.getExtras();
        }
        mCredentialModel = new CredentialModel(bundle != null ? bundle : new Bundle(),
                SystemClock.elapsedRealtimeClock());
        mCredentialModel = new CredentialModel(bundle, SystemClock.elapsedRealtimeClock());

        if (DEBUG) {
            Log.d(TAG, "setCredentialModel " + mCredentialModel + ", savedInstanceState exist:"
Loading