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

Commit 97ec4cc3 authored by Jason Chang's avatar Jason Chang
Browse files

Fix enrolled face id can't be deleted when changing device rotation

then pressing back key

Handling the back key to enable remove-button state when face
deleting dialog appears.

Bug: 323277209

Test: manually check the reproducible steps:

Pre-Condition (Skip if not available):
1. make sure face unlock has been set
2. enable auto-rotate

STEPS TO REPRODUCE:
1. go to "Face unlock" page
2. click "Delete face model"
3. rotate to landscape mode
4. swipe back then observe

Change-Id: I5e3a06229390609deb42544f545ec9a21d374245
parent 5a921fff
Loading
Loading
Loading
Loading
+46 −4
Original line number Diff line number Diff line
@@ -29,7 +29,9 @@ import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.window.OnBackInvokedCallback;

import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;

@@ -57,9 +59,14 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
    private static final String TAG = "FaceSettings/Remove";
    static final String KEY = "security_settings_face_delete_faces_container";

    public static class ConfirmRemoveDialog extends InstrumentedDialogFragment {
    public static class ConfirmRemoveDialog extends InstrumentedDialogFragment
            implements OnBackInvokedCallback {
        private static final String KEY_IS_CONVENIENCE = "is_convenience";
        private DialogInterface.OnClickListener mOnClickListener;
        @Nullable
        private AlertDialog mDialog = null;
        @Nullable
        private Preference mFaceUnlockPreference = null;

        /** Returns the new instance of the class */
        public static ConfirmRemoveDialog newInstance(boolean isConvenience) {
@@ -99,14 +106,41 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
                    .setMessage(dialogMessageRes)
                    .setPositiveButton(R.string.delete, mOnClickListener)
                    .setNegativeButton(R.string.cancel, mOnClickListener);
            AlertDialog dialog = builder.create();
            dialog.setCanceledOnTouchOutside(false);
            return dialog;
            mDialog = builder.create();
            mDialog.setCanceledOnTouchOutside(false);
            mDialog.getOnBackInvokedDispatcher().registerOnBackInvokedCallback(0, this);
            return mDialog;
        }

        public void setOnClickListener(DialogInterface.OnClickListener listener) {
            mOnClickListener = listener;
        }

        public void setPreference(@Nullable Preference preference) {
            mFaceUnlockPreference = preference;
        }

        public void unregisterOnBackInvokedCallback() {
            if (mDialog != null) {
                mDialog.getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(this);
            }
        }

        @Override
        public void onBackInvoked() {
            if (mDialog != null) {
                mDialog.cancel();
            }
            unregisterOnBackInvokedCallback();

            if (mFaceUnlockPreference != null) {
                final Button removeButton = ((LayoutPreference) mFaceUnlockPreference)
                        .findViewById(R.id.security_settings_face_settings_remove_button);
                if (removeButton != null) {
                    removeButton.setEnabled(true);
                }
            }
        }
    }

    interface Listener {
@@ -171,6 +205,13 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
                mButton.setEnabled(true);
                mRemoving = false;
            }

            final ConfirmRemoveDialog removeDialog =
                    (ConfirmRemoveDialog) mActivity.getSupportFragmentManager()
                            .findFragmentByTag(ConfirmRemoveDialog.class.getName());
            if (removeDialog != null) {
                removeDialog.unregisterOnBackInvokedCallback();
            }
        }
    };

@@ -210,6 +251,7 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
                (ConfirmRemoveDialog) mActivity.getSupportFragmentManager()
                        .findFragmentByTag(ConfirmRemoveDialog.class.getName());
        if (removeDialog != null) {
            removeDialog.setPreference(mPreference);
            mRemoving = true;
            removeDialog.setOnClickListener(mOnConfirmDialogClickListener);
        }