Refresh templates when fp removal fails
Test: atest Fixes: 339556796 Flag: EXEMPT bugfix Change-Id: I369e37f170a57bc9ced98f9728d06f2072c01263
This commit is contained in:
committed by
Joshua Mccloskey
parent
2004df98f1
commit
f624d6adf7
@@ -23,6 +23,7 @@ import android.os.Bundle;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
import com.android.settings.core.InstrumentedFragment;
|
import com.android.settings.core.InstrumentedFragment;
|
||||||
|
|
||||||
@@ -51,7 +52,8 @@ public class FingerprintRemoveSidecar extends InstrumentedFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private FingerprintManager.RemovalCallback
|
@VisibleForTesting
|
||||||
|
FingerprintManager.RemovalCallback
|
||||||
mRemoveCallback = new FingerprintManager.RemovalCallback() {
|
mRemoveCallback = new FingerprintManager.RemovalCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onRemovalSucceeded(Fingerprint fingerprint, int remaining) {
|
public void onRemovalSucceeded(Fingerprint fingerprint, int remaining) {
|
||||||
|
@@ -226,6 +226,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
private static final int MSG_FINGER_AUTH_FAIL = 1002;
|
private static final int MSG_FINGER_AUTH_FAIL = 1002;
|
||||||
private static final int MSG_FINGER_AUTH_ERROR = 1003;
|
private static final int MSG_FINGER_AUTH_ERROR = 1003;
|
||||||
private static final int MSG_FINGER_AUTH_HELP = 1004;
|
private static final int MSG_FINGER_AUTH_HELP = 1004;
|
||||||
|
private static final int MSG_RELOAD_FINGERPRINT_TEMPLATES = 1005;
|
||||||
|
|
||||||
private static final int CONFIRM_REQUEST = 101;
|
private static final int CONFIRM_REQUEST = 101;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -313,6 +314,8 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
if (activity != null) {
|
if (activity != null) {
|
||||||
Toast.makeText(activity, errString, Toast.LENGTH_SHORT);
|
Toast.makeText(activity, errString, Toast.LENGTH_SHORT);
|
||||||
}
|
}
|
||||||
|
mHandler.obtainMessage(MSG_RELOAD_FINGERPRINT_TEMPLATES)
|
||||||
|
.sendToTarget();
|
||||||
updateDialog();
|
updateDialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,11 +334,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
switch (msg.what) {
|
switch (msg.what) {
|
||||||
case MSG_REFRESH_FINGERPRINT_TEMPLATES:
|
case MSG_REFRESH_FINGERPRINT_TEMPLATES:
|
||||||
removeFingerprintPreference(msg.arg1);
|
removeFingerprintPreference(msg.arg1);
|
||||||
updateAddPreference();
|
updatePreferencesAfterFingerprintRemoved();
|
||||||
if (isSfps()) {
|
|
||||||
updateFingerprintUnlockCategoryVisibility();
|
|
||||||
}
|
|
||||||
updatePreferences();
|
|
||||||
break;
|
break;
|
||||||
case MSG_FINGER_AUTH_SUCCESS:
|
case MSG_FINGER_AUTH_SUCCESS:
|
||||||
highlightFingerprintItem(msg.arg1);
|
highlightFingerprintItem(msg.arg1);
|
||||||
@@ -347,6 +346,9 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
case MSG_FINGER_AUTH_ERROR:
|
case MSG_FINGER_AUTH_ERROR:
|
||||||
handleError(msg.arg1 /* errMsgId */, (CharSequence) msg.obj /* errStr */);
|
handleError(msg.arg1 /* errMsgId */, (CharSequence) msg.obj /* errStr */);
|
||||||
break;
|
break;
|
||||||
|
case MSG_RELOAD_FINGERPRINT_TEMPLATES:
|
||||||
|
updatePreferencesAfterFingerprintRemoved();
|
||||||
|
break;
|
||||||
case MSG_FINGER_AUTH_HELP: {
|
case MSG_FINGER_AUTH_HELP: {
|
||||||
// Not used
|
// Not used
|
||||||
}
|
}
|
||||||
@@ -568,6 +570,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
|
|
||||||
protected void removeFingerprintPreference(int fingerprintId) {
|
protected void removeFingerprintPreference(int fingerprintId) {
|
||||||
String name = genKey(fingerprintId);
|
String name = genKey(fingerprintId);
|
||||||
|
Log.e(TAG, "removeFingerprintPreference : " + fingerprintId);
|
||||||
Preference prefToRemove = findPreference(name);
|
Preference prefToRemove = findPreference(name);
|
||||||
if (prefToRemove != null) {
|
if (prefToRemove != null) {
|
||||||
if (!getPreferenceScreen().removePreference(prefToRemove)) {
|
if (!getPreferenceScreen().removePreference(prefToRemove)) {
|
||||||
@@ -692,6 +695,13 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updatePreferencesAfterFingerprintRemoved() {
|
||||||
|
updateAddPreference();
|
||||||
|
if (isSfps()) {
|
||||||
|
updateFingerprintUnlockCategoryVisibility();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updateAddPreference() {
|
private void updateAddPreference() {
|
||||||
if (getActivity() == null) {
|
if (getActivity() == null) {
|
||||||
return; // Activity went away
|
return; // Activity went away
|
||||||
|
@@ -36,6 +36,7 @@ import static org.mockito.Mockito.mock;
|
|||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static org.robolectric.Shadows.shadowOf;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -44,11 +45,13 @@ import android.hardware.biometrics.BiometricManager;
|
|||||||
import android.hardware.biometrics.ComponentInfoInternal;
|
import android.hardware.biometrics.ComponentInfoInternal;
|
||||||
import android.hardware.biometrics.Flags;
|
import android.hardware.biometrics.Flags;
|
||||||
import android.hardware.biometrics.SensorProperties;
|
import android.hardware.biometrics.SensorProperties;
|
||||||
|
import android.hardware.fingerprint.Fingerprint;
|
||||||
import android.hardware.fingerprint.FingerprintManager;
|
import android.hardware.fingerprint.FingerprintManager;
|
||||||
import android.hardware.fingerprint.FingerprintSensorProperties;
|
import android.hardware.fingerprint.FingerprintSensorProperties;
|
||||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.CancellationSignal;
|
import android.os.CancellationSignal;
|
||||||
|
import android.os.Looper;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.platform.test.annotations.EnableFlags;
|
import android.platform.test.annotations.EnableFlags;
|
||||||
import android.platform.test.flag.junit.SetFlagsRule;
|
import android.platform.test.flag.junit.SetFlagsRule;
|
||||||
@@ -59,6 +62,7 @@ import android.view.ViewGroup;
|
|||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.fragment.app.FragmentTransaction;
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
import androidx.preference.Preference;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||||
@@ -87,6 +91,7 @@ import org.robolectric.RobolectricTestRunner;
|
|||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@Config(shadows = {ShadowSettingsPreferenceFragment.class, ShadowUtils.class, ShadowFragment.class,
|
@Config(shadows = {ShadowSettingsPreferenceFragment.class, ShadowUtils.class, ShadowFragment.class,
|
||||||
@@ -120,6 +125,7 @@ public class FingerprintSettingsFragmentTest {
|
|||||||
FingerprintManager.AuthenticationCallback.class);
|
FingerprintManager.AuthenticationCallback.class);
|
||||||
|
|
||||||
private FingerprintAuthenticateSidecar mFingerprintAuthenticateSidecar;
|
private FingerprintAuthenticateSidecar mFingerprintAuthenticateSidecar;
|
||||||
|
private FingerprintRemoveSidecar mFingerprintRemoveSidecar;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -216,7 +222,7 @@ public class FingerprintSettingsFragmentTest {
|
|||||||
1,
|
1,
|
||||||
UserHandle.of(GUEST_USER_ID).getIdentifier());
|
UserHandle.of(GUEST_USER_ID).getIdentifier());
|
||||||
|
|
||||||
setUpFragment(false, GUEST_USER_ID, TYPE_POWER_BUTTON);
|
setUpFragment(false, GUEST_USER_ID, TYPE_POWER_BUTTON, 1);
|
||||||
|
|
||||||
final RestrictedSwitchPreference requireScreenOnToAuthPreference = mFragment.findPreference(
|
final RestrictedSwitchPreference requireScreenOnToAuthPreference = mFragment.findPreference(
|
||||||
KEY_REQUIRE_SCREEN_ON_TO_AUTH);
|
KEY_REQUIRE_SCREEN_ON_TO_AUTH);
|
||||||
@@ -224,11 +230,15 @@ public class FingerprintSettingsFragmentTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setUpFragment(boolean showChooseLock) {
|
private void setUpFragment(boolean showChooseLock) {
|
||||||
setUpFragment(showChooseLock, PRIMARY_USER_ID, TYPE_UDFPS_OPTICAL);
|
setUpFragment(showChooseLock, PRIMARY_USER_ID, TYPE_UDFPS_OPTICAL, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpFragment(boolean showChooseLock, int maxFingerprints) {
|
||||||
|
setUpFragment(showChooseLock, PRIMARY_USER_ID, TYPE_UDFPS_OPTICAL, maxFingerprints);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpFragment(boolean showChooseLock, int userId,
|
private void setUpFragment(boolean showChooseLock, int userId,
|
||||||
@FingerprintSensorProperties.SensorType int sensorType) {
|
@FingerprintSensorProperties.SensorType int sensorType, int maxFingerprints) {
|
||||||
ShadowUserManager.getShadow().addProfile(new UserInfo(userId, "", 0));
|
ShadowUserManager.getShadow().addProfile(new UserInfo(userId, "", 0));
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
@@ -250,9 +260,13 @@ public class FingerprintSettingsFragmentTest {
|
|||||||
doReturn(mFingerprintAuthenticateSidecar).when(fragmentManager).findFragmentByTag(
|
doReturn(mFingerprintAuthenticateSidecar).when(fragmentManager).findFragmentByTag(
|
||||||
"authenticate_sidecar");
|
"authenticate_sidecar");
|
||||||
|
|
||||||
|
mFingerprintRemoveSidecar = new FingerprintRemoveSidecar();
|
||||||
|
doReturn(mFingerprintRemoveSidecar).when(fragmentManager).findFragmentByTag(
|
||||||
|
"removal_sidecar");
|
||||||
|
|
||||||
doNothing().when(mFragment).startActivityForResult(any(Intent.class), anyInt());
|
doNothing().when(mFragment).startActivityForResult(any(Intent.class), anyInt());
|
||||||
|
|
||||||
setSensor(sensorType);
|
setSensor(sensorType, maxFingerprints);
|
||||||
|
|
||||||
// Start fragment
|
// Start fragment
|
||||||
mFragment.onAttach(mContext);
|
mFragment.onAttach(mContext);
|
||||||
@@ -269,12 +283,38 @@ public class FingerprintSettingsFragmentTest {
|
|||||||
assertThat(mFragment.isVisible()).isTrue();
|
assertThat(mFragment.isVisible()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSensor(@FingerprintSensorProperties.SensorType int sensorType) {
|
@Ignore("b/353726774")
|
||||||
|
@Test
|
||||||
|
public void testAddButtonWorksAfterRemovalError() {
|
||||||
|
final Fingerprint fingerprint = new Fingerprint("Test", 0, 0);
|
||||||
|
doReturn(List.of(fingerprint)).when(mFingerprintManager).getEnrolledFingerprints(anyInt());
|
||||||
|
setUpFragment(false, 5);
|
||||||
|
shadowOf(Looper.getMainLooper()).idle();
|
||||||
|
final Preference addPref = mFragment.findPreference("key_fingerprint_add");
|
||||||
|
final FingerprintSettings.FingerprintPreference fpPref =
|
||||||
|
mFragment.findPreference("key_fingerprint_item_0");
|
||||||
|
assertThat(fpPref).isNotNull();
|
||||||
|
assertThat(addPref).isNotNull();
|
||||||
|
assertThat(addPref.isEnabled()).isTrue();
|
||||||
|
|
||||||
|
mFingerprintRemoveSidecar.setListener(mFragment.mRemovalListener);
|
||||||
|
mFragment.deleteFingerPrint(fingerprint);
|
||||||
|
verify(mFingerprintManager).remove(any(), anyInt(), any());
|
||||||
|
assertThat(addPref.isEnabled()).isFalse();
|
||||||
|
|
||||||
|
mFingerprintRemoveSidecar.mRemoveCallback.onRemovalError(fingerprint, 0, "failure");
|
||||||
|
|
||||||
|
shadowOf(Looper.getMainLooper()).idle();
|
||||||
|
assertThat(addPref.isEnabled()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSensor(@FingerprintSensorProperties.SensorType int sensorType,
|
||||||
|
int maxFingerprints) {
|
||||||
final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
|
final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
|
||||||
props.add(new FingerprintSensorPropertiesInternal(
|
props.add(new FingerprintSensorPropertiesInternal(
|
||||||
0 /* sensorId */,
|
0 /* sensorId */,
|
||||||
SensorProperties.STRENGTH_STRONG,
|
SensorProperties.STRENGTH_STRONG,
|
||||||
1 /* maxEnrollmentsPerUser */,
|
maxFingerprints /* maxEnrollmentsPerUser */,
|
||||||
new ArrayList<ComponentInfoInternal>(),
|
new ArrayList<ComponentInfoInternal>(),
|
||||||
sensorType,
|
sensorType,
|
||||||
true /* resetLockoutRequiresHardwareAuthToken */));
|
true /* resetLockoutRequiresHardwareAuthToken */));
|
||||||
|
Reference in New Issue
Block a user