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

Commit cdeeaff4 authored by yuemingw's avatar yuemingw
Browse files

Block sleep options in Settings app when DISALLOW_CONFIG_SCREEN_TIMEOUT is set.

Test: m -j RunSettingsRoboTests
Bug: 67675734
Change-Id: Icdcadd03caa2884338d4300fb41f0036b8b9eb51
parent ad6ba3bd
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -13,9 +13,11 @@
 */
package com.android.settings.display;

import android.app.admin.DevicePolicyManager;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;

import android.content.Context;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.support.v7.preference.Preference;
import android.util.Log;
@@ -25,10 +27,9 @@ import com.android.settings.TimeoutListPreference;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.core.AbstractPreferenceController;

import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;

public class TimeoutPreferenceController extends AbstractPreferenceController implements
        PreferenceControllerMixin, Preference.OnPreferenceChangeListener {

@@ -69,6 +70,13 @@ public class TimeoutPreferenceController extends AbstractPreferenceController im
            timeoutListPreference.removeUnusableTimeouts(maxTimeout, admin);
        }
        updateTimeoutPreferenceDescription(timeoutListPreference, currentTimeout);

        EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(
                        mContext, UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT,
                        UserHandle.myUserId());
        if(admin != null) {
            timeoutListPreference.removeUnusableTimeouts(0/* disable all*/, admin);
        }
    }

    @Override
+38 −0
Original line number Diff line number Diff line
@@ -20,8 +20,12 @@ import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;

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

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@@ -34,16 +38,20 @@ import com.android.settings.TestConfig;
import com.android.settings.TimeoutListPreference;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowDevicePolicyManagerWrapper;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
@@ -93,4 +101,34 @@ public class TimeoutPreferenceControllerTest {
        mController.updateState(mPreference);
        verify(mPreference).removeUnusableTimeouts(timeout, null);
    }

    @Test
    public void testUpdateStateWithAdminTimeoutsAndRestriction() {
        final int profileUserId = UserHandle.myUserId();
        final long timeout = 100;
        when(mUserManager.getProfiles(profileUserId)).thenReturn(Collections.emptyList());
        ShadowDevicePolicyManagerWrapper.setMaximumTimeToLock(profileUserId, timeout);

        int userId = UserHandle.myUserId();
        List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>();
        // Add two enforcing users so that RestrictedLockUtils.checkIfRestrictionEnforced returns
        // non-null.
        enforcingUsers.add(new UserManager.EnforcingUser(userId,
                UserManager.RESTRICTION_SOURCE_DEVICE_OWNER));
        enforcingUsers.add(new UserManager.EnforcingUser(userId,
                UserManager.RESTRICTION_SOURCE_PROFILE_OWNER));
        when(mUserManager.getUserRestrictionSources(
                UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT, UserHandle.of(userId)))
                .thenReturn(enforcingUsers);

        mController.updateState(mPreference);

        ArgumentCaptor<Long> longCaptor = ArgumentCaptor.forClass(Long.class);
        ArgumentCaptor<EnforcedAdmin> adminCaptor = ArgumentCaptor.forClass(EnforcedAdmin.class);

        verify(mPreference, times(2)).removeUnusableTimeouts(
                longCaptor.capture(), adminCaptor.capture());
        assertEquals(0, (long)longCaptor.getValue());
        assertTrue(adminCaptor.getValue() != null);
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -65,7 +65,8 @@ public class UserRestrictionTest {
            UserManager.DISALLOW_CONFIG_VPN,
            UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,
            UserManager.DISALLOW_AIRPLANE_MODE,
            UserManager.DISALLOW_CONFIG_BRIGHTNESS
            UserManager.DISALLOW_CONFIG_BRIGHTNESS,
            UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT
    );

    @Before