Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9a99978 authored by Hao Dong's avatar Hao Dong
Browse files

Fix require on screen toggle on guest user.

Bug: 286018876
Test: atest FingerprintSettingsFragmentTest
Change-Id: I432ffd3b8b32caeaf7ac8c6bc3c2ee2a0ee53a08
parent fa2f6edc
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -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);
        }

+48 −9
Original line number Diff line number Diff line
@@ -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<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
        props.add(new FingerprintSensorPropertiesInternal(
                0 /* sensorId */,
                SensorProperties.STRENGTH_STRONG,
                1 /* maxEnrollmentsPerUser */,
                new ArrayList<ComponentInfoInternal>(),
                TYPE_UDFPS_OPTICAL,
                sensorType,
                true /* resetLockoutRequiresHardwareAuthToken */));
        doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
    }