From 92a7f873ceb39c831f10e7ad2e713651ea7cf043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Bellegarde?= Date: Fri, 14 May 2021 00:53:09 +0200 Subject: AutoBrightness: Add support for one shot auto-brightness - Only update auto brightness one time when screen is turned on. - Can be useful on devices where sensor is not accurate. [jhonboy121]: adapt to 12 Change-Id: I5187fdb7765550d4eaa999317ab95f487d44c8d8 --- core/java/android/provider/Settings.java | 7 +++++++ .../provider/settings/backup/SystemSettings.java | 1 + .../validators/SystemSettingsValidators.java | 1 + .../display/AutomaticBrightnessController.java | 22 +++++++++++++++++++++- .../server/display/DisplayPowerController.java | 17 ++++++++++++++++- 5 files changed, 46 insertions(+), 2 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index d756ca9769e2..28ed9ba3820e 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5191,6 +5191,13 @@ public final class Settings { */ public static final String ALERT_SLIDER_ORDER = "alert_slider_order"; + /** + * Whether auto brightness is applied one shot when screen is turned on. + * Default 0 + * @hide + */ + public static final String AUTO_BRIGHTNESS_ONE_SHOT = "auto_brightness_one_shot"; + /** * IMPORTANT: If you add a new public settings you also have to add it to * PUBLIC_SETTINGS below. If the new setting is hidden you have to add diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java index 0fe4efefc2cb..7c5daedf8995 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java @@ -84,5 +84,6 @@ public class SystemSettings { Settings.System.DISPLAY_COLOR_MODE, Settings.System.ALARM_ALERT, Settings.System.NOTIFICATION_LIGHT_PULSE, + Settings.System.AUTO_BRIGHTNESS_ONE_SHOT, }; } diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java index e1f4ea933b40..546801cb55b2 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java @@ -203,5 +203,6 @@ public class SystemSettingsValidators { VALIDATORS.put(System.SHOW_BATTERY_PERCENT, BOOLEAN_VALIDATOR); VALIDATORS.put(System.NOTIFICATION_LIGHT_PULSE, BOOLEAN_VALIDATOR); VALIDATORS.put(System.CALL_CONNECTED_TONE_ENABLED, BOOLEAN_VALIDATOR); + VALIDATORS.put(System.AUTO_BRIGHTNESS_ONE_SHOT, BOOLEAN_VALIDATOR); } } diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index cb2cd140677e..32831b20bd62 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -214,6 +214,8 @@ class AutomaticBrightnessController { private final Injector mInjector; + private boolean mAutoBrightnessOneShot; + AutomaticBrightnessController(Callbacks callbacks, Looper looper, SensorManager sensorManager, Sensor lightSensor, BrightnessMappingStrategy mapper, int lightSensorWarmUpTime, float brightnessMin, float brightnessMax, @@ -277,6 +279,7 @@ class AutomaticBrightnessController { mForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED; mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED; mHbmController = hbmController; + mAutoBrightnessOneShot = false; } /** @@ -316,7 +319,8 @@ class AutomaticBrightnessController { public void configure(boolean enable, @Nullable BrightnessConfiguration configuration, float brightness, boolean userChangedBrightness, float adjustment, - boolean userChangedAutoBrightnessAdjustment, int displayPolicy) { + boolean userChangedAutoBrightnessAdjustment, int displayPolicy, + boolean autoBrightnessOneShot) { mHbmController.setAutoBrightnessEnabled(enable); // While dozing, the application processor may be suspended which will prevent us from // receiving new information from the light sensor. On some devices, we may be able to @@ -342,6 +346,8 @@ class AutomaticBrightnessController { changed |= setLightSensorEnabled(enable && !dozing); if (changed) { updateAutoBrightness(false /*sendUpdate*/, userInitiatedChange); + } else { + handleSettingsChange(autoBrightnessOneShot); } } @@ -368,6 +374,17 @@ class AutomaticBrightnessController { mHandler.sendEmptyMessage(MSG_RUN_UPDATE); } + private void handleSettingsChange(boolean autoBrightnessOneShot) { + if (mAutoBrightnessOneShot == autoBrightnessOneShot) return; + mAutoBrightnessOneShot = autoBrightnessOneShot; + if (mAutoBrightnessOneShot) { + mSensorManager.unregisterListener(mLightSensorListener); + } else { + mSensorManager.registerListener(mLightSensorListener, mLightSensor, + mCurrentLightSensorRate * 1000, mHandler); + } + } + private boolean setDisplayPolicy(int policy) { if (mDisplayPolicy == policy) { return false; @@ -783,6 +800,9 @@ class AutomaticBrightnessController { mCallbacks.updateBrightness(); } } + if (mAutoBrightnessOneShot) { + mSensorManager.unregisterListener(mLightSensorListener); + } } // Clamps values with float range [0.0-1.0] diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 81cbbff44778..d5f4b807bb0a 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -431,6 +431,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // This should be false during system start up. private boolean mPendingRbcOnOrChanged = false; + // Whether auto brightness is applied one shot when screen is turned on + private boolean mAutoBrightnessOneShot = false; + // Animators. private ObjectAnimator mColorFadeOnAnimator; private ObjectAnimator mColorFadeOffAnimator; @@ -473,6 +476,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // TODO: b/186428377 update brightness setting when display changes mBrightnessSetting = brightnessSetting; mOnBrightnessChangeRunnable = onBrightnessChangeRunnable; + mAutoBrightnessOneShot = getAutoBrightnessOneShotSetting(); PowerManager pm = context.getSystemService(PowerManager.class); @@ -854,6 +858,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mContext.getContentResolver().registerContentObserver( Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ), false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL); + mContext.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.AUTO_BRIGHTNESS_ONE_SHOT), + false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL); } private void setUpAutoBrightness(Resources resources, Handler handler) { @@ -1194,7 +1201,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBrightnessConfiguration, mLastUserSetScreenBrightness, userSetBrightnessChanged, autoBrightnessAdjustment, - autoBrightnessAdjustmentChanged, mPowerRequest.policy); + autoBrightnessAdjustmentChanged, mPowerRequest.policy, + mAutoBrightnessOneShot); } if (mBrightnessTracker != null) { @@ -2026,9 +2034,16 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // We don't bother with a pending variable for VR screen brightness since we just // immediately adapt to it. mScreenBrightnessForVr = getScreenBrightnessForVrSetting(); + mAutoBrightnessOneShot = getAutoBrightnessOneShotSetting(); sendUpdatePowerState(); } + private boolean getAutoBrightnessOneShotSetting() { + return Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.AUTO_BRIGHTNESS_ONE_SHOT, 0, + UserHandle.USER_CURRENT) == 1; + } + private float getAutoBrightnessAdjustmentSetting() { final float adj = Settings.System.getFloatForUser(mContext.getContentResolver(), Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f, UserHandle.USER_CURRENT); -- cgit v1.2.3