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

Commit e29dae68 authored by Andres Morales's avatar Andres Morales
Browse files

Request enroll or verify lock before FP enroll

Also pipe through challenge token

Change-Id: I9d6afdbadf3832aeeb18a0b5a9620277e2070872
parent 6609b0c2
Loading
Loading
Loading
Loading
+1 −10
Original line number Diff line number Diff line
@@ -170,15 +170,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {

        @Override
        protected void authenticationSucceeded(@Nullable String password) {
            Intent intent = new Intent();
            if (getActivity() instanceof ConfirmLockPassword.InternalActivity) {
                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE,
                        mIsAlpha ? StorageManager.CRYPT_TYPE_PASSWORD
                                : StorageManager.CRYPT_TYPE_PIN);
                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password);
            }
            getActivity().setResult(RESULT_OK, intent);
            getActivity().finish();
            // TODO: make this play nice with challenge
        }

        private void handleNext() {
@@ -208,7 +200,6 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
            }

            if (matched) {
                authenticationSucceeded(pin);
                getActivity().setResult(RESULT_OK, intent);
                getActivity().finish();
            } else {
+1 −9
Original line number Diff line number Diff line
@@ -233,14 +233,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {

        @Override
        protected void authenticationSucceeded(@Nullable String password) {
            Intent intent = new Intent();
            if (getActivity() instanceof ConfirmLockPattern.InternalActivity) {
                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE,
                        StorageManager.CRYPT_TYPE_PATTERN);
                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password);
            }
            getActivity().setResult(Activity.RESULT_OK, intent);
            getActivity().finish();
            // TODO: make this play nice with challenge
        }

        @Override
@@ -299,7 +292,6 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
                }

                if (matched) {
                    authenticationSucceeded(LockPatternUtils.patternToString(pattern));
                    getActivity().setResult(Activity.RESULT_OK, intent);
                    getActivity().finish();
                } else {
+28 −13
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ public class FingerprintEnroll extends SettingsActivity {
        private ProgressBar mProgressBar;
        private ImageView mFingerprintAnimator;
        private ObjectAnimator mProgressAnim;
        private byte[] mToken;

        // Give the user a chance to see progress completed before jumping to the next stage.
        Runnable mDelayedFinishRunnable = new Runnable() {
@@ -253,8 +254,8 @@ public class FingerprintEnroll extends SettingsActivity {

                case EnrollingStart:
                    mEnrollmentSteps = -1;
                    long challenge = 0x12345; // TODO: get from keyguard confirmation
                    mFingerprintManager.enroll(challenge, mEnrollmentCancel, mEnrollmentCallback, 0);
                    // TODO: pass in mToken
                    mFingerprintManager.enroll(0, mEnrollmentCancel, mEnrollmentCallback, 0);
                    mProgressBar.setProgress(0);
                    mEnrolling = true;
                    startFingerprintAnimator(); // XXX hack - this should follow fingerprint detection
@@ -350,9 +351,12 @@ public class FingerprintEnroll extends SettingsActivity {
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST) {
                if (resultCode == RESULT_FINISHED) {
            if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST
                    || requestCode == CONFIRM_REQUEST) {
                if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) {
                    // The lock pin/pattern/password was set. Start enrolling!
                    mToken = data.getByteArrayExtra(
                            ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
                    updateStage(Stage.EnrollingFindSensor);
                }
            }
@@ -381,8 +385,8 @@ public class FingerprintEnroll extends SettingsActivity {
            }

            LockPatternUtils utils = new LockPatternUtils(activity);
            if (!utils.isSecure()) {
                // Device doesn't have any security. Set that up first.
            if (mToken == null) {
                // need to choose or confirm lock
                updateStage(Stage.EnrollingOnboard);
            } else if (ALWAYS_SHOW_FIND_SCREEN
                    || mFingerprintManager.getEnrolledFingerprints().size() == 0) {
@@ -397,6 +401,8 @@ public class FingerprintEnroll extends SettingsActivity {
        public void onSaveInstanceState(final Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString(EXTRA_STAGE, mStage.toString());
            outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
                    mToken);
            if (mStage == Stage.EnrollingRepeat) {
                outState.putInt(EXTRA_PROGRESS, mProgressBar.getProgress());
            }
@@ -406,6 +412,8 @@ public class FingerprintEnroll extends SettingsActivity {
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            if (savedInstanceState != null) {
                mToken = savedInstanceState.getByteArray(
                        ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
                //probably orientation change
                String stageSaved = savedInstanceState.getString(EXTRA_STAGE, null);
                if (stageSaved != null) {
@@ -426,7 +434,7 @@ public class FingerprintEnroll extends SettingsActivity {
                    break;
                case R.id.fingerprint_enroll_button_next:
                    if (mStage == Stage.EnrollingOnboard) {
                        launchChooseLock();
                        launchChooseOrConfirmLock();
                    } else if (mStage == Stage.EnrollingFindSensor) {
                        updateStage(Stage.EnrollingStart);
                    } else if (mStage == Stage.EnrollingFinish) {
@@ -438,13 +446,20 @@ public class FingerprintEnroll extends SettingsActivity {
            }
        }

        private void launchChooseLock() {
        private void launchChooseOrConfirmLock() {
            Intent intent = new Intent();
            long challenge = mFingerprintManager.preEnroll();
            ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this);
            if (!helper.launchConfirmationActivity(CONFIRM_REQUEST, null,
                        null, null, challenge)) {
                intent.setClassName("com.android.settings", ChooseLockGeneric.class.getName());
                intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
                intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true);
                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
                startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
            }
        }
    }
}
+69 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settings;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@@ -50,6 +51,16 @@ import java.util.List;
 * Settings screen for fingerprints
 */
public class FingerprintSettings extends SettingsActivity {
    /**
     * Used by the FP settings wizard to indicate the wizard is
     * finished, and each activity in the wizard should finish.
     * <p>
     * Previously, each activity in the wizard would finish itself after
     * starting the next activity. However, this leads to broken 'Back'
     * behavior. So, now an activity does not finish itself until it gets this
     * result.
     */
    static final int RESULT_FINISHED = RESULT_FIRST_USER;

    @Override
    public Intent getIntent() {
@@ -85,6 +96,9 @@ public class FingerprintSettings extends SettingsActivity {
        private static final int MSG_REFRESH_FINGERPRINT_TEMPLATES = 1000;
        private static final int MSG_HIGHLIGHT_FINGERPRINT_ITEM = 1001;

        private static final int CONFIRM_REQUEST = 101;
        private static final int CHOOSE_LOCK_GENERIC_REQUEST = 102;

        private static final int ADD_FINGERPRINT_REQUEST = 10;

        private static final boolean ENABLE_USAGE_CATEGORY = false;
@@ -95,6 +109,7 @@ public class FingerprintSettings extends SettingsActivity {
        private PreferenceGroup mManageCategory;
        private CancellationSignal mFingerprintCancel;
        private int mMaxFingerprintAttempts;
        private byte[] mToken;

        private AuthenticationCallback mAuthCallback = new AuthenticationCallback() {
            @Override
@@ -173,8 +188,18 @@ public class FingerprintSettings extends SettingsActivity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (savedInstanceState != null) {
                mToken = savedInstanceState.getByteArray(
                        ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
            }

            mFingerprintManager = (FingerprintManager) getActivity().getSystemService(
                    Context.FINGERPRINT_SERVICE);

            // Need to authenticate a session token if none
            if (mToken == null) {
                launchChooseOrConfirmLock();
            }
        }

        protected void removeFingerprintPreference(int fingerprintId) {
@@ -268,6 +293,7 @@ public class FingerprintSettings extends SettingsActivity {
            // Make sure we reload the preference hierarchy since fingerprints may be added,
            // deleted or renamed.
            createPreferenceHierarchy();

            retryFingerprint(true);
        }

@@ -277,6 +303,12 @@ public class FingerprintSettings extends SettingsActivity {
            stopFingerprint();
        }

        @Override
        public void onSaveInstanceState(final Bundle outState) {
            outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
                    mToken);
        }

        @Override
        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference pref) {
            final String key = pref.getKey();
@@ -343,6 +375,43 @@ public class FingerprintSettings extends SettingsActivity {
        protected int getHelpResource() {
            return R.string.help_url_security;
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST
                    || requestCode == CONFIRM_REQUEST) {
                if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) {
                    // The lock pin/pattern/password was set. Start enrolling!
                    if (data != null) {
                        mToken = data.getByteArrayExtra(
                                ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
                    }
                }
            }

            if (mToken == null) {
                // Didn't get an authentication, finishing
                getActivity().finish();
            }
        }

        private void launchChooseOrConfirmLock() {
            Intent intent = new Intent();
            long challenge = mFingerprintManager.preEnroll();
            ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this);
            // TODO: update text or remove params from method
            if (!helper.launchConfirmationActivity(CONFIRM_REQUEST, null,
                        null, null, challenge)) {
                intent.setClassName("com.android.settings", ChooseLockGeneric.class.getName());
                intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
                intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true);
                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
                startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
            }
        }
    }

    public static class FingerprintPreference extends Preference {