Properly remove fingerprints when removing device lock.

When strong auth (PIN, password, or pattern) is removed from a user,
fingerprints enrolled for that user should also be removed. Then, if the
user has a work profile guarded by a unified work challenge, the work
profile's fingerprints should also be removed.

Previously, when removing the fingerprints of the current user,
ChooseLockGeneric checked the finger id of the onRemovalSucceeded() and
onRemovalError() callbacks, and assumed the removal had completed when
the id was 0. Only after this would it initiate the removal of work
profile fingerprints, if any.

However, the finger id is actually non-zero even for the user's last
fingerprint. This means the work profile fingerprints (under unified
challenge) were never removed. Another more visible symptom was that
when the user removed the device lock by choosing "None" or "Swipe" in
ChooseLockGeneric, the activity failed to exit, since finish() is called
only at the end of the removal flow which was not executed.

In this CL, we check the number of remaining fingerprints instead of
relying on the finger id, thus allowing the removal flow to complete and
the activity to finish().

Bug: 37938345
Test: manual, both with and without work profile
Test: make SettingsRoboTests
Change-Id: Ic04fd01177ad6d4a061023a4b6889af585f8f2b7
This commit is contained in:
Charles He
2017-05-11 19:51:46 +01:00
parent 49b86b5c6a
commit 7569bb1881
2 changed files with 8 additions and 7 deletions

View File

@@ -722,15 +722,16 @@ public class ChooseLockGeneric extends SettingsActivity {
@Override
public void onRemovalError(Fingerprint fp, int errMsgId,
CharSequence errString) {
Log.v(TAG, "Fingerprint removed: " + fp.getFingerId());
if (fp.getFingerId() == 0) {
removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
}
Log.e(TAG, String.format(
"Can't remove fingerprint %d in group %d. Reason: %s",
fp.getFingerId(), fp.getGroupId(), errString));
// TODO: need to proceed with the removal of managed profile
// fingerprints and finish() gracefully.
}
@Override
public void onRemovalSucceeded(Fingerprint fingerprint) {
if (fingerprint.getFingerId() == 0) {
public void onRemovalSucceeded(Fingerprint fp, int remaining) {
if (remaining == 0) {
removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
}
}

View File

@@ -53,7 +53,7 @@ public class FingerprintRemoveSidecar extends InstrumentedPreferenceFragment {
private FingerprintManager.RemovalCallback
mRemoveCallback = new FingerprintManager.RemovalCallback() {
@Override
public void onRemovalSucceeded(Fingerprint fingerprint) {
public void onRemovalSucceeded(Fingerprint fingerprint, int remaining) {
if (mListener != null) {
mListener.onRemovalSucceeded(fingerprint);
} else {