diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 4c569996817de..c0a6abf3a121a 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -45,7 +45,10 @@ import android.app.compat.CompatChanges; import android.companion.virtual.IVirtualDevice; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.res.Resources; @@ -421,6 +424,32 @@ public final class DisplayManagerService extends SystemService { // Receives notifications about changes to Settings. private SettingsObserver mSettingsObserver; + // Keeps note of what state the device is in, used for idle screen brightness mode. + private boolean mIsDocked; + private boolean mIsDreaming; + + private final BroadcastReceiver mIdleModeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final DisplayManagerInternal dmi = + LocalServices.getService(DisplayManagerInternal.class); + if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) { + int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, + Intent.EXTRA_DOCK_STATE_UNDOCKED); + mIsDocked = dockState == Intent.EXTRA_DOCK_STATE_DESK + || dockState == Intent.EXTRA_DOCK_STATE_LE_DESK + || dockState == Intent.EXTRA_DOCK_STATE_HE_DESK; + } + if (Intent.ACTION_DREAMING_STARTED.equals(intent.getAction())) { + mIsDreaming = true; + } else if (Intent.ACTION_DREAMING_STOPPED.equals(intent.getAction())) { + mIsDreaming = false; + } + setDockedAndIdleEnabled(/* enabled= */(mIsDocked && mIsDreaming), + Display.DEFAULT_DISPLAY); + } + }; + private final boolean mAllowNonNativeRefreshRateOverride; private final BrightnessSynchronizer mBrightnessSynchronizer; @@ -616,6 +645,13 @@ public final class DisplayManagerService extends SystemService { mSettingsObserver = new SettingsObserver(); mBrightnessSynchronizer.startSynchronizing(); + + final IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_DREAMING_STARTED); + filter.addAction(Intent.ACTION_DREAMING_STOPPED); + filter.addAction(Intent.ACTION_DOCK_EVENT); + + mContext.registerReceiver(mIdleModeReceiver, filter); } @VisibleForTesting @@ -2096,6 +2132,16 @@ public final class DisplayManagerService extends SystemService { } } + void setDockedAndIdleEnabled(boolean enabled, int displayId) { + synchronized (mSyncRoot) { + final DisplayPowerController displayPowerController = mDisplayPowerControllers.get( + displayId); + if (displayPowerController != null) { + displayPowerController.setAutomaticScreenBrightnessMode(enabled); + } + } + } + private void clearViewportsLocked() { mViewports.clear(); } diff --git a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java index 43a850c5d6262..9a7ddcb2ff913 100644 --- a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java +++ b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java @@ -76,6 +76,10 @@ class DisplayManagerShellCommand extends ShellCommand { return setUserDisabledHdrTypes(); case "get-user-disabled-hdr-types": return getUserDisabledHdrTypes(); + case "dock": + return setDockedAndIdle(); + case "undock": + return unsetDockedAndIdle(); default: return handleDefaultCommands(cmd); } @@ -124,6 +128,10 @@ class DisplayManagerShellCommand extends ShellCommand { pw.println(" Sets the user disabled HDR types as TYPES"); pw.println(" get-user-disabled-hdr-types"); pw.println(" Returns the user disabled HDR types"); + pw.println(" dock"); + pw.println(" Sets brightness to docked + idle screen brightness mode"); + pw.println(" undock"); + pw.println(" Sets brightness to active (normal) screen brightness mode"); pw.println(); Intent.printIntentArgsHelp(pw , ""); } @@ -345,4 +353,14 @@ class DisplayManagerShellCommand extends ShellCommand { return -1; } } + + private int setDockedAndIdle() { + mService.setDockedAndIdleEnabled(true, Display.DEFAULT_DISPLAY); + return 0; + } + + private int unsetDockedAndIdle() { + mService.setDockedAndIdleEnabled(false, Display.DEFAULT_DISPLAY); + return 0; + } } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index b46ee27d30cbe..2dfaa8bad380a 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -395,11 +395,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call @Nullable private BrightnessMappingStrategy mIdleModeBrightnessMapper; - // If these are both true, and mIdleModeBrightnessMapper != null, - // then we are in idle screen brightness mode. - private boolean mIsDreaming; - private boolean mIsDocked; - // The current brightness configuration. @Nullable private BrightnessConfiguration mBrightnessConfiguration;