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
Merged-In: Ia44604b059c4847c40608419b2e16219976ced3e
This commit is contained in:
Grace Cheng
2022-10-06 11:44:26 +00:00
committed by Joshua Mccloskey
parent 7a8a9e4fba
commit 13d3bdc4c0
10 changed files with 623 additions and 10 deletions

View File

@@ -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);