Merge "Don't create HBMMetadata for displays that don't support HBM" into udc-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
9958309dac
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
Reference in New Issue
Block a user