From bb4e9ce20185b62fd2d2b22a7903c776e83a6c85 Mon Sep 17 00:00:00 2001 From: Alex Salo Date: Thu, 17 Jan 2019 13:54:03 -0800 Subject: [PATCH] Add "Adaptive sleep" setting Adaptive sleep setting, if enabled, will perform an attention check right before the power manager is scheduled to dim and then turn off the display. If the attention check says that user is currently paying attention to the device, the screen sleep timeout timer will be reset, as if user had interacted with the display. The animation and explanation strings are still TBC per UX team. The setting is only displayed on supported devices. Test: make RunSettingsRoboTests Bug: 111939367 Change-Id: I191dd8ef06ecec4edbe4357671a7a9360971c06f --- res/values/strings.xml | 14 +++ res/xml/adaptive_sleep_detail.xml | 40 ++++++ res/xml/display_settings.xml | 7 ++ .../AdaptiveSleepPreferenceController.java | 68 ++++++++++ .../display/AdaptiveSleepSettings.java | 74 +++++++++++ ...AdaptiveSleepPreferenceControllerTest.java | 117 ++++++++++++++++++ 6 files changed, 320 insertions(+) create mode 100644 res/xml/adaptive_sleep_detail.xml create mode 100644 src/com/android/settings/display/AdaptiveSleepPreferenceController.java create mode 100644 src/com/android/settings/display/AdaptiveSleepSettings.java create mode 100644 tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 36fba35d2ee..c41bb142056 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2688,6 +2688,15 @@ Display white balance + + Adaptive sleep + + On + + Off + + Your screen would not dim and go to sleep if the device detects your present attention. + Night Light @@ -6707,6 +6716,8 @@ + + @@ -7047,6 +7058,9 @@ dim screen, touchscreen, battery, smart brightness, dynamic brightness + + dim screen, sleep, battery, timeout, attention + rotate, flip, rotation, portrait, landscape, orientation, vertical, horizontal diff --git a/res/xml/adaptive_sleep_detail.xml b/res/xml/adaptive_sleep_detail.xml new file mode 100644 index 00000000000..b7dabbb1e45 --- /dev/null +++ b/res/xml/adaptive_sleep_detail.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index 76b3d2eefba..b110b46ce26 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -66,6 +66,13 @@ android:entryValues="@array/screen_timeout_values" settings:keywords="@string/keywords_screen_timeout" /> + + getXmlResourcesToIndex( + Context context, boolean enabled) { + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.adaptive_sleep_detail; + return Arrays.asList(sir); + } + }; +} diff --git a/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java new file mode 100644 index 00000000000..d426e7aa7ba --- /dev/null +++ b/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java @@ -0,0 +1,117 @@ +/* + * 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.display; + +import static android.provider.Settings.System.ADAPTIVE_SLEEP; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.ContentResolver; +import android.content.Context; +import android.provider.Settings; + +import com.android.settings.R; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class AdaptiveSleepPreferenceControllerTest { + + private static final String PREFERENCE_KEY = "adaptive_sleep"; + + private Context mContext; + private AdaptiveSleepPreferenceController mController; + private ContentResolver mContentResolver; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = RuntimeEnvironment.application; + mContentResolver = mContext.getContentResolver(); + mController = new AdaptiveSleepPreferenceController(mContext, PREFERENCE_KEY); + } + + @Test + public void onPreferenceChange_turnOn_returnOn() { + mController.onPreferenceChange(null, true); + + final int mode = Settings.System.getInt(mContentResolver, ADAPTIVE_SLEEP, 0); + assertThat(mode).isEqualTo(1); + } + + @Test + public void onPreferenceChange_turnOff_returnOff() { + mController.onPreferenceChange(null, false); + + final int mode = Settings.System.getInt(mContentResolver, ADAPTIVE_SLEEP, 1); + assertThat(mode).isEqualTo(0); + } + + @Test + public void setChecked_updatesCorrectly() { + mController.setChecked(true); + + assertThat(mController.isChecked()).isTrue(); + + mController.setChecked(false); + + assertThat(mController.isChecked()).isFalse(); + } + + @Test + public void isChecked_no() { + Settings.System.putInt(mContentResolver, ADAPTIVE_SLEEP, 0); + + assertThat(mController.isChecked()).isFalse(); + } + + @Test + public void isChecked_yes() { + Settings.System.putInt(mContentResolver, ADAPTIVE_SLEEP, 1); + + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void getSummary_settingOn_shouldReturnOnSummary() { + mController.setChecked(true); + + assertThat(mController.getSummary()) + .isEqualTo(mContext.getText(R.string.adaptive_sleep_summary_on)); + } + + @Test + public void getSummary_settingOff_shouldReturnOffSummary() { + mController.setChecked(false); + + assertThat(mController.getSummary()) + .isEqualTo(mContext.getText(R.string.adaptive_sleep_summary_off)); + } + + @Test + public void isSliceable_returnsTrue() { + final AdaptiveSleepPreferenceController controller = + new AdaptiveSleepPreferenceController(mContext, "any_key"); + assertThat(controller.isSliceable()).isTrue(); + } +}