Merge "Don't create HBMMetadata for displays that don't support HBM" into udc-qpr-dev

This commit is contained in:
Treehugger Robot
2023-07-25 11:02:32 +00:00
committed by Android (Google) Code Review
7 changed files with 87 additions and 37 deletions

View File

@@ -3151,11 +3151,6 @@ public final class DisplayManagerService extends SystemService {
// with the corresponding displaydevice. // with the corresponding displaydevice.
HighBrightnessModeMetadata hbmMetadata = HighBrightnessModeMetadata hbmMetadata =
mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display);
if (hbmMetadata == null) {
Slog.wtf(TAG, "High Brightness Mode Metadata is null in DisplayManagerService for "
+ "display: " + display.getDisplayIdLocked());
return null;
}
if (mConfigParameterProvider.isNewPowerControllerFeatureEnabled()) { if (mConfigParameterProvider.isNewPowerControllerFeatureEnabled()) {
displayPowerController = new DisplayPowerController2( displayPowerController = new DisplayPowerController2(
mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler, mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,

View File

@@ -450,6 +450,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
private float[] mNitsRange; private float[] mNitsRange;
private final BrightnessRangeController mBrightnessRangeController; private final BrightnessRangeController mBrightnessRangeController;
@Nullable
private final HighBrightnessModeMetadata mHighBrightnessModeMetadata; private final HighBrightnessModeMetadata mHighBrightnessModeMetadata;
private final BrightnessThrottler mBrightnessThrottler; private final BrightnessThrottler mBrightnessThrottler;

View File

@@ -16,6 +16,7 @@
package com.android.server.display; package com.android.server.display;
import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.hardware.display.BrightnessInfo; import android.hardware.display.BrightnessInfo;
@@ -75,6 +76,8 @@ class HighBrightnessModeController {
private final Injector mInjector; private final Injector mInjector;
private HdrListener mHdrListener; private HdrListener mHdrListener;
@Nullable
private HighBrightnessModeData mHbmData; private HighBrightnessModeData mHbmData;
private HdrBrightnessDeviceConfig mHdrBrightnessCfg; private HdrBrightnessDeviceConfig mHdrBrightnessCfg;
private IBinder mRegisteredDisplayToken; private IBinder mRegisteredDisplayToken;
@@ -107,7 +110,9 @@ class HighBrightnessModeController {
* If HBM is currently running, this is the start time and set of all events, * If HBM is currently running, this is the start time and set of all events,
* for the current HBM session. * for the current HBM session.
*/ */
private HighBrightnessModeMetadata mHighBrightnessModeMetadata = null; @Nullable
private HighBrightnessModeMetadata mHighBrightnessModeMetadata;
HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken,
String displayUniqueId, float brightnessMin, float brightnessMax, String displayUniqueId, float brightnessMin, float brightnessMax,
HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg, HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg,
@@ -310,23 +315,29 @@ class HighBrightnessModeController {
pw.println(" mBrightnessMax=" + mBrightnessMax); pw.println(" mBrightnessMax=" + mBrightnessMax);
pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis())); pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis()));
pw.println(" mIsTimeAvailable= " + mIsTimeAvailable); pw.println(" mIsTimeAvailable= " + mIsTimeAvailable);
pw.println(" mRunningStartTimeMillis="
+ TimeUtils.formatUptime(mHighBrightnessModeMetadata.getRunningStartTimeMillis()));
pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode); pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode);
pw.println(" width*height=" + mWidth + "*" + mHeight); pw.println(" width*height=" + mWidth + "*" + mHeight);
pw.println(" mEvents=");
final long currentTime = mClock.uptimeMillis(); if (mHighBrightnessModeMetadata != null) {
long lastStartTime = currentTime; pw.println(" mRunningStartTimeMillis="
long runningStartTimeMillis = mHighBrightnessModeMetadata.getRunningStartTimeMillis(); + TimeUtils.formatUptime(
if (runningStartTimeMillis != -1) { mHighBrightnessModeMetadata.getRunningStartTimeMillis()));
lastStartTime = dumpHbmEvent(pw, new HbmEvent(runningStartTimeMillis, currentTime)); pw.println(" mEvents=");
} final long currentTime = mClock.uptimeMillis();
for (HbmEvent event : mHighBrightnessModeMetadata.getHbmEventQueue()) { long lastStartTime = currentTime;
if (lastStartTime > event.getEndTimeMillis()) { long runningStartTimeMillis = mHighBrightnessModeMetadata.getRunningStartTimeMillis();
pw.println(" event: [normal brightness]: " if (runningStartTimeMillis != -1) {
+ TimeUtils.formatDuration(lastStartTime - event.getEndTimeMillis())); lastStartTime = dumpHbmEvent(pw, new HbmEvent(runningStartTimeMillis, currentTime));
} }
lastStartTime = dumpHbmEvent(pw, event); for (HbmEvent event : mHighBrightnessModeMetadata.getHbmEventQueue()) {
if (lastStartTime > event.getEndTimeMillis()) {
pw.println(" event: [normal brightness]: "
+ TimeUtils.formatDuration(lastStartTime - event.getEndTimeMillis()));
}
lastStartTime = dumpHbmEvent(pw, event);
}
} else {
pw.println(" mHighBrightnessModeMetadata=null");
} }
} }
@@ -353,7 +364,7 @@ class HighBrightnessModeController {
} }
private boolean deviceSupportsHbm() { private boolean deviceSupportsHbm() {
return mHbmData != null; return mHbmData != null && mHighBrightnessModeMetadata != null;
} }
private long calculateRemainingTime(long currentTime) { private long calculateRemainingTime(long currentTime) {

View File

@@ -41,6 +41,9 @@ class HighBrightnessModeMetadataMapper {
+ display.getDisplayIdLocked()); + display.getDisplayIdLocked());
return null; return null;
} }
if (device.getDisplayDeviceConfig().getHighBrightnessModeData() == null) {
return null;
}
final String uniqueId = device.getUniqueId(); final String uniqueId = device.getUniqueId();

View File

@@ -50,6 +50,7 @@ import android.os.IBinder;
import android.os.Looper; import android.os.Looper;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.test.TestLooper; import android.os.test.TestLooper;
import android.provider.Settings; import android.provider.Settings;
import android.testing.TestableContext; import android.testing.TestableContext;
@@ -144,11 +145,12 @@ public final class DisplayPowerController2Test {
mTestLooper = new TestLooper(mClock::now); mTestLooper = new TestLooper(mClock::now);
mHandler = new Handler(mTestLooper.getLooper()); mHandler = new Handler(mTestLooper.getLooper());
// Put the system into manual brightness by default, just to minimize unexpected events and // Set some settings to minimize unexpected events and have a consistent starting state
// have a consistent starting state
Settings.System.putInt(mContext.getContentResolver(), Settings.System.putInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
Settings.System.putFloatForUser(mContext.getContentResolver(),
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, UserHandle.USER_CURRENT);
addLocalServiceMock(WindowManagerPolicy.class, mWindowManagerPolicyMock); addLocalServiceMock(WindowManagerPolicy.class, mWindowManagerPolicyMock);
addLocalServiceMock(ColorDisplayService.ColorDisplayServiceInternal.class, addLocalServiceMock(ColorDisplayService.ColorDisplayServiceInternal.class,

View File

@@ -50,6 +50,7 @@ import android.os.IBinder;
import android.os.Looper; import android.os.Looper;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.test.TestLooper; import android.os.test.TestLooper;
import android.provider.Settings; import android.provider.Settings;
import android.testing.TestableContext; import android.testing.TestableContext;
@@ -144,12 +145,12 @@ public final class DisplayPowerControllerTest {
mTestLooper = new TestLooper(mClock::now); mTestLooper = new TestLooper(mClock::now);
mHandler = new Handler(mTestLooper.getLooper()); mHandler = new Handler(mTestLooper.getLooper());
// Put the system into manual brightness by default, just to minimize unexpected events and // Set some settings to minimize unexpected events and have a consistent starting state
// have a consistent starting state
Settings.System.putInt(mContext.getContentResolver(), Settings.System.putInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
Settings.System.putFloatForUser(mContext.getContentResolver(),
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, UserHandle.USER_CURRENT);
addLocalServiceMock(WindowManagerPolicy.class, mWindowManagerPolicyMock); addLocalServiceMock(WindowManagerPolicy.class, mWindowManagerPolicyMock);
addLocalServiceMock(ColorDisplayService.ColorDisplayServiceInternal.class, addLocalServiceMock(ColorDisplayService.ColorDisplayServiceInternal.class,

View File

@@ -17,35 +17,69 @@
package com.android.server.display; package com.android.server.display;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
public class HighBrightnessModeMetadataMapperTest { public class HighBrightnessModeMetadataMapperTest {
@Mock
private LogicalDisplay mDisplayMock;
@Mock
private DisplayDevice mDeviceMock;
@Mock
private DisplayDeviceConfig mDdcMock;
@Mock
private DisplayDeviceConfig.HighBrightnessModeData mHbmDataMock;
private HighBrightnessModeMetadataMapper mHighBrightnessModeMetadataMapper; private HighBrightnessModeMetadataMapper mHighBrightnessModeMetadataMapper;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
when(mDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(mDeviceMock);
when(mDeviceMock.getDisplayDeviceConfig()).thenReturn(mDdcMock);
when(mDdcMock.getHighBrightnessModeData()).thenReturn(mHbmDataMock);
mHighBrightnessModeMetadataMapper = new HighBrightnessModeMetadataMapper(); mHighBrightnessModeMetadataMapper = new HighBrightnessModeMetadataMapper();
} }
@Test @Test
public void testGetHighBrightnessModeMetadata() { public void testGetHighBrightnessModeMetadata_NoDisplayDevice() {
// Display device is null when(mDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(null);
final LogicalDisplay display = mock(LogicalDisplay.class); assertNull(mHighBrightnessModeMetadataMapper
when(display.getPrimaryDisplayDeviceLocked()).thenReturn(null); .getHighBrightnessModeMetadataLocked(mDisplayMock));
assertNull(mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display)); }
// No HBM metadata stored for this display yet @Test
final DisplayDevice device = mock(DisplayDevice.class); public void testGetHighBrightnessModeMetadata_NoHBMData() {
when(display.getPrimaryDisplayDeviceLocked()).thenReturn(device); when(mDdcMock.getHighBrightnessModeData()).thenReturn(null);
assertNull(mHighBrightnessModeMetadataMapper
.getHighBrightnessModeMetadataLocked(mDisplayMock));
}
@Test
public void testGetHighBrightnessModeMetadata_NewDisplay() {
HighBrightnessModeMetadata hbmMetadata = HighBrightnessModeMetadata hbmMetadata =
mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(mDisplayMock);
assertNotNull(hbmMetadata);
assertTrue(hbmMetadata.getHbmEventQueue().isEmpty());
assertTrue(hbmMetadata.getRunningStartTimeMillis() < 0);
}
@Test
public void testGetHighBrightnessModeMetadata_Modify() {
HighBrightnessModeMetadata hbmMetadata =
mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(mDisplayMock);
assertNotNull(hbmMetadata);
assertTrue(hbmMetadata.getHbmEventQueue().isEmpty()); assertTrue(hbmMetadata.getHbmEventQueue().isEmpty());
assertTrue(hbmMetadata.getRunningStartTimeMillis() < 0); assertTrue(hbmMetadata.getRunningStartTimeMillis() < 0);
@@ -55,8 +89,10 @@ public class HighBrightnessModeMetadataMapperTest {
long setTime = 300; long setTime = 300;
hbmMetadata.addHbmEvent(new HbmEvent(startTimeMillis, endTimeMillis)); hbmMetadata.addHbmEvent(new HbmEvent(startTimeMillis, endTimeMillis));
hbmMetadata.setRunningStartTimeMillis(setTime); hbmMetadata.setRunningStartTimeMillis(setTime);
hbmMetadata = hbmMetadata =
mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(mDisplayMock);
assertEquals(1, hbmMetadata.getHbmEventQueue().size()); assertEquals(1, hbmMetadata.getHbmEventQueue().size());
assertEquals(startTimeMillis, assertEquals(startTimeMillis,
hbmMetadata.getHbmEventQueue().getFirst().getStartTimeMillis()); hbmMetadata.getHbmEventQueue().getFirst().getStartTimeMillis());