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

Commit 07835054 authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Add setting to bypass lock screen" into qt-r1-dev

parents 079ed791 b2aaa26f
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -7976,6 +7976,15 @@
    <!-- Configure Notifications: Title for the option controlling notifications on the lockscreen. [CHAR LIMIT=30] -->
    <string name="lock_screen_notifications_title">Lock screen</string>
    <!-- Configure lock screen: Title for the option of unlocking directly to home. [CHAR LIMIT=30] -->
    <string name="lockscreen_bypass_title">Skip lock screen</string>
    <!-- Configure lock screen: Summary for the option of unlocking directly to home. [CHAR LIMIT=60] -->
    <string name="lockscreen_bypass_summary">After face unlock, go directly to last used screen</string>
    <!-- Configure lock screen: Search keywords for the option of unlocking directly to home. [CHAR LIMIT=60] -->
    <string name="keywords_lockscreen_bypass">Lock screen, Lockscreen, Skip, Bypass</string>
    <!-- Configure Notifications: Title for the option controlling notifications for work profile. [CHAR LIMIT=30] -->
    <string name="locked_work_profile_notification_title">When work profile is locked</string>
+8 −0
Original line number Diff line number Diff line
@@ -62,6 +62,14 @@
        android:summary="@string/summary_placeholder"
        settings:searchable="false"/>

    <!-- Bypass lock screen -->
    <SwitchPreference
        android:key="privacy_lockscreen_bypass"
        android:title="@string/lockscreen_bypass_title"
        android:summary="@string/lockscreen_bypass_summary"
        settings:keywords="@string/keywords_lockscreen_bypass"
        settings:controller="com.android.settings.security.LockscreenBypassPreferenceController" />

    <!-- Privacy Service -->
    <PreferenceCategory
        android:key="privacy_services"
+7 −0
Original line number Diff line number Diff line
@@ -30,6 +30,13 @@
            android:summary="@string/summary_placeholder"
            settings:keywords="@string/keywords_lock_screen_notif"/>

        <SwitchPreference
            android:key="security_lockscreen_bypass"
            android:title="@string/lockscreen_bypass_title"
            android:summary="@string/lockscreen_bypass_summary"
            settings:searchable="false"
            settings:controller="com.android.settings.security.LockscreenBypassPreferenceController" />

        <com.android.settingslib.RestrictedSwitchPreference
            android:key="security_lockscreen_add_users_when_locked"
            android:title="@string/user_add_on_lockscreen_menu"
+59 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.security;

import android.content.Context;
import android.hardware.face.FaceManager;
import android.provider.Settings;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.core.TogglePreferenceController;

public class LockscreenBypassPreferenceController extends TogglePreferenceController {

    @VisibleForTesting
    protected FaceManager mFaceManager;

    public LockscreenBypassPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mFaceManager = context.getSystemService(FaceManager.class);
    }

    @Override
    public boolean isChecked() {
        boolean defaultValue = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_faceAuthDismissesKeyguard);
        return Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, defaultValue ? 1 : 0) != 0;
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        Settings.Secure.putInt(mContext.getContentResolver(),
                Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, isChecked ? 1 : 0);
        return true;
    }

    @Override
    public int getAvailabilityStatus() {
        if (mFaceManager != null && mFaceManager.isHardwareDetected()) {
            return mFaceManager.hasEnrolledTemplates() ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
        } else {
            return UNSUPPORTED_ON_DEVICE;
        }
    }
}
+77 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */

package com.android.settings.security;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.when;

import android.content.Context;
import android.hardware.face.FaceManager;
import android.provider.Settings;

import androidx.preference.SwitchPreference;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers;

@RunWith(RobolectricTestRunner.class)
public class LockscreenBypassPreferenceControllerTest {

    @Mock
    private FaceManager mFaceManager;
    private SwitchPreference mPreference;

    private Context mContext;
    private LockscreenBypassPreferenceController mController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mPreference = new SwitchPreference(mContext);

        mController = new LockscreenBypassPreferenceController(mContext, "TestKey");
        ReflectionHelpers.setField(mController, "mFaceManager", mFaceManager);
    }

    @Test
    public void isAvailable_whenHardwareDetected() {
        assertThat(mController.isAvailable()).isFalse();
        when(mFaceManager.isHardwareDetected()).thenReturn(true);
        assertThat(mController.isAvailable()).isTrue();
    }

    @Test
    public void onPreferenceChange_settingIsUpdated() {
        boolean defaultValue = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_faceAuthDismissesKeyguard);
        boolean state = Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, defaultValue ? 1 : 0) != 0;

        assertThat(mController.onPreferenceChange(mPreference, !state)).isTrue();
        boolean newState = Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, 0) != 0;
        assertThat(newState).isEqualTo(!state);
    }
}