Skip to content

Commit ae25108

Browse files
Jeff BrownAndroid (Google) Code Review
authored andcommitted
Merge "Add support for auto-brightness adjust, but leave it disabled." into jb-mr1-dev
2 parents 11167b8 + 330560f commit ae25108

File tree

3 files changed

+135
-20
lines changed

3 files changed

+135
-20
lines changed

services/java/com/android/server/power/DisplayPowerController.java

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@
3232
import android.os.Handler;
3333
import android.os.Looper;
3434
import android.os.Message;
35+
import android.os.PowerManager;
3536
import android.os.SystemClock;
37+
import android.text.format.DateUtils;
38+
import android.util.FloatMath;
3639
import android.util.Slog;
3740
import android.util.Spline;
3841
import android.util.TimeUtils;
@@ -78,6 +81,13 @@ final class DisplayPowerController {
7881
// screen state returns. Playing the animation can also be somewhat slow.
7982
private static final boolean USE_ELECTRON_BEAM_ON_ANIMATION = false;
8083

84+
// If true, enables the use of the screen auto-brightness adjustment setting.
85+
private static final boolean USE_SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT = false;
86+
87+
// The maximum range of gamma adjustment possible using the screen
88+
// auto-brightness adjustment setting.
89+
private static final float SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT_MAX_GAMMA = 3.0f;
90+
8191
private static final int ELECTRON_BEAM_ON_ANIMATION_DURATION_MILLIS = 300;
8292
private static final int ELECTRON_BEAM_OFF_ANIMATION_DURATION_MILLIS = 600;
8393

@@ -150,8 +160,11 @@ final class DisplayPowerController {
150160
// The dim screen brightness.
151161
private final int mScreenBrightnessDimConfig;
152162

153-
// Auto-brightness.
163+
// True if auto-brightness should be used.
154164
private boolean mUseSoftwareAutoBrightnessConfig;
165+
166+
// The auto-brightness spline adjustment.
167+
// The brightness values have been scaled to a range of 0..1.
155168
private Spline mScreenAutoBrightnessSpline;
156169

157170
// Amount of time to delay auto-brightness after screen on while waiting for
@@ -266,6 +279,9 @@ final class DisplayPowerController {
266279
// Use -1 if there is no current auto-brightness value available.
267280
private int mScreenAutoBrightness = -1;
268281

282+
// The last screen auto-brightness gamma. (For printing in dump() only.)
283+
private float mLastScreenAutoBrightnessGamma = 1.0f;
284+
269285
// True if the screen auto-brightness value is actually being used to
270286
// set the display brightness.
271287
private boolean mUsingScreenAutoBrightness;
@@ -335,10 +351,10 @@ private static Spline createAutoBrightnessSpline(int[] lux, int[] brightness) {
335351
final int n = brightness.length;
336352
float[] x = new float[n];
337353
float[] y = new float[n];
338-
y[0] = brightness[0];
354+
y[0] = (float)brightness[0] / PowerManager.BRIGHTNESS_ON;
339355
for (int i = 1; i < n; i++) {
340356
x[i] = lux[i - 1];
341-
y[i] = brightness[i];
357+
y[i] = (float)brightness[i] / PowerManager.BRIGHTNESS_ON;
342358
}
343359

344360
Spline spline = Spline.createMonotoneCubicSpline(x, y);
@@ -470,6 +486,8 @@ private void updatePowerState() {
470486
// Update the power state request.
471487
final boolean mustNotify;
472488
boolean mustInitialize = false;
489+
boolean updateAutoBrightness = false;
490+
473491
synchronized (mLock) {
474492
mPendingUpdatePowerStateLocked = false;
475493
if (mPendingRequestLocked == null) {
@@ -483,6 +501,10 @@ private void updatePowerState() {
483501
mPendingRequestChangedLocked = false;
484502
mustInitialize = true;
485503
} else if (mPendingRequestChangedLocked) {
504+
if (mPowerRequest.screenAutoBrightnessAdjustment
505+
!= mPendingRequestLocked.screenAutoBrightnessAdjustment) {
506+
updateAutoBrightness = true;
507+
}
486508
mPowerRequest.copyFrom(mPendingRequestLocked);
487509
mWaitingForNegativeProximity |= mPendingWaitForNegativeProximityLocked;
488510
mPendingWaitForNegativeProximityLocked = false;
@@ -530,19 +552,21 @@ private void updatePowerState() {
530552
// Turn on the light sensor if needed.
531553
if (mLightSensor != null) {
532554
setLightSensorEnabled(mPowerRequest.useAutoBrightness
533-
&& wantScreenOn(mPowerRequest.screenState));
555+
&& wantScreenOn(mPowerRequest.screenState), updateAutoBrightness);
534556
}
535557

536558
// Set the screen brightness.
537559
if (mPowerRequest.screenState == DisplayPowerRequest.SCREEN_STATE_DIM) {
538560
// Screen is dimmed. Overrides everything else.
539-
animateScreenBrightness(mScreenBrightnessDimConfig, BRIGHTNESS_RAMP_RATE_FAST);
561+
animateScreenBrightness(
562+
clampScreenBrightness(mScreenBrightnessDimConfig),
563+
BRIGHTNESS_RAMP_RATE_FAST);
540564
mUsingScreenAutoBrightness = false;
541565
} else if (mPowerRequest.screenState == DisplayPowerRequest.SCREEN_STATE_BRIGHT) {
542566
if (mScreenAutoBrightness >= 0 && mLightSensorEnabled) {
543567
// Use current auto-brightness value.
544568
animateScreenBrightness(
545-
Math.max(mScreenAutoBrightness, mScreenBrightnessDimConfig),
569+
clampScreenBrightness(mScreenAutoBrightness),
546570
mUsingScreenAutoBrightness ? BRIGHTNESS_RAMP_RATE_SLOW :
547571
BRIGHTNESS_RAMP_RATE_FAST);
548572
mUsingScreenAutoBrightness = true;
@@ -552,7 +576,7 @@ private void updatePowerState() {
552576
// provide a nominal default value for the case where auto-brightness
553577
// is not ready yet.
554578
animateScreenBrightness(
555-
Math.max(mPowerRequest.screenBrightness, mScreenBrightnessDimConfig),
579+
clampScreenBrightness(mPowerRequest.screenBrightness),
556580
BRIGHTNESS_RAMP_RATE_FAST);
557581
mUsingScreenAutoBrightness = false;
558582
}
@@ -630,6 +654,10 @@ private void setScreenOn(boolean on) {
630654
}
631655
}
632656

657+
private int clampScreenBrightness(int value) {
658+
return Math.min(Math.max(Math.max(value, mScreenBrightnessDimConfig), 0), 255);
659+
}
660+
633661
private void animateScreenBrightness(int target, int rate) {
634662
if (mScreenBrightnessRampAnimator.animateTo(target, rate)) {
635663
mNotifier.onScreenBrightness(target);
@@ -691,9 +719,10 @@ private void debounceProximitySensor() {
691719
}
692720
}
693721

694-
private void setLightSensorEnabled(boolean enable) {
722+
private void setLightSensorEnabled(boolean enable, boolean updateAutoBrightness) {
695723
if (enable) {
696724
if (!mLightSensorEnabled) {
725+
updateAutoBrightness = true;
697726
mLightSensorEnabled = true;
698727
mLightSensorEnableTime = SystemClock.uptimeMillis();
699728
mSensorManager.registerListener(mLightSensorListener, mLightSensor,
@@ -703,11 +732,13 @@ private void setLightSensorEnabled(boolean enable) {
703732
if (mLightSensorEnabled) {
704733
mLightSensorEnabled = false;
705734
mLightMeasurementValid = false;
706-
updateAutoBrightness(false);
707735
mHandler.removeMessages(MSG_LIGHT_SENSOR_DEBOUNCED);
708736
mSensorManager.unregisterListener(mLightSensorListener);
709737
}
710738
}
739+
if (updateAutoBrightness) {
740+
updateAutoBrightness(false);
741+
}
711742
}
712743

713744
private void handleLightSensorEvent(long time, float lux) {
@@ -818,26 +849,46 @@ private void updateAutoBrightness(boolean sendUpdate) {
818849
return;
819850
}
820851

821-
final int newScreenAutoBrightness = interpolateBrightness(
822-
mScreenAutoBrightnessSpline, mLightMeasurement);
852+
float value = mScreenAutoBrightnessSpline.interpolate(mLightMeasurement);
853+
float gamma = 1.0f;
854+
855+
if (USE_SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT
856+
&& mPowerRequest.screenAutoBrightnessAdjustment != 0.0f) {
857+
final float adjGamma = FloatMath.pow(SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT_MAX_GAMMA,
858+
Math.min(1.0f, Math.max(-1.0f,
859+
-mPowerRequest.screenAutoBrightnessAdjustment)));
860+
gamma *= adjGamma;
861+
if (DEBUG) {
862+
Slog.d(TAG, "updateAutoBrightness: adjGamma=" + adjGamma);
863+
}
864+
}
865+
866+
if (gamma != 1.0f) {
867+
final float in = value;
868+
value = FloatMath.pow(value, gamma);
869+
if (DEBUG) {
870+
Slog.d(TAG, "updateAutoBrightness: gamma=" + gamma
871+
+ ", in=" + in + ", out=" + value);
872+
}
873+
}
874+
875+
int newScreenAutoBrightness = clampScreenBrightness(
876+
(int)Math.round(value * PowerManager.BRIGHTNESS_ON));
823877
if (mScreenAutoBrightness != newScreenAutoBrightness) {
824878
if (DEBUG) {
825879
Slog.d(TAG, "updateAutoBrightness: mScreenAutoBrightness="
826-
+ mScreenAutoBrightness + "newScreenAutoBrightness="
880+
+ mScreenAutoBrightness + ", newScreenAutoBrightness="
827881
+ newScreenAutoBrightness);
828882
}
829883

830884
mScreenAutoBrightness = newScreenAutoBrightness;
885+
mLastScreenAutoBrightnessGamma = gamma;
831886
if (sendUpdate) {
832887
sendUpdatePowerState();
833888
}
834889
}
835890
}
836891

837-
private static int interpolateBrightness(Spline spline, float lux) {
838-
return Math.min(255, Math.max(0, (int)Math.round(spline.interpolate(lux))));
839-
}
840-
841892
private void sendOnStateChanged() {
842893
mCallbackHandler.post(mOnStateChangedRunnable);
843894
}
@@ -943,6 +994,7 @@ private void dumpLocal(PrintWriter pw) {
943994
+ TimeUtils.formatUptime(mPendingLightSensorDebounceTime));
944995
pw.println(" mScreenAutoBrightness=" + mScreenAutoBrightness);
945996
pw.println(" mUsingScreenAutoBrightness=" + mUsingScreenAutoBrightness);
997+
pw.println(" mLastScreenAutoBrightnessGamma=" + mLastScreenAutoBrightnessGamma);
946998

947999
if (mElectronBeamOnAnimator != null) {
9481000
pw.println(" mElectronBeamOnAnimator.isStarted()=" +

services/java/com/android/server/power/DisplayPowerRequest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,17 @@ final class DisplayPowerRequest {
4646
// value to use while waiting for the light sensor to report enough data.
4747
public int screenBrightness;
4848

49+
// The screen auto-brightness adjustment factor in the range -1 (dimmer) to 1 (brighter).
50+
public float screenAutoBrightnessAdjustment;
51+
4952
// If true, enables automatic brightness control.
5053
public boolean useAutoBrightness;
5154

5255
public DisplayPowerRequest() {
5356
screenState = SCREEN_STATE_BRIGHT;
5457
useProximitySensor = false;
5558
screenBrightness = PowerManager.BRIGHTNESS_ON;
59+
screenAutoBrightnessAdjustment = 0.0f;
5660
useAutoBrightness = false;
5761
}
5862

@@ -64,6 +68,7 @@ public void copyFrom(DisplayPowerRequest other) {
6468
screenState = other.screenState;
6569
useProximitySensor = other.useProximitySensor;
6670
screenBrightness = other.screenBrightness;
71+
screenAutoBrightnessAdjustment = other.screenAutoBrightnessAdjustment;
6772
useAutoBrightness = other.useAutoBrightness;
6873
}
6974

@@ -78,6 +83,7 @@ public boolean equals(DisplayPowerRequest other) {
7883
&& screenState == other.screenState
7984
&& useProximitySensor == other.useProximitySensor
8085
&& screenBrightness == other.screenBrightness
86+
&& screenAutoBrightnessAdjustment == other.screenAutoBrightnessAdjustment
8187
&& useAutoBrightness == other.useAutoBrightness;
8288
}
8389

@@ -91,6 +97,7 @@ public String toString() {
9197
return "screenState=" + screenState
9298
+ ", useProximitySensor=" + useProximitySensor
9399
+ ", screenBrightness=" + screenBrightness
100+
+ ", screenAutoBrightnessAdjustment=" + screenAutoBrightnessAdjustment
94101
+ ", useAutoBrightness=" + useAutoBrightness;
95102
}
96103
}

services/java/com/android/server/power/PowerManagerService.java

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ public final class PowerManagerService extends IPowerManager.Stub
249249
// Use -1 if no value has been set.
250250
private int mScreenBrightnessSetting;
251251

252+
// The screen auto-brightness adjustment setting, from -1 to 1.
253+
// Use 0 if there is no adjustment.
254+
private float mScreenAutoBrightnessAdjustmentSetting;
255+
252256
// The screen brightness mode.
253257
// One of the Settings.System.SCREEN_BRIGHTNESS_MODE_* constants.
254258
private int mScreenBrightnessModeSetting;
@@ -263,6 +267,12 @@ public final class PowerManagerService extends IPowerManager.Stub
263267
// Use -1 to disable.
264268
private int mTemporaryScreenBrightnessSettingOverride = -1;
265269

270+
// The screen brightness adjustment setting override from the settings
271+
// application to temporarily adjust the auto-brightness adjustment factor
272+
// until next updated, in the range -1..1.
273+
// Use NaN to disable.
274+
private float mTemporaryScreenAutoBrightnessAdjustmentSettingOverride = Float.NaN;
275+
266276
private native void nativeInit();
267277
private static native void nativeShutdown();
268278
private static native void nativeReboot(String reason) throws IOException;
@@ -389,6 +399,14 @@ private void updateSettingsLocked() {
389399
mTemporaryScreenBrightnessSettingOverride = -1;
390400
}
391401

402+
final float oldScreenAutoBrightnessAdjustmentSetting =
403+
mScreenAutoBrightnessAdjustmentSetting;
404+
mScreenAutoBrightnessAdjustmentSetting = Settings.System.getFloat(resolver,
405+
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f);
406+
if (oldScreenAutoBrightnessAdjustmentSetting != mScreenAutoBrightnessAdjustmentSetting) {
407+
mTemporaryScreenAutoBrightnessAdjustmentSettingOverride = -1;
408+
}
409+
392410
mScreenBrightnessModeSetting = Settings.System.getInt(resolver,
393411
Settings.System.SCREEN_BRIGHTNESS_MODE,
394412
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
@@ -1275,6 +1293,7 @@ private void updateDisplayPowerStateLocked(int dirty) {
12751293
}
12761294

12771295
int screenBrightness = mScreenBrightnessSettingDefault;
1296+
float screenAutoBrightnessAdjustment = 0.0f;
12781297
boolean autoBrightness = (mScreenBrightnessModeSetting ==
12791298
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
12801299
if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) {
@@ -1283,14 +1302,26 @@ private void updateDisplayPowerStateLocked(int dirty) {
12831302
} else if (isValidBrightness(mTemporaryScreenBrightnessSettingOverride)) {
12841303
screenBrightness = mTemporaryScreenBrightnessSettingOverride;
12851304
} else if (isValidBrightness(mScreenBrightnessSetting)) {
1286-
screenBrightness = mScreenBrightnessSetting;
1305+
screenBrightness = mScreenBrightnessSetting;
12871306
}
12881307
if (autoBrightness) {
12891308
screenBrightness = mScreenBrightnessSettingDefault;
1309+
if (isValidAutoBrightnessAdjustment(
1310+
mTemporaryScreenAutoBrightnessAdjustmentSettingOverride)) {
1311+
screenAutoBrightnessAdjustment =
1312+
mTemporaryScreenAutoBrightnessAdjustmentSettingOverride;
1313+
} else if (isValidAutoBrightnessAdjustment(
1314+
mScreenAutoBrightnessAdjustmentSetting)) {
1315+
screenAutoBrightnessAdjustment = mScreenAutoBrightnessAdjustmentSetting;
1316+
}
12901317
}
12911318
screenBrightness = Math.max(Math.min(screenBrightness,
12921319
mScreenBrightnessSettingMaximum), mScreenBrightnessSettingMinimum);
1320+
screenAutoBrightnessAdjustment = Math.max(Math.min(
1321+
screenAutoBrightnessAdjustment, 1.0f), -1.0f);
12931322
mDisplayPowerRequest.screenBrightness = screenBrightness;
1323+
mDisplayPowerRequest.screenAutoBrightnessAdjustment =
1324+
screenAutoBrightnessAdjustment;
12941325
mDisplayPowerRequest.useAutoBrightness = autoBrightness;
12951326

12961327
mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked();
@@ -1314,6 +1345,10 @@ private static boolean isValidBrightness(int value) {
13141345
return value >= 0 && value <= 255;
13151346
}
13161347

1348+
private static boolean isValidAutoBrightnessAdjustment(float value) {
1349+
return !Float.isNaN(value);
1350+
}
1351+
13171352
private int getDesiredScreenPowerState() {
13181353
if (mWakefulness == WAKEFULNESS_ASLEEP) {
13191354
return DisplayPowerRequest.SCREEN_STATE_OFF;
@@ -1690,15 +1725,32 @@ private void setTemporaryScreenBrightnessSettingOverrideInternal(int brightness)
16901725
*
16911726
* The override will be canceled when the setting value is next updated.
16921727
*
1693-
* @param adj The overridden brightness, or -1 to disable the override.
1728+
* @param adj The overridden brightness, or Float.NaN to disable the override.
16941729
*
16951730
* @see Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ
16961731
*/
16971732
@Override // Binder call
16981733
public void setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(float adj) {
1699-
// Not implemented.
1700-
// The SCREEN_AUTO_BRIGHTNESS_ADJ setting is not currently supported.
17011734
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
1735+
1736+
final long ident = Binder.clearCallingIdentity();
1737+
try {
1738+
setTemporaryScreenAutoBrightnessAdjustmentSettingOverrideInternal(adj);
1739+
} finally {
1740+
Binder.restoreCallingIdentity(ident);
1741+
}
1742+
}
1743+
1744+
private void setTemporaryScreenAutoBrightnessAdjustmentSettingOverrideInternal(float adj) {
1745+
synchronized (mLock) {
1746+
// Note: This condition handles NaN because NaN is not equal to any other
1747+
// value, including itself.
1748+
if (mTemporaryScreenAutoBrightnessAdjustmentSettingOverride != adj) {
1749+
mTemporaryScreenAutoBrightnessAdjustmentSettingOverride = adj;
1750+
mDirty |= DIRTY_SETTINGS;
1751+
updatePowerStateLocked();
1752+
}
1753+
}
17021754
}
17031755

17041756
/**
@@ -1774,11 +1826,15 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
17741826
+ isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() + ")");
17751827
pw.println(" mStayOnWhilePluggedInSetting=" + mStayOnWhilePluggedInSetting);
17761828
pw.println(" mScreenBrightnessSetting=" + mScreenBrightnessSetting);
1829+
pw.println(" mScreenAutoBrightnessAdjustmentSetting="
1830+
+ mScreenAutoBrightnessAdjustmentSetting);
17771831
pw.println(" mScreenBrightnessModeSetting=" + mScreenBrightnessModeSetting);
17781832
pw.println(" mScreenBrightnessOverrideFromWindowManager="
17791833
+ mScreenBrightnessOverrideFromWindowManager);
17801834
pw.println(" mTemporaryScreenBrightnessSettingOverride="
17811835
+ mTemporaryScreenBrightnessSettingOverride);
1836+
pw.println(" mTemporaryScreenAutoBrightnessAdjustmentSettingOverride="
1837+
+ mTemporaryScreenAutoBrightnessAdjustmentSettingOverride);
17821838
pw.println(" mScreenBrightnessSettingMinimum=" + mScreenBrightnessSettingMinimum);
17831839
pw.println(" mScreenBrightnessSettingMaximum=" + mScreenBrightnessSettingMaximum);
17841840
pw.println(" mScreenBrightnessSettingDefault=" + mScreenBrightnessSettingDefault);

0 commit comments

Comments
 (0)