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

Commit b979a38c authored by Kevin Chyn's avatar Kevin Chyn Committed by Android (Google) Code Review
Browse files

Merge changes from topic "face-settings-challenge" into qt-r1-dev

* changes:
  Resolve challenge lifecycle race conditions
  Revert "Add generateChallenge() in onResume()"
parents dd1545b0 f20bb1c6
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ public class FaceSettings extends DashboardFragment {
    private Preference mRemoveButton;
    private Preference mEnrollButton;

    private boolean mConfirmingPassword;

    private final FaceSettingsRemoveButtonPreferenceController.Listener mRemovalListener = () -> {

        // Disable the toggles until the user re-enrolls
@@ -150,9 +152,15 @@ public class FaceSettings extends DashboardFragment {
    @Override
    public void onResume() {
        super.onResume();
        if (mToken == null) {

        if (mToken == null && !mConfirmingPassword) {
            // Generate challenge in onResume instead of onCreate, since FaceSettings can be
            // created while Keyguard is showing, in which case the resetLockout revokeChallenge
            // will invalidate the too-early created challenge here.
            final long challenge = mFaceManager.generateChallenge();
            ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this);

            mConfirmingPassword = true;
            if (!helper.launchConfirmationActivity(CONFIRM_REQUEST,
                    getString(R.string.security_settings_face_preference_title),
                    null, null, challenge, mUserId)) {
@@ -173,6 +181,7 @@ public class FaceSettings extends DashboardFragment {
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CONFIRM_REQUEST) {
            mConfirmingPassword = false;
            if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) {
                mFaceManager.setActiveUser(mUserId);
                // The pin/pattern/password was set.
@@ -196,11 +205,19 @@ public class FaceSettings extends DashboardFragment {
    @Override
    public void onStop() {
        super.onStop();
        mToken = null;

        if (!mEnrollController.isClicked() && !getActivity().isChangingConfigurations()
                && !mConfirmingPassword) {
            // Revoke challenge and finish
            if (mToken != null) {
                final int result = mFaceManager.revokeChallenge();
                if (result < 0) {
                    Log.w(TAG, "revokeChallenge failed, result: " + result);
                }
                mToken = null;
            }
            getActivity().finish();
        }
    }

    @Override
+9 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference
    private byte[] mToken;
    private SettingsActivity mActivity;
    private Button mButton;
    private boolean mIsClicked;

    public FaceSettingsEnrollButtonPreferenceController(Context context) {
        this(context, KEY);
@@ -63,6 +64,7 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference

    @Override
    public void onClick(View v) {
        mIsClicked = true;
        final Intent intent = new Intent();
        intent.setClassName("com.android.settings", FaceEnrollIntroduction.class.getName());
        intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
@@ -83,6 +85,13 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference
        mToken = token;
    }

    // Return the click state, then clear its state.
    public boolean isClicked() {
        final boolean wasClicked = mIsClicked;
        mIsClicked = false;
        return wasClicked;
    }

    public void setActivity(SettingsActivity activity) {
        mActivity = activity;
    }