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.
HighBrightnessModeMetadata hbmMetadata =
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()) {
displayPowerController = new DisplayPowerController2(
mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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