diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 97753c8f74bfc..e5151d84c33e9 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -181,8 +181,8 @@ public final class DisplayManagerService extends SystemService { private static final String FORCE_WIFI_DISPLAY_ENABLE = "persist.debug.wfd.enable"; private static final String PROP_DEFAULT_DISPLAY_TOP_INSET = "persist.sys.displayinset.top"; - private static final long WAIT_FOR_DEFAULT_DISPLAY_TIMEOUT = 10000; + private static final float THRESHOLD_FOR_REFRESH_RATES_DIVIDERS = 0.1f; private static final int MSG_REGISTER_DEFAULT_DISPLAY_ADAPTERS = 1; private static final int MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS = 2; @@ -371,7 +371,7 @@ public final class DisplayManagerService extends SystemService { private final boolean mAllowNonNativeRefreshRateOverride; - private static final float THRESHOLD_FOR_REFRESH_RATES_DIVIDERS = 0.1f; + private final BrightnessSynchronizer mBrightnessSynchronizer; /** * Applications use {@link android.view.Display#getRefreshRate} and @@ -408,6 +408,7 @@ public final class DisplayManagerService extends SystemService { mLogicalDisplayMapper = new LogicalDisplayMapper(context, mDisplayDeviceRepo, new LogicalDisplayListener()); mDisplayModeDirector = new DisplayModeDirector(context, mHandler); + mBrightnessSynchronizer = new BrightnessSynchronizer(mContext); Resources resources = mContext.getResources(); mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger( com.android.internal.R.integer.config_defaultDisplayDefaultColorMode); @@ -542,6 +543,7 @@ public final class DisplayManagerService extends SystemService { mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS); mSettingsObserver = new SettingsObserver(); + mBrightnessSynchronizer.startSynchronizing(); } @VisibleForTesting diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 8c65158caab76..003bd4369f2b6 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -154,6 +154,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private final DisplayPowerCallbacks mCallbacks; // Battery stats. + @Nullable private final IBatteryStats mBatteryStats; // The sensor manager. @@ -172,6 +173,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private final int mDisplayId; // Tracker for brightness changes. + @Nullable private final BrightnessTracker mBrightnessTracker; // Tracker for brightness settings changes. @@ -406,30 +408,30 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private ObjectAnimator mColorFadeOffAnimator; private RampAnimator mScreenBrightnessRampAnimator; - // The brightness synchronizer to allow changes in the int brightness value to be reflected in - // the float brightness value and vice versa. - @Nullable - private final BrightnessSynchronizer mBrightnessSynchronizer; - /** * Creates the display power controller. */ public DisplayPowerController(Context context, DisplayPowerCallbacks callbacks, Handler handler, SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay) { + mLogicalDisplay = logicalDisplay; + mDisplayId = mLogicalDisplay.getDisplayIdLocked(); mHandler = new DisplayControllerHandler(handler.getLooper()); - mBrightnessTracker = new BrightnessTracker(context, null); + + if (mDisplayId == Display.DEFAULT_DISPLAY) { + mBrightnessTracker = new BrightnessTracker(context, null); + mBatteryStats = BatteryStatsService.getService(); + } else { + mBrightnessTracker = null; + mBatteryStats = null; + } + mSettingsObserver = new SettingsObserver(mHandler); mCallbacks = callbacks; - mBatteryStats = BatteryStatsService.getService(); mSensorManager = sensorManager; mWindowManagerPolicy = LocalServices.getService(WindowManagerPolicy.class); mBlanker = blanker; mContext = context; - mBrightnessSynchronizer = new BrightnessSynchronizer(context); - mBrightnessSynchronizer.startSynchronizing(); - mLogicalDisplay = logicalDisplay; - mDisplayId = mLogicalDisplay.getDisplayIdLocked(); PowerManager pm = context.getSystemService(PowerManager.class); @@ -460,8 +462,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mScreenBrightnessForVrRangeMinimum = clampAbsoluteBrightness( pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR)); + // Check the setting, but also verify that it is the default display. Only the default + // display has an automatic brightness controller running. + // TODO: b/179021925 - Fix to work with multiple displays mUseSoftwareAutoBrightnessConfig = resources.getBoolean( - com.android.internal.R.bool.config_automatic_brightness_available); + com.android.internal.R.bool.config_automatic_brightness_available) + && mDisplayId == Display.DEFAULT_DISPLAY; mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean( com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing); @@ -557,7 +563,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBrightnessBucketsInDozeConfig = resources.getBoolean( com.android.internal.R.bool.config_displayBrightnessBucketsInDoze); - if (!DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) { + if (mDisplayId == Display.DEFAULT_DISPLAY && !DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) { + // TODO: b/178385123 Once there are sensor associations, we can enable proximity for + // non-default displays. mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); if (mProximitySensor != null) { mProximityThreshold = Math.min(mProximitySensor.getMaximumRange(), @@ -643,18 +651,28 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call * @param userId userId to fetch data for * @param includePackage if false will null out the package name in events */ + @Nullable public ParceledListSlice getBrightnessEvents( @UserIdInt int userId, boolean includePackage) { + if (mBrightnessTracker == null) { + return null; + } return mBrightnessTracker.getEvents(userId, includePackage); } public void onSwitchUser(@UserIdInt int newUserId) { handleSettingsChange(true /* userSwitch */); - mBrightnessTracker.onSwitchUser(newUserId); + if (mBrightnessTracker != null) { + mBrightnessTracker.onSwitchUser(newUserId); + } } + @Nullable public ParceledListSlice getAmbientBrightnessStats( @UserIdInt int userId) { + if (mBrightnessTracker == null) { + return null; + } return mBrightnessTracker.getAmbientBrightnessStats(userId); } @@ -662,7 +680,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call * Persist the brightness slider events and ambient brightness stats to disk. */ public void persistBrightnessTrackerState() { - mBrightnessTracker.persistBrightnessTrackerState(); + if (mBrightnessTracker != null) { + mBrightnessTracker.persistBrightnessTrackerState(); + } } /** @@ -766,20 +786,16 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mPowerState, DisplayPowerState.SCREEN_BRIGHTNESS_FLOAT); mScreenBrightnessRampAnimator.setListener(mRampAnimatorListener); - // Initialize screen state for battery stats. - try { - mBatteryStats.noteScreenState(mPowerState.getScreenState()); - mBatteryStats.noteScreenBrightness(BrightnessSynchronizer.brightnessFloatToInt( - mPowerState.getScreenBrightness())); - } catch (RemoteException ex) { - // same process - } + noteScreenState(mPowerState.getScreenState()); + noteScreenBrightness(mPowerState.getScreenBrightness()); + // Initialize all of the brightness tracking state final float brightness = convertToNits(BrightnessSynchronizer.brightnessFloatToInt( mPowerState.getScreenBrightness())); if (brightness >= 0.0f) { mBrightnessTracker.start(brightness); } + mContext.getContentResolver().registerContentObserver( Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FLOAT), false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL); @@ -1366,11 +1382,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call SystemProperties.set("debug.tracing.screen_state", String.valueOf(state)); mPowerState.setScreenState(state); // Tell battery stats about the transition. - try { - mBatteryStats.noteScreenState(state); - } catch (RemoteException ex) { - // same process - } + noteScreenState(state); } } @@ -1442,13 +1454,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call Trace.traceCounter(Trace.TRACE_TAG_POWER, "TargetScreenBrightness", (int) target); // TODO(b/153319140) remove when we can get this from the above trace invocation SystemProperties.set("debug.tracing.screen_brightness", String.valueOf(target)); - try { - // TODO(brightnessfloat): change BatteryStats to use float - mBatteryStats.noteScreenBrightness( - BrightnessSynchronizer.brightnessFloatToInt(target)); - } catch (RemoteException ex) { - // same process - } + noteScreenBrightness(target); } } @@ -1767,15 +1773,21 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } private void putScreenBrightnessSetting(float brightnessValue) { - mCurrentScreenBrightnessSetting = brightnessValue; - Settings.System.putFloatForUser(mContext.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS_FLOAT, brightnessValue, UserHandle.USER_CURRENT); + if (mDisplayId == Display.DEFAULT_DISPLAY) { + mCurrentScreenBrightnessSetting = brightnessValue; + Settings.System.putFloatForUser(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS_FLOAT, brightnessValue, + UserHandle.USER_CURRENT); + } } private void putAutoBrightnessAdjustmentSetting(float adjustment) { - mAutoBrightnessAdjustment = adjustment; - Settings.System.putFloatForUser(mContext.getContentResolver(), - Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adjustment, UserHandle.USER_CURRENT); + if (mDisplayId == Display.DEFAULT_DISPLAY) { + mAutoBrightnessAdjustment = adjustment; + Settings.System.putFloatForUser(mContext.getContentResolver(), + Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adjustment, + UserHandle.USER_CURRENT); + } } private boolean updateAutoBrightnessAdjustment() { @@ -2056,6 +2068,29 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call return MathUtils.constrain(value, -1.0f, 1.0f); } + private void noteScreenState(int screenState) { + if (mBatteryStats != null) { + try { + // TODO(multi-display): make this multi-display + mBatteryStats.noteScreenState(screenState); + } catch (RemoteException e) { + // same process + } + } + } + + private void noteScreenBrightness(float brightness) { + if (mBatteryStats != null) { + try { + // TODO(brightnessfloat): change BatteryStats to use float + mBatteryStats.noteScreenBrightness(BrightnessSynchronizer.brightnessFloatToInt( + brightness)); + } catch (RemoteException e) { + // same process + } + } + } + private final class DisplayControllerHandler extends Handler { public DisplayControllerHandler(Looper looper) { super(looper, null, true /*async*/);