From c9a99978f9177f70b3c284b5f6ede56ee4e3c426 Mon Sep 17 00:00:00 2001 From: Hao Dong Date: Thu, 15 Jun 2023 21:03:17 +0000 Subject: [PATCH] Fix require on screen toggle on guest user. Bug: 286018876 Test: atest FingerprintSettingsFragmentTest Change-Id: I432ffd3b8b32caeaf7ac8c6bc3c2ee2a0ee53a08 --- .../fingerprint/FingerprintSettings.java | 15 +++-- .../FingerprintSettingsFragmentTest.java | 57 ++++++++++++++++--- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index fb3319c3ff6..9a4d63204e2 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -169,7 +169,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 = + @VisibleForTesting + static final String KEY_REQUIRE_SCREEN_ON_TO_AUTH = "security_settings_require_screen_on_to_auth"; private static final String KEY_FINGERPRINTS_ENROLLED_CATEGORY = "security_settings_fingerprints_enrolled"; @@ -536,10 +537,6 @@ public class FingerprintSettings extends SubSettings { private void addFingerprintPreferences(PreferenceGroup root) { final String fpPrefKey = addFingerprintItemPreferences(root); - if (isSfps()) { - scrollToPreference(fpPrefKey); - addFingerprintUnlockCategory(); - } for (AbstractPreferenceController controller : mControllers) { if (controller instanceof FingerprintSettingsPreferenceController) { ((FingerprintSettingsPreferenceController) controller).setUserId(mUserId); @@ -547,6 +544,14 @@ public class FingerprintSettings extends SubSettings { ((FingerprintUnlockCategoryController) controller).setUserId(mUserId); } } + + // This needs to be after setting ids, otherwise + // |mRequireScreenOnToAuthPreferenceController.isChecked| is always checking the primary + // user instead of the user with |mUserId|. + if (isSfps()) { + scrollToPreference(fpPrefKey); + addFingerprintUnlockCategory(); + } createFooterPreference(root); } diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java index 1998d56b1ca..8b70550f5a9 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java @@ -16,12 +16,14 @@ package com.android.settings.biometrics.fingerprint; +import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_POWER_BUTTON; import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.ADD_FINGERPRINT_REQUEST; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.CHOOSE_LOCK_GENERIC_REQUEST; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.KEY_FINGERPRINT_ADD; +import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.KEY_REQUIRE_SCREEN_ON_TO_AUTH; import static com.google.common.truth.Truth.assertThat; @@ -39,12 +41,16 @@ import static org.mockito.Mockito.verify; import android.content.Context; import android.content.Intent; +import android.content.pm.UserInfo; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; import android.hardware.fingerprint.FingerprintManager; +import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Bundle; import android.os.CancellationSignal; +import android.os.UserHandle; +import android.provider.Settings; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -62,6 +68,7 @@ import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowSettingsPreferenceFragment; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUtils; +import com.android.settingslib.RestrictedSwitchPreference; import org.junit.After; import org.junit.Before; @@ -83,6 +90,9 @@ import java.util.ArrayList; @Config(shadows = {ShadowSettingsPreferenceFragment.class, ShadowUtils.class, ShadowFragment.class, ShadowUserManager.class, ShadowLockPatternUtils.class}) public class FingerprintSettingsFragmentTest { + private static final int PRIMARY_USER_ID = 0; + private static final int GUEST_USER_ID = 10; + private FingerprintSettingsFragment mFragment; private Context mContext; private FragmentActivity mActivity; @@ -106,9 +116,14 @@ public class FingerprintSettingsFragmentTest { @Before public void setUp() { - doReturn(true).when(mFingerprintManager).isHardwareDetected(); ShadowUtils.setFingerprintManager(mFingerprintManager); FakeFeatureFactory.setupForTest(); + + mContext = spy(ApplicationProvider.getApplicationContext()); + mFragment = spy(new FingerprintSettingsFragment()); + doReturn(mContext).when(mFragment).getContext(); + + doReturn(true).when(mFingerprintManager).isHardwareDetected(); } @After @@ -186,19 +201,43 @@ public class FingerprintSettingsFragmentTest { assertThat(mFingerprintAuthenticateSidecar.isCancelled()).isTrue(); } + @Test + public void testGuestUserRequireScreenOnToAuth() { + Settings.Secure.putIntForUser( + mContext.getContentResolver(), + Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED, + 0, + UserHandle.of(PRIMARY_USER_ID).getIdentifier()); + + Settings.Secure.putIntForUser( + mContext.getContentResolver(), + Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED, + 1, + UserHandle.of(GUEST_USER_ID).getIdentifier()); + + setUpFragment(false, GUEST_USER_ID, TYPE_POWER_BUTTON); + + final RestrictedSwitchPreference requireScreenOnToAuthPreference = mFragment.findPreference( + KEY_REQUIRE_SCREEN_ON_TO_AUTH); + assertThat(requireScreenOnToAuthPreference.isChecked()).isTrue(); + } + private void setUpFragment(boolean showChooseLock) { + setUpFragment(showChooseLock, PRIMARY_USER_ID, TYPE_UDFPS_OPTICAL); + } + + private void setUpFragment(boolean showChooseLock, int userId, + @FingerprintSensorProperties.SensorType int sensorType) { + ShadowUserManager.getShadow().addProfile(new UserInfo(userId, "", 0)); + Intent intent = new Intent(); if (!showChooseLock) { intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, 1L); } - + intent.putExtra(Intent.EXTRA_USER_ID, userId); mActivity = spy(Robolectric.buildActivity(FragmentActivity.class, intent).get()); - mContext = spy(ApplicationProvider.getApplicationContext()); - - mFragment = spy(new FingerprintSettingsFragment()); doReturn(mActivity).when(mFragment).getActivity(); - doReturn(mContext).when(mFragment).getContext(); FragmentManager fragmentManager = mock(FragmentManager.class); doReturn(mFragmentTransaction).when(fragmentManager).beginTransaction(); @@ -212,7 +251,7 @@ public class FingerprintSettingsFragmentTest { doNothing().when(mFragment).startActivityForResult(any(Intent.class), anyInt()); - setSensor(); + setSensor(sensorType); // Start fragment mFragment.onAttach(mContext); @@ -221,14 +260,14 @@ public class FingerprintSettingsFragmentTest { mFragment.onResume(); } - private void setSensor() { + private void setSensor(@FingerprintSensorProperties.SensorType int sensorType) { final ArrayList props = new ArrayList<>(); props.add(new FingerprintSensorPropertiesInternal( 0 /* sensorId */, SensorProperties.STRENGTH_STRONG, 1 /* maxEnrollmentsPerUser */, new ArrayList(), - TYPE_UDFPS_OPTICAL, + sensorType, true /* resetLockoutRequiresHardwareAuthToken */)); doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal(); }