Merge "Removing AutomaticBrightnessStrategy refs in DPC2" into udc-qpr-dev

This commit is contained in:
Santos Cordon
2023-07-13 20:31:19 +00:00
committed by Android (Google) Code Review
7 changed files with 173 additions and 46 deletions

View File

@@ -16,6 +16,8 @@
package com.android.server.display;
import android.text.TextUtils;
import com.android.server.display.brightness.BrightnessReason;
import java.util.Objects;
@@ -29,12 +31,14 @@ public final class DisplayBrightnessState {
private final float mSdrBrightness;
private final BrightnessReason mBrightnessReason;
private final String mDisplayBrightnessStrategyName;
private final boolean mShouldUseAutoBrightness;
private DisplayBrightnessState(Builder builder) {
this.mBrightness = builder.getBrightness();
this.mSdrBrightness = builder.getSdrBrightness();
this.mBrightnessReason = builder.getBrightnessReason();
this.mDisplayBrightnessStrategyName = builder.getDisplayBrightnessStrategyName();
mBrightness = builder.getBrightness();
mSdrBrightness = builder.getSdrBrightness();
mBrightnessReason = builder.getBrightnessReason();
mDisplayBrightnessStrategyName = builder.getDisplayBrightnessStrategyName();
mShouldUseAutoBrightness = builder.getShouldUseAutoBrightness();
}
/**
@@ -66,6 +70,13 @@ public final class DisplayBrightnessState {
return mDisplayBrightnessStrategyName;
}
/**
* @return {@code true} if the device is set up to run auto-brightness.
*/
public boolean getShouldUseAutoBrightness() {
return mShouldUseAutoBrightness;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder("DisplayBrightnessState:");
@@ -75,6 +86,8 @@ public final class DisplayBrightnessState {
stringBuilder.append(getSdrBrightness());
stringBuilder.append("\n brightnessReason:");
stringBuilder.append(getBrightnessReason());
stringBuilder.append("\n shouldUseAutoBrightness:");
stringBuilder.append(getShouldUseAutoBrightness());
return stringBuilder.toString();
}
@@ -91,28 +104,20 @@ public final class DisplayBrightnessState {
return false;
}
DisplayBrightnessState
displayBrightnessState = (DisplayBrightnessState) other;
DisplayBrightnessState otherState = (DisplayBrightnessState) other;
if (mBrightness != displayBrightnessState.getBrightness()) {
return false;
}
if (mSdrBrightness != displayBrightnessState.getSdrBrightness()) {
return false;
}
if (!mBrightnessReason.equals(displayBrightnessState.getBrightnessReason())) {
return false;
}
if (!mDisplayBrightnessStrategyName.equals(
displayBrightnessState.getDisplayBrightnessStrategyName())) {
return false;
}
return true;
return mBrightness == otherState.getBrightness()
&& mSdrBrightness == otherState.getSdrBrightness()
&& mBrightnessReason.equals(otherState.getBrightnessReason())
&& TextUtils.equals(mDisplayBrightnessStrategyName,
otherState.getDisplayBrightnessStrategyName())
&& mShouldUseAutoBrightness == otherState.getShouldUseAutoBrightness();
}
@Override
public int hashCode() {
return Objects.hash(mBrightness, mSdrBrightness, mBrightnessReason);
return Objects.hash(
mBrightness, mSdrBrightness, mBrightnessReason, mShouldUseAutoBrightness);
}
/**
@@ -123,6 +128,23 @@ public final class DisplayBrightnessState {
private float mSdrBrightness;
private BrightnessReason mBrightnessReason = new BrightnessReason();
private String mDisplayBrightnessStrategyName;
private boolean mShouldUseAutoBrightness;
/**
* Create a builder starting with the values from the specified {@link
* DisplayBrightnessState}.
*
* @param state The state from which to initialize.
*/
public static Builder from(DisplayBrightnessState state) {
Builder builder = new Builder();
builder.setBrightness(state.getBrightness());
builder.setSdrBrightness(state.getSdrBrightness());
builder.setBrightnessReason(state.getBrightnessReason());
builder.setDisplayBrightnessStrategyName(state.getDisplayBrightnessStrategyName());
builder.setShouldUseAutoBrightness(state.getShouldUseAutoBrightness());
return builder;
}
/**
* Gets the brightness
@@ -199,6 +221,21 @@ public final class DisplayBrightnessState {
return this;
}
/**
* See {@link DisplayBrightnessState#getShouldUseAutoBrightness}.
*/
public Builder setShouldUseAutoBrightness(boolean shouldUseAutoBrightness) {
this.mShouldUseAutoBrightness = shouldUseAutoBrightness;
return this;
}
/**
* See {@link DisplayBrightnessState#getShouldUseAutoBrightness}.
*/
public boolean getShouldUseAutoBrightness() {
return mShouldUseAutoBrightness;
}
/**
* This is used to construct an immutable DisplayBrightnessState object from its builder
*/

View File

@@ -495,7 +495,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
mWakelockController, mDisplayDeviceConfig, mHandler.getLooper(),
() -> updatePowerState(), mDisplayId, mSensorManager);
mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController);
mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy(context, mDisplayId);
mTag = "DisplayPowerController2[" + mDisplayId + "]";
mThermalBrightnessThrottlingDataId =
logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId;
@@ -566,6 +565,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
));
// Seed the cached brightness
saveBrightnessInfo(getScreenBrightnessSetting());
mAutomaticBrightnessStrategy =
mDisplayBrightnessController.getAutomaticBrightnessStrategy();
DisplayWhiteBalanceSettings displayWhiteBalanceSettings = null;
DisplayWhiteBalanceController displayWhiteBalanceController = null;
@@ -609,7 +610,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
setUpAutoBrightness(resources, handler);
mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic();
mColorFadeEnabled = mInjector.isColorFadeEnabled();
mColorFadeFadesConfig = resources.getBoolean(
R.bool.config_animateScreenLights);
@@ -1272,14 +1273,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
int state = mDisplayStateController
.updateDisplayState(mPowerRequest, mIsEnabled, mIsInTransition);
if (mScreenOffBrightnessSensorController != null) {
mScreenOffBrightnessSensorController
.setLightSensorEnabled(mAutomaticBrightnessStrategy.shouldUseAutoBrightness()
&& mIsEnabled && (state == Display.STATE_OFF || (state == Display.STATE_DOZE
&& !mDisplayBrightnessController.isAllowAutoBrightnessWhileDozingConfig()))
&& mLeadDisplayId == Layout.NO_LEAD_DISPLAY);
}
// Initialize things the first time the power state is changed.
if (mustInitialize) {
initialize(readyToUpdateDisplayState() ? state : Display.STATE_UNKNOWN);
@@ -1305,6 +1298,17 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
slowChange = mBrightnessToFollowSlowChange;
}
// Set up the ScreenOff controller used when coming out of SCREEN_OFF and the ALS sensor
// doesn't yet have a valid lux value to use with auto-brightness.
if (mScreenOffBrightnessSensorController != null) {
mScreenOffBrightnessSensorController
.setLightSensorEnabled(displayBrightnessState.getShouldUseAutoBrightness()
&& mIsEnabled && (state == Display.STATE_OFF
|| (state == Display.STATE_DOZE
&& !mDisplayBrightnessController.isAllowAutoBrightnessWhileDozingConfig()))
&& mLeadDisplayId == Layout.NO_LEAD_DISPLAY);
}
// Take note if the short term model was already active before applying the current
// request changes.
final boolean wasShortTermModelActive =
@@ -1580,7 +1584,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
notifyBrightnessTrackerChanged(brightnessState, userInitiatedChange,
wasShortTermModelActive, mAutomaticBrightnessStrategy.isAutoBrightnessEnabled(),
brightnessIsTemporary);
brightnessIsTemporary, displayBrightnessState.getShouldUseAutoBrightness());
// We save the brightness info *after* the brightness setting has been changed and
// adjustments made so that the brightness info reflects the latest value.
@@ -1624,8 +1628,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
mTempBrightnessEvent.setWasShortTermModelActive(wasShortTermModelActive);
mTempBrightnessEvent.setDisplayBrightnessStrategyName(displayBrightnessState
.getDisplayBrightnessStrategyName());
mTempBrightnessEvent.setAutomaticBrightnessEnabled(mAutomaticBrightnessStrategy
.shouldUseAutoBrightness());
mTempBrightnessEvent.setAutomaticBrightnessEnabled(
displayBrightnessState.getShouldUseAutoBrightness());
// Temporary is what we use during slider interactions. We avoid logging those so that
// we don't spam logcat when the slider is being used.
boolean tempToTempTransition =
@@ -2236,7 +2240,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
private void notifyBrightnessTrackerChanged(float brightness, boolean userInitiated,
boolean wasShortTermModelActive, boolean autobrightnessEnabled,
boolean brightnessIsTemporary) {
boolean brightnessIsTemporary, boolean shouldUseAutoBrightness) {
final float brightnessInNits =
mDisplayBrightnessController.convertToAdjustedNits(brightness);
@@ -2251,7 +2255,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|| mAutomaticBrightnessController.isInIdleMode()
|| !autobrightnessEnabled
|| mBrightnessTracker == null
|| !mAutomaticBrightnessStrategy.shouldUseAutoBrightness()
|| !shouldUseAutoBrightness
|| brightnessInNits < 0.0f) {
return;
}
@@ -2938,6 +2942,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
displayUniqueId, brightnessMin, brightnessMax, hbmData, hdrBrightnessCfg,
hbmChangeCallback, hbmMetadata, context);
}
boolean isColorFadeEnabled() {
return !ActivityManager.isLowRamDeviceStatic();
}
}
static class CachedBrightnessInfo {

View File

@@ -29,6 +29,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.AutomaticBrightnessController;
import com.android.server.display.BrightnessSetting;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy;
import com.android.server.display.brightness.strategy.DisplayBrightnessStrategy;
import java.io.PrintWriter;
@@ -134,11 +135,21 @@ public final class DisplayBrightnessController {
public DisplayBrightnessState updateBrightness(
DisplayManagerInternal.DisplayPowerRequest displayPowerRequest,
int targetDisplayState) {
DisplayBrightnessState state;
synchronized (mLock) {
mDisplayBrightnessStrategy = mDisplayBrightnessStrategySelector.selectStrategy(
displayPowerRequest, targetDisplayState);
return mDisplayBrightnessStrategy.updateBrightness(displayPowerRequest);
state = mDisplayBrightnessStrategy.updateBrightness(displayPowerRequest);
}
// This is a temporary measure until AutomaticBrightnessStrategy works as a traditional
// strategy.
// TODO: Remove when AutomaticBrightnessStrategy is populating the values directly.
if (state != null) {
state = addAutomaticBrightnessState(state);
}
return state;
}
/**
@@ -321,6 +332,13 @@ public final class DisplayBrightnessController {
loadNitBasedBrightnessSetting();
}
/**
* TODO(b/253226419): Remove once auto-brightness is a fully-functioning strategy.
*/
public AutomaticBrightnessStrategy getAutomaticBrightnessStrategy() {
return mDisplayBrightnessStrategySelector.getAutomaticBrightnessStrategy();
}
/**
* Convert a brightness float scale value to a nit value. Adjustments, such as RBC, are not
* applied. This is used when storing the brightness in nits for the default display and when
@@ -425,6 +443,18 @@ public final class DisplayBrightnessController {
}
}
/**
* TODO(b/253226419): Remove once auto-brightness is a fully-functioning strategy.
*/
private DisplayBrightnessState addAutomaticBrightnessState(DisplayBrightnessState state) {
AutomaticBrightnessStrategy autoStrat = getAutomaticBrightnessStrategy();
DisplayBrightnessState.Builder builder = DisplayBrightnessState.Builder.from(state);
builder.setShouldUseAutoBrightness(
autoStrat != null && autoStrat.shouldUseAutoBrightness());
return builder.build();
}
@GuardedBy("mLock")
private void setTemporaryBrightnessLocked(float temporaryBrightness) {
mDisplayBrightnessStrategySelector.getTemporaryDisplayBrightnessStrategy()

View File

@@ -25,6 +25,7 @@ import android.view.Display;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy;
import com.android.server.display.brightness.strategy.BoostBrightnessStrategy;
import com.android.server.display.brightness.strategy.DisplayBrightnessStrategy;
import com.android.server.display.brightness.strategy.DozeBrightnessStrategy;
@@ -60,6 +61,8 @@ public class DisplayBrightnessStrategySelector {
private final FollowerBrightnessStrategy mFollowerBrightnessStrategy;
// The brightness strategy used to manage the brightness state when the request is invalid.
private final InvalidBrightnessStrategy mInvalidBrightnessStrategy;
// Controls brightness when automatic (adaptive) brightness is running.
private final AutomaticBrightnessStrategy mAutomaticBrightnessStrategy;
// We take note of the old brightness strategy so that we can know when the strategy changes.
private String mOldBrightnessStrategyName;
@@ -81,6 +84,7 @@ public class DisplayBrightnessStrategySelector {
mBoostBrightnessStrategy = injector.getBoostBrightnessStrategy();
mFollowerBrightnessStrategy = injector.getFollowerBrightnessStrategy(displayId);
mInvalidBrightnessStrategy = injector.getInvalidBrightnessStrategy();
mAutomaticBrightnessStrategy = injector.getAutomaticBrightnessStrategy(context, displayId);
mAllowAutoBrightnessWhileDozingConfig = context.getResources().getBoolean(
R.bool.config_allowAutoBrightnessWhileDozing);
mOldBrightnessStrategyName = mInvalidBrightnessStrategy.getName();
@@ -130,6 +134,10 @@ public class DisplayBrightnessStrategySelector {
return mFollowerBrightnessStrategy;
}
public AutomaticBrightnessStrategy getAutomaticBrightnessStrategy() {
return mAutomaticBrightnessStrategy;
}
/**
* Returns a boolean flag indicating if the light sensor is to be used to decide the screen
* brightness when dozing
@@ -198,5 +206,9 @@ public class DisplayBrightnessStrategySelector {
InvalidBrightnessStrategy getInvalidBrightnessStrategy() {
return new InvalidBrightnessStrategy();
}
AutomaticBrightnessStrategy getAutomaticBrightnessStrategy(Context context, int displayId) {
return new AutomaticBrightnessStrategy(context, displayId);
}
}
}

View File

@@ -18,17 +18,23 @@ package com.android.server.display.brightness;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Resources;
import android.hardware.display.DisplayManagerInternal;
import android.view.Display;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.R;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.internal.util.test.FakeSettingsProviderRule;
import com.android.server.display.brightness.strategy.BoostBrightnessStrategy;
import com.android.server.display.brightness.strategy.DozeBrightnessStrategy;
import com.android.server.display.brightness.strategy.FollowerBrightnessStrategy;
@@ -38,6 +44,7 @@ import com.android.server.display.brightness.strategy.ScreenOffBrightnessStrateg
import com.android.server.display.brightness.strategy.TemporaryBrightnessStrategy;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -64,15 +71,20 @@ public final class DisplayBrightnessStrategySelectorTest {
@Mock
private FollowerBrightnessStrategy mFollowerBrightnessStrategy;
@Mock
private Context mContext;
@Mock
private Resources mResources;
private DisplayBrightnessStrategySelector mDisplayBrightnessStrategySelector;
private Context mContext;
@Rule
public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
@Before
public void before() {
MockitoAnnotations.initMocks(this);
mContext = spy(new ContextWrapper(ApplicationProvider.getApplicationContext()));
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContext);
when(mContext.getContentResolver()).thenReturn(contentResolver);
when(mContext.getResources()).thenReturn(mResources);
when(mInvalidBrightnessStrategy.getName()).thenReturn("InvalidBrightnessStrategy");
DisplayBrightnessStrategySelector.Injector injector =

View File

@@ -43,25 +43,50 @@ public class DisplayBrightnessStateTest {
public void validateAllDisplayBrightnessStateFieldsAreSetAsExpected() {
float brightness = 0.3f;
float sdrBrightness = 0.2f;
boolean shouldUseAutoBrightness = true;
BrightnessReason brightnessReason = new BrightnessReason();
brightnessReason.setReason(BrightnessReason.REASON_AUTOMATIC);
brightnessReason.setModifier(BrightnessReason.MODIFIER_DIMMED);
DisplayBrightnessState displayBrightnessState =
mDisplayBrightnessStateBuilder.setBrightness(brightness).setSdrBrightness(
sdrBrightness).setBrightnessReason(brightnessReason).build();
DisplayBrightnessState displayBrightnessState = mDisplayBrightnessStateBuilder
.setBrightness(brightness)
.setSdrBrightness(sdrBrightness)
.setBrightnessReason(brightnessReason)
.setShouldUseAutoBrightness(shouldUseAutoBrightness)
.build();
assertEquals(displayBrightnessState.getBrightness(), brightness, FLOAT_DELTA);
assertEquals(displayBrightnessState.getSdrBrightness(), sdrBrightness, FLOAT_DELTA);
assertEquals(displayBrightnessState.getBrightnessReason(), brightnessReason);
assertEquals(displayBrightnessState.getShouldUseAutoBrightness(), shouldUseAutoBrightness);
assertEquals(displayBrightnessState.toString(), getString(displayBrightnessState));
}
@Test
public void testFrom() {
BrightnessReason reason = new BrightnessReason();
reason.setReason(BrightnessReason.REASON_MANUAL);
reason.setModifier(BrightnessReason.MODIFIER_DIMMED);
DisplayBrightnessState state1 = new DisplayBrightnessState.Builder()
.setBrightnessReason(reason)
.setBrightness(0.26f)
.setSdrBrightness(0.23f)
.setShouldUseAutoBrightness(false)
.build();
DisplayBrightnessState state2 = DisplayBrightnessState.Builder.from(state1).build();
assertEquals(state1, state2);
}
private String getString(DisplayBrightnessState displayBrightnessState) {
StringBuilder sb = new StringBuilder();
sb.append("DisplayBrightnessState:");
sb.append("\n brightness:" + displayBrightnessState.getBrightness());
sb.append("\n sdrBrightness:" + displayBrightnessState.getSdrBrightness());
sb.append("\n brightnessReason:" + displayBrightnessState.getBrightnessReason());
sb.append("DisplayBrightnessState:")
.append("\n brightness:")
.append(displayBrightnessState.getBrightness())
.append("\n sdrBrightness:")
.append(displayBrightnessState.getSdrBrightness())
.append("\n brightnessReason:")
.append(displayBrightnessState.getBrightnessReason())
.append("\n shouldUseAutoBrightness:")
.append(displayBrightnessState.getShouldUseAutoBrightness());
return sb.toString();
}
}

View File

@@ -714,6 +714,8 @@ public final class DisplayPowerController2Test {
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_OFF);
DisplayPowerRequest dpr = new DisplayPowerRequest();
dpr.policy = DisplayPowerRequest.POLICY_OFF;
mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
@@ -751,6 +753,7 @@ public final class DisplayPowerController2Test {
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_DOZE);
DisplayPowerRequest dpr = new DisplayPowerRequest();
dpr.policy = DisplayPowerRequest.POLICY_DOZE;
mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);