From 97ec4cc31e7af087c016c950a37acc9f4dd8e4fd Mon Sep 17 00:00:00 2001 From: Jason Chang Date: Tue, 6 Feb 2024 13:10:29 +0000 Subject: [PATCH] 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 --- ...tingsRemoveButtonPreferenceController.java | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java index 797364b18a8..ae5b62bcbd8 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java @@ -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); }