diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java index 290e4fff9cf..83f904aa7fb 100644 --- a/src/com/android/settings/display/ScreenTimeoutSettings.java +++ b/src/com/android/settings/display/ScreenTimeoutSettings.java @@ -28,6 +28,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.Log; +import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; @@ -59,9 +60,17 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements /** If there is no setting in the provider, use this. */ public static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000; + private static final int DEFAULT_ORDER_OF_LOWEST_PREFERENCE = Integer.MAX_VALUE - 1; + private CharSequence[] mInitialEntries; private CharSequence[] mInitialValues; private FooterPreference mPrivacyPreference; + + @VisibleForTesting + RestrictedLockUtils.EnforcedAdmin mAdmin; + @VisibleForTesting + Preference mDisableOptionsPreference; + @VisibleForTesting AdaptiveSleepPermissionPreferenceController mAdaptiveSleepPermissionController; @@ -88,6 +97,15 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy); mPrivacyPreference.setSelectable(false); mPrivacyPreference.setLayoutResource(R.layout.preference_footer); + + mDisableOptionsPreference = new FooterPreference(context); + mDisableOptionsPreference.setLayoutResource(R.layout.preference_footer); + mDisableOptionsPreference.setTitle(R.string.admin_disabled_other_options); + mDisableOptionsPreference.setIcon(R.drawable.ic_info_outline_24dp); + + // The 'disabled by admin' preference should always be at the end of the setting page. + mDisableOptionsPreference.setOrder(DEFAULT_ORDER_OF_LOWEST_PREFERENCE); + mPrivacyPreference.setOrder(DEFAULT_ORDER_OF_LOWEST_PREFERENCE - 1); } @Override @@ -120,6 +138,14 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements final PreferenceScreen screen = getPreferenceScreen(); screen.removeAll(); + if (mAdmin != null) { + mDisableOptionsPreference.setOnPreferenceClickListener(p -> { + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), mAdmin); + return true; + }); + screen.addPreference(mDisableOptionsPreference); + } + final List candidateList = getCandidates(); if (candidateList == null) { return; @@ -137,6 +163,14 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements mAdaptiveSleepController.addToScreen(screen); screen.addPreference(mPrivacyPreference); } + + if (mAdmin != null) { + mDisableOptionsPreference.setOnPreferenceClickListener(p -> { + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), mAdmin); + return true; + }); + screen.addPreference(mDisableOptionsPreference); + } } @Override @@ -178,9 +212,8 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements if (dpm == null) { return Long.MAX_VALUE; } - final RestrictedLockUtils.EnforcedAdmin admin = - RestrictedLockUtilsInternal.checkIfMaximumTimeToLockIsSet(context); - if (admin != null) { + mAdmin = RestrictedLockUtilsInternal.checkIfMaximumTimeToLockIsSet(context); + if (mAdmin != null) { return dpm.getMaximumTimeToLock(null /* admin */, UserHandle.myUserId()); } return Long.MAX_VALUE; diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java index 7f59ef37829..621ddfa4ad0 100644 --- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java +++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java @@ -22,6 +22,7 @@ import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -34,9 +35,11 @@ import android.content.res.Resources; import android.provider.SearchIndexableResource; import android.provider.Settings; +import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settingslib.RestrictedLockUtils; import org.junit.Before; import org.junit.Test; @@ -68,6 +71,9 @@ public class ScreenTimeoutSettingsTest { @Mock AdaptiveSleepPreferenceController mAdaptiveSleepPreferenceController; + @Mock + Preference mDisableOptionsPreference; + @Before public void setup() { MockitoAnnotations.initMocks(this); @@ -127,6 +133,16 @@ public class ScreenTimeoutSettingsTest { verify(mSettings.mAdaptiveSleepController, never()).addToScreen(mPreferenceScreen); } + @Test + public void updateCandidates_enforcedAdmin_showDisabledByAdminPreference() { + mSettings.mAdmin = new RestrictedLockUtils.EnforcedAdmin(); + mSettings.mDisableOptionsPreference = mDisableOptionsPreference; + + mSettings.updateCandidates(); + + verify(mPreferenceScreen, atLeast(1)).addPreference(mDisableOptionsPreference); + } + @Test public void setDefaultKey_controlCurrentScreenTimeout() { mSettings.setDefaultKey(TIMEOUT_VALUES[0]);