From cdeeaff473b66e97aec65e77e7e39eee31d42555 Mon Sep 17 00:00:00 2001 From: yuemingw Date: Thu, 18 Jan 2018 21:05:12 +0000 Subject: [PATCH] Block sleep options in Settings app when DISALLOW_CONFIG_SCREEN_TIMEOUT is set. Test: m -j RunSettingsRoboTests Bug: 67675734 Change-Id: Icdcadd03caa2884338d4300fb41f0036b8b9eb51 --- .../display/TimeoutPreferenceController.java | 14 +++++-- .../TimeoutPreferenceControllerTest.java | 38 +++++++++++++++++++ .../settings/core/UserRestrictionTest.java | 3 +- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/display/TimeoutPreferenceController.java b/src/com/android/settings/display/TimeoutPreferenceController.java index 1d869997d0f..84f9641c5fa 100644 --- a/src/com/android/settings/display/TimeoutPreferenceController.java +++ b/src/com/android/settings/display/TimeoutPreferenceController.java @@ -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 diff --git a/tests/robotests/src/com/android/settings/display/TimeoutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TimeoutPreferenceControllerTest.java index 33bc4f8bce3..d4af8b8e07c 100644 --- a/tests/robotests/src/com/android/settings/display/TimeoutPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/TimeoutPreferenceControllerTest.java @@ -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 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 longCaptor = ArgumentCaptor.forClass(Long.class); + ArgumentCaptor adminCaptor = ArgumentCaptor.forClass(EnforcedAdmin.class); + + verify(mPreference, times(2)).removeUnusableTimeouts( + longCaptor.capture(), adminCaptor.capture()); + assertEquals(0, (long)longCaptor.getValue()); + assertTrue(adminCaptor.getValue() != null); + } } diff --git a/tests/unit/src/com/android/settings/core/UserRestrictionTest.java b/tests/unit/src/com/android/settings/core/UserRestrictionTest.java index f37c30b3c2f..7282f74fb33 100644 --- a/tests/unit/src/com/android/settings/core/UserRestrictionTest.java +++ b/tests/unit/src/com/android/settings/core/UserRestrictionTest.java @@ -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