diff --git a/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java deleted file mode 100644 index e98ea4deec7..00000000000 --- a/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.settings.fingerprint; - -import android.annotation.Nullable; -import android.app.Activity; -import android.content.Context; -import android.hardware.fingerprint.Fingerprint; -import android.hardware.fingerprint.FingerprintManager; -import android.os.Bundle; -import com.android.settings.Utils; -import com.android.settings.core.lifecycle.ObservablePreferenceFragment; -import android.os.UserHandle; -import java.util.Queue; -import java.util.LinkedList; -import android.util.Log; - -/** - * Sidecar fragment to handle the state around fingerprint removal. - */ -public class FingerprintRemoveSidecar extends ObservablePreferenceFragment { - - private static final String TAG = "FingerprintRemoveSidecar"; - private Listener mListener; - private Fingerprint mFingerprintRemoving; - private Queue mFingerprintsRemoved; - FingerprintManager mFingerprintManager; - - private class RemovalError { - Fingerprint fingerprint; - int errMsgId; - CharSequence errString; - public RemovalError(Fingerprint fingerprint, int errMsgId, CharSequence errString) { - this.fingerprint = fingerprint; - this.errMsgId = errMsgId; - this.errString = errString; - } - } - - private FingerprintManager.RemovalCallback - mRemoveCallback = new FingerprintManager.RemovalCallback() { - @Override - public void onRemovalSucceeded(Fingerprint fingerprint) { - if (mListener != null) { - mListener.onRemovalSucceeded(fingerprint); - } else { - mFingerprintsRemoved.add(fingerprint); - }; - mFingerprintRemoving = null; - } - - @Override - public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) { - if (mListener != null) { - mListener.onRemovalError(fp, errMsgId, errString); - } else { - mFingerprintsRemoved.add(new RemovalError(fp, errMsgId, errString)); - } - mFingerprintRemoving = null; - } - }; - - public void startRemove(Fingerprint fingerprint, int userId) { - if (mFingerprintRemoving != null) { - Log.e(TAG, "Remove already in progress"); - return; - } - if (userId != UserHandle.USER_NULL) { - mFingerprintManager.setActiveUser(userId); - } - mFingerprintRemoving = fingerprint; - mFingerprintManager.remove(fingerprint, userId, mRemoveCallback);; - } - - public FingerprintRemoveSidecar() { - mFingerprintsRemoved = new LinkedList<>(); - } - - public void setFingerprintManager(FingerprintManager fingerprintManager) { - mFingerprintManager = fingerprintManager; - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - } - - @Override - public void onResume() { - super.onResume(); - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - } - - public void setListener(Listener listener) { - if (mListener == null && listener != null) { - while (!mFingerprintsRemoved.isEmpty()) { - Object o = mFingerprintsRemoved.poll(); - if (o instanceof Fingerprint) { - listener.onRemovalSucceeded((Fingerprint)o); - } else if (o instanceof RemovalError) { - RemovalError e = (RemovalError) o; - listener.onRemovalError(e.fingerprint, e.errMsgId, e.errString); - } - } - } - mListener = listener; - } - - public interface Listener { - void onRemovalSucceeded(Fingerprint fingerprint); - void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString); - } - - final boolean isRemovingFingerprint(int fid) { - return inProgress() && mFingerprintRemoving.getFingerId() == fid; - } - - final boolean inProgress() { - return mFingerprintRemoving != null; - } - -} diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java index 5c76650ea64..0f48f8c0b10 100644 --- a/src/com/android/settings/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/fingerprint/FingerprintSettings.java @@ -31,6 +31,7 @@ import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback; import android.hardware.fingerprint.FingerprintManager.AuthenticationResult; +import android.hardware.fingerprint.FingerprintManager.RemovalCallback; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; @@ -63,11 +64,11 @@ import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.widget.FooterPreference; +import com.android.settings.widget.FooterPreferenceMixin; import com.android.settingslib.HelpUtils; import com.android.settingslib.RestrictedLockUtils; import java.util.List; -import java.util.HashMap; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; @@ -159,10 +160,6 @@ public class FingerprintSettings extends SubSettings { private Drawable mHighlightDrawable; private int mUserId; - private static final String TAG_REMOVAL_SIDECAR = "removal_sidecar"; - private FingerprintRemoveSidecar mRemovalSidecar; - private HashMap mFingerprintsRenaming; - private AuthenticationCallback mAuthCallback = new AuthenticationCallback() { @Override public void onAuthenticationSucceeded(AuthenticationResult result) { @@ -187,30 +184,22 @@ public class FingerprintSettings extends SubSettings { .sendToTarget(); } }; + private RemovalCallback mRemoveCallback = new RemovalCallback() { - FingerprintRemoveSidecar.Listener mRemovalListener = - new FingerprintRemoveSidecar.Listener() { + @Override public void onRemovalSucceeded(Fingerprint fingerprint) { mHandler.obtainMessage(MSG_REFRESH_FINGERPRINT_TEMPLATES, fingerprint.getFingerId(), 0).sendToTarget(); - updateDialog(); } + + @Override public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) { final Activity activity = getActivity(); if (activity != null) { Toast.makeText(activity, errString, Toast.LENGTH_SHORT); } - updateDialog(); - } - private void updateDialog() { - RenameDeleteDialog renameDeleteDialog = (RenameDeleteDialog)getFragmentManager(). - findFragmentByTag(RenameDeleteDialog.class.getName()); - if (renameDeleteDialog != null) { - renameDeleteDialog.enableDelete(); - } } }; - private final Handler mHandler = new Handler() { @Override public void handleMessage(android.os.Message msg) { @@ -274,9 +263,6 @@ public class FingerprintSettings extends SubSettings { } private void retryFingerprint() { - if (mRemovalSidecar.inProgress()) { - return; - } if (!mInFingerprintLockout) { mFingerprintCancel = new CancellationSignal(); mFingerprintManager.authenticate(null, mFingerprintCancel, 0 /* flags */, @@ -292,31 +278,7 @@ public class FingerprintSettings extends SubSettings { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - Activity activity = getActivity(); - mFingerprintManager = Utils.getFingerprintManagerOrNull(activity); - - mRemovalSidecar = (FingerprintRemoveSidecar) - getFragmentManager().findFragmentByTag(TAG_REMOVAL_SIDECAR); - if (mRemovalSidecar == null) { - mRemovalSidecar = new FingerprintRemoveSidecar(); - getFragmentManager().beginTransaction() - .add(mRemovalSidecar, TAG_REMOVAL_SIDECAR).commit(); - } - mRemovalSidecar.setFingerprintManager(mFingerprintManager); - mRemovalSidecar.setListener(mRemovalListener); - - RenameDeleteDialog renameDeleteDialog = (RenameDeleteDialog)getFragmentManager(). - findFragmentByTag(RenameDeleteDialog.class.getName()); - if (renameDeleteDialog != null) { - renameDeleteDialog.setDeleteInProgress(mRemovalSidecar.inProgress()); - } - - mFingerprintsRenaming = new HashMap(); - if (savedInstanceState != null) { - mFingerprintsRenaming = (HashMap) - savedInstanceState.getSerializable("mFingerprintsRenaming"); mToken = savedInstanceState.getByteArray( ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); mLaunchedConfirm = savedInstanceState.getBoolean( @@ -325,6 +287,9 @@ public class FingerprintSettings extends SubSettings { mUserId = getActivity().getIntent().getIntExtra( Intent.EXTRA_USER_ID, UserHandle.myUserId()); + Activity activity = getActivity(); + mFingerprintManager = Utils.getFingerprintManagerOrNull(activity); + // Need to authenticate a session token if none if (mToken == null && mLaunchedConfirm == false) { mLaunchedConfirm = true; @@ -382,12 +347,6 @@ public class FingerprintSettings extends SubSettings { pref.setFingerprint(item); pref.setPersistent(false); pref.setIcon(R.drawable.ic_fingerprint_24dp); - if (mRemovalSidecar.isRemovingFingerprint(item.getFingerId())) { - pref.setEnabled(false); - } - if (mFingerprintsRenaming.containsKey(item.getFingerId())) { - pref.setTitle(mFingerprintsRenaming.get(item.getFingerId())); - } root.addPreference(pref); pref.setOnPreferenceChangeListener(this); } @@ -405,14 +364,11 @@ public class FingerprintSettings extends SubSettings { final int max = getContext().getResources().getInteger( com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser); boolean tooMany = mFingerprintManager.getEnrolledFingerprints(mUserId).size() >= max; - // retryFingerprint() will be called when remove finishes - // need to disable enroll or have a way to determine if enroll is in progress - final boolean removalInProgress = mRemovalSidecar.inProgress(); CharSequence maxSummary = tooMany ? getContext().getString(R.string.fingerprint_add_max, max) : ""; Preference addPreference = findPreference(KEY_FINGERPRINT_ADD); addPreference.setSummary(maxSummary); - addPreference.setEnabled(!tooMany && !removalInProgress); + addPreference.setEnabled(!tooMany); } private static String genKey(int id) { @@ -443,7 +399,6 @@ public class FingerprintSettings extends SubSettings { outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken); outState.putBoolean(KEY_LAUNCHED_CONFIRM, mLaunchedConfirm); - outState.putSerializable("mFingerprintsRenaming", mFingerprintsRenaming); } @Override @@ -458,7 +413,7 @@ public class FingerprintSettings extends SubSettings { startActivityForResult(intent, ADD_FINGERPRINT_REQUEST); } else if (pref instanceof FingerprintPreference) { FingerprintPreference fpref = (FingerprintPreference) pref; - final Fingerprint fp = fpref.getFingerprint(); + final Fingerprint fp =fpref.getFingerprint(); showRenameDeleteDialog(fp); return super.onPreferenceTreeClick(pref); } @@ -468,14 +423,7 @@ public class FingerprintSettings extends SubSettings { private void showRenameDeleteDialog(final Fingerprint fp) { RenameDeleteDialog renameDeleteDialog = new RenameDeleteDialog(); Bundle args = new Bundle(); - if (mFingerprintsRenaming.containsKey(fp.getFingerId())) { - final Fingerprint f = new Fingerprint(mFingerprintsRenaming.get(fp.getFingerId()), - fp.getGroupId(), fp.getFingerId(), fp.getDeviceId()); - args.putParcelable("fingerprint", f); - } else { - args.putParcelable("fingerprint", fp); - } - renameDeleteDialog.setDeleteInProgress(mRemovalSidecar.inProgress()); + args.putParcelable("fingerprint", fp); renameDeleteDialog.setArguments(args); renameDeleteDialog.setTargetFragment(this, 0); renameDeleteDialog.show(getFragmentManager(), RenameDeleteDialog.class.getName()); @@ -533,7 +481,6 @@ public class FingerprintSettings extends SubSettings { Log.w(TAG, "postEnroll failed: result = " + result); } } - mRemovalSidecar.setListener(null); } private Drawable getHighlightDrawable() { @@ -588,16 +535,11 @@ public class FingerprintSettings extends SubSettings { } private void deleteFingerPrint(Fingerprint fingerPrint) { - mRemovalSidecar.startRemove(fingerPrint, mUserId); - String name = genKey(fingerPrint.getFingerId()); - Preference prefToRemove = findPreference(name); - prefToRemove.setEnabled(false); - updateAddPreference(); + mFingerprintManager.remove(fingerPrint, mUserId, mRemoveCallback); } private void renameFingerPrint(int fingerId, String newName) { mFingerprintManager.rename(fingerId, mUserId, newName); - mFingerprintsRenaming.put(fingerId, newName); updatePreferences(); } @@ -617,12 +559,7 @@ public class FingerprintSettings extends SubSettings { private Boolean mTextHadFocus; private int mTextSelectionStart; private int mTextSelectionEnd; - private AlertDialog mAlertDialog; - private boolean mDeleteInProgress; - public void setDeleteInProgress(boolean deleteInProgress) { - mDeleteInProgress = deleteInProgress; - } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { mFp = getArguments().getParcelable("fingerprint"); @@ -632,7 +569,7 @@ public class FingerprintSettings extends SubSettings { mTextSelectionStart = savedInstanceState.getInt("startSelection"); mTextSelectionEnd = savedInstanceState.getInt("endSelection"); } - mAlertDialog = new AlertDialog.Builder(getActivity()) + final AlertDialog alertDialog = new AlertDialog.Builder(getActivity()) .setView(R.layout.fingerprint_rename_dialog) .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok, new DialogInterface.OnClickListener() { @@ -666,10 +603,10 @@ public class FingerprintSettings extends SubSettings { } }) .create(); - mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() { + alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { - mDialogTextField = (EditText) mAlertDialog.findViewById( + mDialogTextField = (EditText) alertDialog.findViewById( R.id.fingerprint_rename_field); CharSequence name = mFingerName == null ? mFp.getName() : mFingerName; mDialogTextField.setText(name); @@ -678,24 +615,14 @@ public class FingerprintSettings extends SubSettings { } else { mDialogTextField.setSelection(mTextSelectionStart, mTextSelectionEnd); } - if (mDeleteInProgress) { - mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false); - } } }); if (mTextHadFocus == null || mTextHadFocus) { // Request the IME - mAlertDialog.getWindow().setSoftInputMode( + alertDialog.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } - return mAlertDialog; - } - - public void enableDelete() { - mDeleteInProgress = false; - if (mAlertDialog != null) { - mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(true); - } + return alertDialog; } private void onDeleteClick(DialogInterface dialog) {