diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java index 676acf9671f..290e4fff9cf 100644 --- a/src/com/android/settings/display/ScreenTimeoutSettings.java +++ b/src/com/android/settings/display/ScreenTimeoutSettings.java @@ -44,6 +44,8 @@ import com.android.settingslib.search.SearchIndexableRaw; import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.FooterPreference; +import com.google.common.annotations.VisibleForTesting; + import java.util.ArrayList; import java.util.List; @@ -60,8 +62,11 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements private CharSequence[] mInitialEntries; private CharSequence[] mInitialValues; private FooterPreference mPrivacyPreference; - private AdaptiveSleepPreferenceController mAdaptiveSleepController; - private AdaptiveSleepPermissionPreferenceController mAdaptiveSleepPermissionController; + @VisibleForTesting + AdaptiveSleepPermissionPreferenceController mAdaptiveSleepPermissionController; + + @VisibleForTesting + AdaptiveSleepPreferenceController mAdaptiveSleepController; @Override public void onCreate(Bundle icicle) { @@ -87,15 +92,17 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements @Override protected List getCandidates() { - final Context context = getContext(); final List candidates = new ArrayList<>(); - final long maxTimeout = getMaxScreenTimeout(context); - for (int i = 0; i < mInitialValues.length; ++i) { - if (Long.parseLong(mInitialValues[i].toString()) <= maxTimeout) { - candidates.add( - new TimeoutCandidateInfo(mInitialEntries[i], mInitialValues[i].toString(), - true)); + final long maxTimeout = getMaxScreenTimeout(getContext()); + if (mInitialValues != null) { + for (int i = 0; i < mInitialValues.length; ++i) { + if (Long.parseLong(mInitialValues[i].toString()) <= maxTimeout) { + candidates.add(new TimeoutCandidateInfo(mInitialEntries[i], + mInitialValues[i].toString(), true)); + } } + } else { + Log.e(TAG, "Screen timeout options do not exist."); } return candidates; } @@ -125,9 +132,11 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements screen.addPreference(pref); } - mAdaptiveSleepPermissionController.addToScreen(screen); - mAdaptiveSleepController.addToScreen(screen); - screen.addPreference(mPrivacyPreference); + if (isScreenAttentionAvailable()) { + mAdaptiveSleepPermissionController.addToScreen(screen); + mAdaptiveSleepController.addToScreen(screen); + screen.addPreference(mPrivacyPreference); + } } @Override @@ -156,12 +165,19 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements return R.string.help_url_adaptive_sleep; } + private boolean isScreenAttentionAvailable() { + return getResources().getBoolean( + com.android.internal.R.bool.config_adaptive_sleep_available); + } + private Long getMaxScreenTimeout(Context context) { + if (context == null) { + return Long.MAX_VALUE; + } final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class); if (dpm == null) { return Long.MAX_VALUE; } - final RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMaximumTimeToLockIsSet(context); if (admin != null) { diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java index 48912de62ca..7f59ef37829 100644 --- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java +++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java @@ -23,14 +23,19 @@ import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import android.app.admin.DevicePolicyManager; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.provider.SearchIndexableResource; import android.provider.Settings; +import androidx.preference.PreferenceScreen; + import com.android.settings.R; import org.junit.Before; @@ -54,6 +59,15 @@ public class ScreenTimeoutSettingsTest { @Mock private Resources mResources; + @Mock + private PreferenceScreen mPreferenceScreen; + + @Mock + AdaptiveSleepPermissionPreferenceController mPermissionPreferenceController; + + @Mock + AdaptiveSleepPreferenceController mAdaptiveSleepPreferenceController; + @Before public void setup() { MockitoAnnotations.initMocks(this); @@ -63,8 +77,17 @@ public class ScreenTimeoutSettingsTest { doReturn(TIMEOUT_ENTRIES).when(mResources).getStringArray(R.array.screen_timeout_entries); doReturn(TIMEOUT_VALUES).when(mResources).getStringArray(R.array.screen_timeout_entries); + doReturn(true).when(mResources).getBoolean( + com.android.internal.R.bool.config_adaptive_sleep_available); + + doReturn(null).when(mContext).getSystemService(DevicePolicyManager.class); + doReturn(mResources).when(mSettings).getResources(); doReturn(mContext).when(mSettings).getContext(); + doReturn(mPreferenceScreen).when(mSettings).getPreferenceScreen(); + + mSettings.mAdaptiveSleepController = mAdaptiveSleepPreferenceController; + mSettings.mAdaptiveSleepPermissionController = mPermissionPreferenceController; } @Test @@ -87,6 +110,23 @@ public class ScreenTimeoutSettingsTest { assertThat(key).isEqualTo(TIMEOUT_VALUES[1]); } + @Test + public void updateCandidates_screenAttentionAvailable_showAdaptiveSleepPreference() { + mSettings.updateCandidates(); + + verify(mSettings.mAdaptiveSleepController).addToScreen(mPreferenceScreen); + } + + @Test + public void updateCandidates_screenAttentionNotAvailable_doNotShowAdaptiveSleepPreference() { + doReturn(false).when(mResources).getBoolean( + com.android.internal.R.bool.config_adaptive_sleep_available); + + mSettings.updateCandidates(); + + verify(mSettings.mAdaptiveSleepController, never()).addToScreen(mPreferenceScreen); + } + @Test public void setDefaultKey_controlCurrentScreenTimeout() { mSettings.setDefaultKey(TIMEOUT_VALUES[0]);