Merge "Don't create HBMMetadata for displays that don't support HBM" into udc-qpr-dev am: 9958309dac
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24061424 Change-Id: Ic58dbe925e658e29927b49bc9443afa81cfdfd8b Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -41,6 +41,9 @@ class HighBrightnessModeMetadataMapper {
|
||||
+ display.getDisplayIdLocked());
|
||||
return null;
|
||||
}
|
||||
if (device.getDisplayDeviceConfig().getHighBrightnessModeData() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final String uniqueId = device.getUniqueId();
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user