Implement SFPS “require screen on to auth”
Creates new setting on SFPS to require screen on before unlocking a device. Also sets up toggles for this setting at the end of fingerprint enrollment and on the fingerprint settings page, and adds tests to verify expected behavior. Test: make RunSettingsRoboTests ROBOTEST_FILTER=FingerprintSettingsRequireScreenOnToAuthPreferenceControllerTest Fixes: 249169615 Fixes: 245343077 Fixes: 248530806 Change-Id: Id588796426d071860b3cc2af9ec5798c0027c202
This commit is contained in:
@@ -56,21 +56,24 @@ import androidx.preference.Preference.OnPreferenceChangeListener;
|
||||
import androidx.preference.PreferenceGroup;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsPreferenceFragment;
|
||||
import com.android.settings.SubSettings;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.biometrics.BiometricEnrollBase;
|
||||
import com.android.settings.biometrics.BiometricUtils;
|
||||
import com.android.settings.core.SettingsBaseActivity;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.password.ChooseLockGeneric;
|
||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||
import com.android.settingslib.HelpUtils;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||
import com.android.settingslib.RestrictedSwitchPreference;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.transition.SettingsTransitionHelper;
|
||||
import com.android.settingslib.widget.FooterPreference;
|
||||
import com.android.settingslib.widget.TwoTargetPreference;
|
||||
@@ -115,7 +118,26 @@ public class FingerprintSettings extends SubSettings {
|
||||
setTitle(msg);
|
||||
}
|
||||
|
||||
public static class FingerprintSettingsFragment extends SettingsPreferenceFragment
|
||||
/**
|
||||
* @param context
|
||||
* @return true if the Fingerprint hardware is detected.
|
||||
*/
|
||||
public static boolean isFingerprintHardwareDetected(Context context) {
|
||||
FingerprintManager manager = Utils.getFingerprintManagerOrNull(context);
|
||||
boolean isHardwareDetected = false;
|
||||
if (manager == null) {
|
||||
Log.d(TAG, "FingerprintManager is null");
|
||||
} else {
|
||||
isHardwareDetected = manager.isHardwareDetected();
|
||||
Log.d(TAG, "FingerprintManager is not null. Hardware detected: " + isHardwareDetected);
|
||||
}
|
||||
return manager != null && isHardwareDetected;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static class FingerprintSettingsFragment extends DashboardFragment
|
||||
implements OnPreferenceChangeListener, FingerprintPreference.OnDeleteClickListener {
|
||||
|
||||
private static class FooterColumn {
|
||||
@@ -134,6 +156,8 @@ public class FingerprintSettings extends SubSettings {
|
||||
private static final String KEY_LAUNCHED_CONFIRM = "launched_confirm";
|
||||
private static final String KEY_HAS_FIRST_ENROLLED = "has_first_enrolled";
|
||||
private static final String KEY_IS_ENROLLING = "is_enrolled";
|
||||
private static final String KEY_REQUIRE_SCREEN_ON_TO_AUTH =
|
||||
"security_settings_require_screen_on_to_auth";
|
||||
|
||||
private static final int MSG_REFRESH_FINGERPRINT_TEMPLATES = 1000;
|
||||
private static final int MSG_FINGER_AUTH_SUCCESS = 1001;
|
||||
@@ -149,6 +173,11 @@ public class FingerprintSettings extends SubSettings {
|
||||
|
||||
protected static final boolean DEBUG = false;
|
||||
|
||||
private List<AbstractPreferenceController> mControllers;
|
||||
private FingerprintSettingsRequireScreenOnToAuthPreferenceController
|
||||
mRequireScreenOnToAuthPreferenceController;
|
||||
private RestrictedSwitchPreference mRequireScreenOnToAuthPreference;
|
||||
|
||||
private FingerprintManager mFingerprintManager;
|
||||
private FingerprintUpdater mFingerprintUpdater;
|
||||
private List<FingerprintSensorPropertiesInternal> mSensorProperties;
|
||||
@@ -214,6 +243,7 @@ public class FingerprintSettings extends SubSettings {
|
||||
}
|
||||
|
||||
private void updateDialog() {
|
||||
setRequireScreenOnToAuthVisibility();
|
||||
RenameDialog renameDialog = (RenameDialog) getFragmentManager().
|
||||
findFragmentByTag(RenameDialog.class.getName());
|
||||
if (renameDialog != null) {
|
||||
@@ -448,13 +478,36 @@ public class FingerprintSettings extends SubSettings {
|
||||
if (root != null) {
|
||||
root.removeAll();
|
||||
}
|
||||
addPreferencesFromResource(R.xml.security_settings_fingerprint);
|
||||
root = getPreferenceScreen();
|
||||
addFingerprintItemPreferences(root);
|
||||
addPreferencesFromResource(getPreferenceScreenResId());
|
||||
mRequireScreenOnToAuthPreference = findPreference(KEY_REQUIRE_SCREEN_ON_TO_AUTH);
|
||||
for (AbstractPreferenceController controller : mControllers) {
|
||||
((FingerprintSettingsPreferenceController) controller).setUserId(mUserId);
|
||||
}
|
||||
mRequireScreenOnToAuthPreference.setChecked(
|
||||
mRequireScreenOnToAuthPreferenceController.isChecked());
|
||||
mRequireScreenOnToAuthPreference.setOnPreferenceChangeListener(
|
||||
(preference, newValue) -> {
|
||||
boolean isChecked = ((SwitchPreference) preference).isChecked();
|
||||
mRequireScreenOnToAuthPreferenceController.setChecked(!isChecked);
|
||||
return true;
|
||||
});
|
||||
setPreferenceScreen(root);
|
||||
return root;
|
||||
}
|
||||
|
||||
private void setRequireScreenOnToAuthVisibility() {
|
||||
int fingerprintsEnrolled = mFingerprintManager.getEnrolledFingerprints(mUserId).size();
|
||||
final boolean removalInProgress = mRemovalSidecar.inProgress();
|
||||
// Removing last remaining fingerprint
|
||||
if (fingerprintsEnrolled == 0 && removalInProgress) {
|
||||
mRequireScreenOnToAuthPreference.setVisible(false);
|
||||
} else {
|
||||
mRequireScreenOnToAuthPreference.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void addFingerprintItemPreferences(PreferenceGroup root) {
|
||||
root.removeAll();
|
||||
final List<Fingerprint> items = mFingerprintManager.getEnrolledFingerprints(mUserId);
|
||||
@@ -477,6 +530,7 @@ public class FingerprintSettings extends SubSettings {
|
||||
root.addPreference(pref);
|
||||
pref.setOnPreferenceChangeListener(this);
|
||||
}
|
||||
|
||||
Preference addPreference = new Preference(root.getContext());
|
||||
addPreference.setKey(KEY_FINGERPRINT_ADD);
|
||||
addPreference.setTitle(R.string.fingerprint_add_title);
|
||||
@@ -568,6 +622,16 @@ public class FingerprintSettings extends SubSettings {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.security_settings_fingerprint;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLogTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(final Bundle outState) {
|
||||
outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
|
||||
@@ -662,6 +726,27 @@ public class FingerprintSettings extends SubSettings {
|
||||
return R.string.help_url_fingerprint;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||
if (!isFingerprintHardwareDetected(context)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
mControllers = buildPreferenceControllers(context);
|
||||
return mControllers;
|
||||
}
|
||||
|
||||
private List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
|
||||
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||
mRequireScreenOnToAuthPreferenceController =
|
||||
new FingerprintSettingsRequireScreenOnToAuthPreferenceController(
|
||||
context,
|
||||
KEY_REQUIRE_SCREEN_ON_TO_AUTH
|
||||
);
|
||||
controllers.add(mRequireScreenOnToAuthPreferenceController);
|
||||
return controllers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
Reference in New Issue
Block a user