diff options
5 files changed, 108 insertions, 2 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 3f41458886a3..875df102827e 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4501,6 +4501,13 @@ public final class Settings { public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout"; /** + * The amount of time in milliseconds before the device goes to sleep or begins to dream + * after a period of inactivity while it is docked. + * @hide + */ + public static final String SCREEN_OFF_TIMEOUT_DOCKED = "screen_off_timeout_docked"; + + /** * The screen backlight brightness between 0 and 255. */ @Readable diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java index a6bfc408be7e..716ee845bea6 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java @@ -43,6 +43,7 @@ public class SystemSettings { Settings.System.FONT_SCALE, Settings.System.DIM_SCREEN, Settings.System.SCREEN_OFF_TIMEOUT, + Settings.System.SCREEN_OFF_TIMEOUT_DOCKED, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, Settings.System.SCREEN_BRIGHTNESS_FOR_VR, diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java index 06712cc68b89..d4302963f2d3 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java @@ -111,6 +111,7 @@ public class SystemSettingsValidators { }); VALIDATORS.put(System.DISPLAY_COLOR_MODE_VENDOR_HINT, ANY_STRING_VALIDATOR); VALIDATORS.put(System.SCREEN_OFF_TIMEOUT, NON_NEGATIVE_INTEGER_VALIDATOR); + VALIDATORS.put(System.SCREEN_OFF_TIMEOUT_DOCKED, NON_NEGATIVE_INTEGER_VALIDATOR); VALIDATORS.put(System.SCREEN_BRIGHTNESS_FOR_VR, new InclusiveIntegerRangeValidator(0, 255)); VALIDATORS.put(System.SCREEN_BRIGHTNESS_MODE, BOOLEAN_VALIDATOR); VALIDATORS.put(System.ADAPTIVE_SLEEP, BOOLEAN_VALIDATOR); diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 38570727742d..e52315342399 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -521,6 +521,9 @@ public final class PowerManagerService extends SystemService // The screen off timeout setting value in milliseconds. private long mScreenOffTimeoutSetting; + // The screen off timeout setting value in milliseconds to apply while device is docked. + private long mScreenOffTimeoutDockedSetting; + // Default for attentive warning duration. private long mAttentiveWarningDurationConfig; @@ -1272,6 +1275,9 @@ public final class PowerManagerService extends SystemService resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_OFF_TIMEOUT), false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SCREEN_OFF_TIMEOUT_DOCKED), + false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SLEEP_TIMEOUT), false, mSettingsObserver, UserHandle.USER_ALL); @@ -1394,6 +1400,9 @@ public final class PowerManagerService extends SystemService mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, UserHandle.USER_CURRENT); + mScreenOffTimeoutDockedSetting = Settings.System.getLongForUser(resolver, + Settings.System.SCREEN_OFF_TIMEOUT_DOCKED, mScreenOffTimeoutSetting, + UserHandle.USER_CURRENT); mSleepTimeoutSetting = Settings.Secure.getIntForUser(resolver, Settings.Secure.SLEEP_TIMEOUT, DEFAULT_SLEEP_TIMEOUT, UserHandle.USER_CURRENT); @@ -2946,7 +2955,9 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private long getScreenOffTimeoutLocked(long sleepTimeout, long attentiveTimeout) { - long timeout = mScreenOffTimeoutSetting; + long timeout = mDockState == Intent.EXTRA_DOCK_STATE_UNDOCKED + ? mScreenOffTimeoutSetting + : mScreenOffTimeoutDockedSetting; if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) { timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin); } @@ -4974,7 +4985,8 @@ public final class PowerManagerService extends SystemService } } - private final class DockReceiver extends BroadcastReceiver { + @VisibleForTesting + final class DockReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { synchronized (mLock) { diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index 827349ad433a..c94168c59fde 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -87,6 +87,7 @@ import com.android.server.lights.LightsManager; import com.android.server.policy.WindowManagerPolicy; import com.android.server.power.PowerManagerService.BatteryReceiver; import com.android.server.power.PowerManagerService.BinderService; +import com.android.server.power.PowerManagerService.DockReceiver; import com.android.server.power.PowerManagerService.Injector; import com.android.server.power.PowerManagerService.NativeWrapper; import com.android.server.power.PowerManagerService.UserSwitchedReceiver; @@ -152,6 +153,7 @@ public class PowerManagerServiceTest { private Resources mResourcesSpy; private OffsettableClock mClock; private TestLooper mTestLooper; + private DockReceiver mDockReceiver; private static class IntentFilterMatcher implements ArgumentMatcher<IntentFilter> { private final IntentFilter mFilter; @@ -337,6 +339,14 @@ public class PowerManagerServiceTest { argThat(new IntentFilterMatcher(usFilter)), isNull(), isA(Handler.class)); mUserSwitchedReceiver = userSwitchedCaptor.getValue(); + // Grab the DockReceiver + ArgumentCaptor<DockReceiver> dockReceiverCaptor = + ArgumentCaptor.forClass(DockReceiver.class); + IntentFilter dockFilter = new IntentFilter(Intent.ACTION_DOCK_EVENT); + verify(mContextSpy).registerReceiver(dockReceiverCaptor.capture(), + argThat(new IntentFilterMatcher(dockFilter)), isNull(), isA(Handler.class)); + mDockReceiver = dockReceiverCaptor.getValue(); + mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED); } @@ -385,6 +395,16 @@ public class PowerManagerServiceTest { .thenReturn(minimumScreenOffTimeoutConfigMillis); } + private void setScreenOffTimeout(int screenOffTimeoutMillis) { + Settings.System.putInt(mContextSpy.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, + screenOffTimeoutMillis); + } + + private void setScreenOffTimeoutDocked(int screenOffTimeoutMillis) { + Settings.System.putInt(mContextSpy.getContentResolver(), + Settings.System.SCREEN_OFF_TIMEOUT_DOCKED, screenOffTimeoutMillis); + } + private void advanceTime(long timeMs) { mClock.fastForward(timeMs); mTestLooper.dispatchAll(); @@ -883,6 +903,71 @@ public class PowerManagerServiceTest { } @Test + public void testScreenOffTimeout_goesToSleepAfterTimeout() { + final DisplayInfo info = new DisplayInfo(); + info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP; + when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info); + + setMinimumScreenOffTimeoutConfig(10); + setScreenOffTimeout(10); + + createService(); + startSystem(); + + mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, mClock.now(), + PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + advanceTime(15); + assertThat(mService.getGlobalWakefulnessLocked()).isNotEqualTo(WAKEFULNESS_AWAKE); + } + + @Test + public void testScreenOffTimeout_usesRegularTimeoutWhenNotDocked() { + final DisplayInfo info = new DisplayInfo(); + info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP; + when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info); + + setMinimumScreenOffTimeoutConfig(10); + setScreenOffTimeout(10); + setScreenOffTimeoutDocked(30); + + createService(); + startSystem(); + + mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, mClock.now(), + PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + advanceTime(15); + assertThat(mService.getGlobalWakefulnessLocked()).isNotEqualTo(WAKEFULNESS_AWAKE); + } + + @Test + public void testScreenOffTimeout_usesDockedTimeoutWhenDocked() { + final DisplayInfo info = new DisplayInfo(); + info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP; + when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info); + + setMinimumScreenOffTimeoutConfig(10); + setScreenOffTimeout(10); + setScreenOffTimeoutDocked(30); + + createService(); + startSystem(); + + mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, mClock.now(), + PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + mDockReceiver.onReceive(mContextSpy, + new Intent(Intent.ACTION_DOCK_EVENT).putExtra(Intent.EXTRA_DOCK_STATE, + Intent.EXTRA_DOCK_STATE_DESK)); + + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + advanceTime(15); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + advanceTime(20); + assertThat(mService.getGlobalWakefulnessLocked()).isNotEqualTo(WAKEFULNESS_AWAKE); + } + + @Test public void testInattentiveSleep_goesToSleepWithWakeLock() { final String pkg = mContextSpy.getOpPackageName(); final Binder token = new Binder(); |