Loading res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -965,6 +965,8 @@ <string name="security_settings_fingerprint">Fingerprint</string> <!-- Title shown for a category shown for fingerprint settings page. [CHAR LIMIT=22] --> <string name="security_settings_fingerprint_title">Fingerprints</string> <!-- Description shown for fingerprint settings page. [CHAR LIMIT=22] --> <string name="security_settings_fingerprint_description"></string> <!-- Fingerprint category title - fingerprint options for unlocking the device. [CHAR LIMIT=60] --> <string name="security_settings_category_use_fingerprint">Use fingerprint to</string> <!-- Title shown for menu item that launches fingerprint settings or enrollment [CHAR LIMIT=22] --> res/xml/security_settings_fingerprint.xml +5 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,11 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/security_settings_fingerprint_preference_title"> <com.android.settingslib.widget.TopIntroPreference android:key="security_settings_fingerprint_description" settings:searchable="false" settings:isPreferenceVisible="false" /> <PreferenceCategory android:key="biometric_settings_use_fingerprint_to" android:title="@string/security_settings_category_use_fingerprint" Loading src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java +9 −0 Original line number Diff line number Diff line Loading @@ -71,4 +71,13 @@ public interface FingerprintFeatureProvider { ) { return new FingerprintExtPreferencesProvider(); } /** * Gets the feature provider for FingerprintSettings page * @return the provider */ @NonNull default FingerprintSettingsFeatureProvider getFingerprintSettingsFeatureProvider() { return FingerprintSettingsFeatureProvider.getInstance(); } } src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +76 −19 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import static com.android.settings.Utils.isPrivateProfile; import static com.android.settings.biometrics.BiometricEnrollBase.BIOMETRIC_AUTH_REQUEST; import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY; import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_CHALLENGE; import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; import android.annotation.SuppressLint; import android.app.Activity; Loading @@ -37,6 +39,7 @@ import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.ResourceId; import android.graphics.drawable.Drawable; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; Loading Loading @@ -276,6 +279,8 @@ public class FingerprintSettings extends SubSettings { "security_settings_fingerprint_unlock_category"; private static final String KEY_FINGERPRINT_UNLOCK_FOOTER = "security_settings_fingerprint_footer"; private static final String KEY_FINGERPRINT_DESCRIPTION = "security_settings_fingerprint_description"; private static final String KEY_BIOMETRICS_AUTHENTICATION_REQUESTED = "biometrics_authentication_requested"; private static final String KEY_BIOMETRICS_USE_FINGERPRINT_TO_CATEGORY = Loading Loading @@ -648,13 +653,16 @@ public class FingerprintSettings extends SubSettings { mFooterColumns.add(column2); } else { final FooterColumn column = new FooterColumn(); final FingerprintSettingsFeatureProvider featureProvider = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() .getFingerprintSettingsFeatureProvider(); column.mTitle = getString(isPrivateProfile() ? R.string.private_space_fingerprint_enroll_introduction_message : R.string.security_settings_fingerprint_enroll_introduction_v3_message, DeviceHelper.getDeviceName(getActivity())); column.mLearnMoreClickListener = learnMoreClickListener; column.mLearnMoreOverrideText = getText( R.string.security_settings_fingerprint_settings_footer_learn_more); featureProvider.getSettingPageFooterLearnMoreDescription()); mFooterColumns.add(column); } } Loading Loading @@ -735,6 +743,14 @@ public class FingerprintSettings extends SubSettings { scrollToPreference(fpPrefKey); addFingerprintUnlockCategory(); } final int descriptionRes = FeatureFactory.getFeatureFactory() .getFingerprintFeatureProvider().getFingerprintSettingsFeatureProvider() .getSettingPageDescription(); if (ResourceId.isValid(descriptionRes)) { final Preference preference = findPreference(KEY_FINGERPRINT_DESCRIPTION); preference.setTitle(descriptionRes); preference.setVisible(true); } createFooterPreference(root); } Loading @@ -748,8 +764,7 @@ public class FingerprintSettings extends SubSettings { R.string.security_settings_fingerprint_title)); } String keyToReturn = mIsExpressiveThemeStyle ? KEY_FINGERPRINT_ADD_EXPRESSIVE : KEY_FINGERPRINT_ADD; String keyToReturn = getAddFingerprintPreferenceKey(); final List<Fingerprint> items = mFingerprintManager.getEnrolledFingerprints(mUserId); final int fingerprintCount = items.size(); for (int i = 0; i < fingerprintCount; i++) { Loading Loading @@ -785,8 +800,7 @@ public class FingerprintSettings extends SubSettings { mFingerprintsEnrolledCategory.addPreference(pref); pref.setOnPreferenceChangeListener(this); } mAddFingerprintPreference = findPreference(mIsExpressiveThemeStyle ? KEY_FINGERPRINT_ADD_EXPRESSIVE : KEY_FINGERPRINT_ADD); mAddFingerprintPreference = findPreference(getAddFingerprintPreferenceKey()); setupAddFingerprintPreference(); return keyToReturn; } Loading Loading @@ -839,18 +853,31 @@ public class FingerprintSettings extends SubSettings { } private void updateFingerprintUnlockCategoryVisibility() { final boolean fingerprintUnlockCategoryAvailable = mFingerprintUnlockCategoryPreferenceController.isAvailable(); if (mFingerprintUnlockCategory.isVisible() != fingerprintUnlockCategoryAvailable) { mFingerprintUnlockCategory.setVisible(fingerprintUnlockCategoryAvailable); } final int categoryStatus = mFingerprintUnlockCategoryPreferenceController.getAvailabilityStatus(); updatePreferenceVisibility(categoryStatus, mFingerprintUnlockCategory); if (mRequireScreenOnToAuthPreferenceController != null) { mRequireScreenOnToAuthPreference.setVisible( mRequireScreenOnToAuthPreferenceController.isAvailable()); final int status = mRequireScreenOnToAuthPreferenceController.getAvailabilityStatus(); updatePreferenceVisibility(status, mRequireScreenOnToAuthPreference); } if (mScreenOffUnlockUdfpsPreferenceController != null) { mScreenOffUnlockUdfpsPreference.setVisible( mScreenOffUnlockUdfpsPreferenceController.isAvailable()); final int status = mScreenOffUnlockUdfpsPreferenceController.getAvailabilityStatus(); updatePreferenceVisibility(status, mScreenOffUnlockUdfpsPreference); } } private void updatePreferenceVisibility(int availabilityStatus, Preference preference) { if (availabilityStatus == AVAILABLE) { preference.setVisible(true); preference.setEnabled(true); } else if (availabilityStatus == CONDITIONALLY_UNAVAILABLE) { preference.setVisible(true); preference.setEnabled(false); } else { preference.setVisible(false); } } Loading Loading @@ -898,8 +925,29 @@ public class FingerprintSettings extends SubSettings { .setOnPreferenceChangeListener(fingerprintAppController); } private void updateUseFingerprintToEnableStatus() { final PreferenceCategory category = findPreference(KEY_BIOMETRICS_USE_FINGERPRINT_TO_CATEGORY); if (!category.isVisible()) { return; } final boolean hasFingerprintEnrolled = mFingerprintManager.getEnrolledFingerprints(mUserId).size() > 0; final FingerprintSettingsKeyguardUnlockPreferenceController fpUnlockController = use(FingerprintSettingsKeyguardUnlockPreferenceController.class); findPreference(fpUnlockController.getPreferenceKey()) .setEnabled(hasFingerprintEnrolled); final FingerprintSettingsAppsPreferenceController fingerprintAppController = use(FingerprintSettingsAppsPreferenceController.class); findPreference(fingerprintAppController.getPreferenceKey()) .setEnabled(hasFingerprintEnrolled); } private void updatePreferencesAfterFingerprintRemoved() { updateAddPreference(); updateUseFingerprintToEnableStatus(); if (isSfps() || (screenOffUnlockUdfps() && isScreenOffUnlcokSupported())) { updateFingerprintUnlockCategoryVisibility(); } Loading @@ -911,8 +959,7 @@ public class FingerprintSettings extends SubSettings { return; // Activity went away } mAddFingerprintPreference = findPreference( mIsExpressiveThemeStyle ? KEY_FINGERPRINT_ADD_EXPRESSIVE : KEY_FINGERPRINT_ADD); mAddFingerprintPreference = findPreference(getAddFingerprintPreferenceKey()); if (mAddFingerprintPreference == null) { return; // b/275519315 Skip if updateAddPreference() invoke before addPreference() Loading Loading @@ -945,11 +992,11 @@ public class FingerprintSettings extends SubSettings { findPreference(KEY_FINGERPRINT_ADD_EXPRESSIVE); if (nonExpressiveBtnPreference != null) { nonExpressiveBtnPreference.setVisible(!mIsExpressiveThemeStyle); nonExpressiveBtnPreference.setVisible(!shouldShowExpressiveAddFingerprintPref()); } if (expressiveBtnPreference != null) { expressiveBtnPreference.setVisible(mIsExpressiveThemeStyle); expressiveBtnPreference.setVisible(shouldShowExpressiveAddFingerprintPref()); } } Loading Loading @@ -1053,7 +1100,7 @@ public class FingerprintSettings extends SubSettings { @Override public boolean onPreferenceTreeClick(Preference pref) { final String key = pref.getKey(); if (!mIsExpressiveThemeStyle && KEY_FINGERPRINT_ADD.equals(key)) { if (KEY_FINGERPRINT_ADD.equals(key)) { mIsEnrolling = true; Intent intent = new Intent(); intent.setClassName(SETTINGS_PACKAGE_NAME, Loading Loading @@ -1451,6 +1498,16 @@ public class FingerprintSettings extends SubSettings { return Utils.isPrivateProfile(mUserId, getContext()); } private String getAddFingerprintPreferenceKey() { return shouldShowExpressiveAddFingerprintPref() ? KEY_FINGERPRINT_ADD_EXPRESSIVE : KEY_FINGERPRINT_ADD; } private boolean shouldShowExpressiveAddFingerprintPref() { return Flags.biometricsOnboardingEducation() && mIsExpressiveThemeStyle && mFingerprintManager.hasEnrolledTemplates(mUserId); } public static class DeleteFingerprintDialog extends InstrumentedDialogFragment implements DialogInterface.OnClickListener { Loading src/com/android/settings/biometrics/fingerprint/FingerprintSettingsAppsPreferenceController.java +15 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.hardware.fingerprint.FingerprintManager; import android.provider.Settings; import androidx.annotation.NonNull; import androidx.preference.Preference; import com.android.settings.Utils; import com.android.settings.biometrics.activeunlock.ActiveUnlockStatusUtils; Loading Loading @@ -53,6 +54,20 @@ public class FingerprintSettingsAppsPreferenceController isChecked ? ON : OFF, getUserId()); } @Override public void updateState(Preference preference) { super.updateState(preference); if (!FingerprintSettings.isFingerprintHardwareDetected(mContext)) { preference.setEnabled(false); } else if (!mFingerprintManager.hasEnrolledTemplates(getUserId())) { preference.setEnabled(false); } else if (getRestrictingAdmin() != null) { preference.setEnabled(false); } else { preference.setEnabled(true); } } @Override public int getAvailabilityStatus() { final ActiveUnlockStatusUtils activeUnlockStatusUtils = Loading Loading
res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -965,6 +965,8 @@ <string name="security_settings_fingerprint">Fingerprint</string> <!-- Title shown for a category shown for fingerprint settings page. [CHAR LIMIT=22] --> <string name="security_settings_fingerprint_title">Fingerprints</string> <!-- Description shown for fingerprint settings page. [CHAR LIMIT=22] --> <string name="security_settings_fingerprint_description"></string> <!-- Fingerprint category title - fingerprint options for unlocking the device. [CHAR LIMIT=60] --> <string name="security_settings_category_use_fingerprint">Use fingerprint to</string> <!-- Title shown for menu item that launches fingerprint settings or enrollment [CHAR LIMIT=22] -->
res/xml/security_settings_fingerprint.xml +5 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,11 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/security_settings_fingerprint_preference_title"> <com.android.settingslib.widget.TopIntroPreference android:key="security_settings_fingerprint_description" settings:searchable="false" settings:isPreferenceVisible="false" /> <PreferenceCategory android:key="biometric_settings_use_fingerprint_to" android:title="@string/security_settings_category_use_fingerprint" Loading
src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java +9 −0 Original line number Diff line number Diff line Loading @@ -71,4 +71,13 @@ public interface FingerprintFeatureProvider { ) { return new FingerprintExtPreferencesProvider(); } /** * Gets the feature provider for FingerprintSettings page * @return the provider */ @NonNull default FingerprintSettingsFeatureProvider getFingerprintSettingsFeatureProvider() { return FingerprintSettingsFeatureProvider.getInstance(); } }
src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +76 −19 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import static com.android.settings.Utils.isPrivateProfile; import static com.android.settings.biometrics.BiometricEnrollBase.BIOMETRIC_AUTH_REQUEST; import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY; import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_CHALLENGE; import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; import android.annotation.SuppressLint; import android.app.Activity; Loading @@ -37,6 +39,7 @@ import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.ResourceId; import android.graphics.drawable.Drawable; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; Loading Loading @@ -276,6 +279,8 @@ public class FingerprintSettings extends SubSettings { "security_settings_fingerprint_unlock_category"; private static final String KEY_FINGERPRINT_UNLOCK_FOOTER = "security_settings_fingerprint_footer"; private static final String KEY_FINGERPRINT_DESCRIPTION = "security_settings_fingerprint_description"; private static final String KEY_BIOMETRICS_AUTHENTICATION_REQUESTED = "biometrics_authentication_requested"; private static final String KEY_BIOMETRICS_USE_FINGERPRINT_TO_CATEGORY = Loading Loading @@ -648,13 +653,16 @@ public class FingerprintSettings extends SubSettings { mFooterColumns.add(column2); } else { final FooterColumn column = new FooterColumn(); final FingerprintSettingsFeatureProvider featureProvider = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() .getFingerprintSettingsFeatureProvider(); column.mTitle = getString(isPrivateProfile() ? R.string.private_space_fingerprint_enroll_introduction_message : R.string.security_settings_fingerprint_enroll_introduction_v3_message, DeviceHelper.getDeviceName(getActivity())); column.mLearnMoreClickListener = learnMoreClickListener; column.mLearnMoreOverrideText = getText( R.string.security_settings_fingerprint_settings_footer_learn_more); featureProvider.getSettingPageFooterLearnMoreDescription()); mFooterColumns.add(column); } } Loading Loading @@ -735,6 +743,14 @@ public class FingerprintSettings extends SubSettings { scrollToPreference(fpPrefKey); addFingerprintUnlockCategory(); } final int descriptionRes = FeatureFactory.getFeatureFactory() .getFingerprintFeatureProvider().getFingerprintSettingsFeatureProvider() .getSettingPageDescription(); if (ResourceId.isValid(descriptionRes)) { final Preference preference = findPreference(KEY_FINGERPRINT_DESCRIPTION); preference.setTitle(descriptionRes); preference.setVisible(true); } createFooterPreference(root); } Loading @@ -748,8 +764,7 @@ public class FingerprintSettings extends SubSettings { R.string.security_settings_fingerprint_title)); } String keyToReturn = mIsExpressiveThemeStyle ? KEY_FINGERPRINT_ADD_EXPRESSIVE : KEY_FINGERPRINT_ADD; String keyToReturn = getAddFingerprintPreferenceKey(); final List<Fingerprint> items = mFingerprintManager.getEnrolledFingerprints(mUserId); final int fingerprintCount = items.size(); for (int i = 0; i < fingerprintCount; i++) { Loading Loading @@ -785,8 +800,7 @@ public class FingerprintSettings extends SubSettings { mFingerprintsEnrolledCategory.addPreference(pref); pref.setOnPreferenceChangeListener(this); } mAddFingerprintPreference = findPreference(mIsExpressiveThemeStyle ? KEY_FINGERPRINT_ADD_EXPRESSIVE : KEY_FINGERPRINT_ADD); mAddFingerprintPreference = findPreference(getAddFingerprintPreferenceKey()); setupAddFingerprintPreference(); return keyToReturn; } Loading Loading @@ -839,18 +853,31 @@ public class FingerprintSettings extends SubSettings { } private void updateFingerprintUnlockCategoryVisibility() { final boolean fingerprintUnlockCategoryAvailable = mFingerprintUnlockCategoryPreferenceController.isAvailable(); if (mFingerprintUnlockCategory.isVisible() != fingerprintUnlockCategoryAvailable) { mFingerprintUnlockCategory.setVisible(fingerprintUnlockCategoryAvailable); } final int categoryStatus = mFingerprintUnlockCategoryPreferenceController.getAvailabilityStatus(); updatePreferenceVisibility(categoryStatus, mFingerprintUnlockCategory); if (mRequireScreenOnToAuthPreferenceController != null) { mRequireScreenOnToAuthPreference.setVisible( mRequireScreenOnToAuthPreferenceController.isAvailable()); final int status = mRequireScreenOnToAuthPreferenceController.getAvailabilityStatus(); updatePreferenceVisibility(status, mRequireScreenOnToAuthPreference); } if (mScreenOffUnlockUdfpsPreferenceController != null) { mScreenOffUnlockUdfpsPreference.setVisible( mScreenOffUnlockUdfpsPreferenceController.isAvailable()); final int status = mScreenOffUnlockUdfpsPreferenceController.getAvailabilityStatus(); updatePreferenceVisibility(status, mScreenOffUnlockUdfpsPreference); } } private void updatePreferenceVisibility(int availabilityStatus, Preference preference) { if (availabilityStatus == AVAILABLE) { preference.setVisible(true); preference.setEnabled(true); } else if (availabilityStatus == CONDITIONALLY_UNAVAILABLE) { preference.setVisible(true); preference.setEnabled(false); } else { preference.setVisible(false); } } Loading Loading @@ -898,8 +925,29 @@ public class FingerprintSettings extends SubSettings { .setOnPreferenceChangeListener(fingerprintAppController); } private void updateUseFingerprintToEnableStatus() { final PreferenceCategory category = findPreference(KEY_BIOMETRICS_USE_FINGERPRINT_TO_CATEGORY); if (!category.isVisible()) { return; } final boolean hasFingerprintEnrolled = mFingerprintManager.getEnrolledFingerprints(mUserId).size() > 0; final FingerprintSettingsKeyguardUnlockPreferenceController fpUnlockController = use(FingerprintSettingsKeyguardUnlockPreferenceController.class); findPreference(fpUnlockController.getPreferenceKey()) .setEnabled(hasFingerprintEnrolled); final FingerprintSettingsAppsPreferenceController fingerprintAppController = use(FingerprintSettingsAppsPreferenceController.class); findPreference(fingerprintAppController.getPreferenceKey()) .setEnabled(hasFingerprintEnrolled); } private void updatePreferencesAfterFingerprintRemoved() { updateAddPreference(); updateUseFingerprintToEnableStatus(); if (isSfps() || (screenOffUnlockUdfps() && isScreenOffUnlcokSupported())) { updateFingerprintUnlockCategoryVisibility(); } Loading @@ -911,8 +959,7 @@ public class FingerprintSettings extends SubSettings { return; // Activity went away } mAddFingerprintPreference = findPreference( mIsExpressiveThemeStyle ? KEY_FINGERPRINT_ADD_EXPRESSIVE : KEY_FINGERPRINT_ADD); mAddFingerprintPreference = findPreference(getAddFingerprintPreferenceKey()); if (mAddFingerprintPreference == null) { return; // b/275519315 Skip if updateAddPreference() invoke before addPreference() Loading Loading @@ -945,11 +992,11 @@ public class FingerprintSettings extends SubSettings { findPreference(KEY_FINGERPRINT_ADD_EXPRESSIVE); if (nonExpressiveBtnPreference != null) { nonExpressiveBtnPreference.setVisible(!mIsExpressiveThemeStyle); nonExpressiveBtnPreference.setVisible(!shouldShowExpressiveAddFingerprintPref()); } if (expressiveBtnPreference != null) { expressiveBtnPreference.setVisible(mIsExpressiveThemeStyle); expressiveBtnPreference.setVisible(shouldShowExpressiveAddFingerprintPref()); } } Loading Loading @@ -1053,7 +1100,7 @@ public class FingerprintSettings extends SubSettings { @Override public boolean onPreferenceTreeClick(Preference pref) { final String key = pref.getKey(); if (!mIsExpressiveThemeStyle && KEY_FINGERPRINT_ADD.equals(key)) { if (KEY_FINGERPRINT_ADD.equals(key)) { mIsEnrolling = true; Intent intent = new Intent(); intent.setClassName(SETTINGS_PACKAGE_NAME, Loading Loading @@ -1451,6 +1498,16 @@ public class FingerprintSettings extends SubSettings { return Utils.isPrivateProfile(mUserId, getContext()); } private String getAddFingerprintPreferenceKey() { return shouldShowExpressiveAddFingerprintPref() ? KEY_FINGERPRINT_ADD_EXPRESSIVE : KEY_FINGERPRINT_ADD; } private boolean shouldShowExpressiveAddFingerprintPref() { return Flags.biometricsOnboardingEducation() && mIsExpressiveThemeStyle && mFingerprintManager.hasEnrolledTemplates(mUserId); } public static class DeleteFingerprintDialog extends InstrumentedDialogFragment implements DialogInterface.OnClickListener { Loading
src/com/android/settings/biometrics/fingerprint/FingerprintSettingsAppsPreferenceController.java +15 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.hardware.fingerprint.FingerprintManager; import android.provider.Settings; import androidx.annotation.NonNull; import androidx.preference.Preference; import com.android.settings.Utils; import com.android.settings.biometrics.activeunlock.ActiveUnlockStatusUtils; Loading Loading @@ -53,6 +54,20 @@ public class FingerprintSettingsAppsPreferenceController isChecked ? ON : OFF, getUserId()); } @Override public void updateState(Preference preference) { super.updateState(preference); if (!FingerprintSettings.isFingerprintHardwareDetected(mContext)) { preference.setEnabled(false); } else if (!mFingerprintManager.hasEnrolledTemplates(getUserId())) { preference.setEnabled(false); } else if (getRestrictingAdmin() != null) { preference.setEnabled(false); } else { preference.setEnabled(true); } } @Override public int getAvailabilityStatus() { final ActiveUnlockStatusUtils activeUnlockStatusUtils = Loading