From 238513aa70bc2eaa0743196908209ad414e2fe92 Mon Sep 17 00:00:00 2001 From: Long Ling Date: Sun, 16 Jan 2022 04:52:58 +0000 Subject: [PATCH] HBM_ON_HDR stats requires HBM enabled for HDR playback Report FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR event when HBM is enabled for HDR playback. Bug: 202869195 Test: atest HighBrightnessModeControllerTest Change-Id: I19680e0d144dea46bcd57f26e88261059f3b0fa5 --- .../display/HighBrightnessModeController.java | 24 +++++++++++++++++-- .../HighBrightnessModeControllerTest.java | 20 ++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/display/HighBrightnessModeController.java b/services/core/java/com/android/server/display/HighBrightnessModeController.java index 16273cef37b84..b3be894b9510e 100644 --- a/services/core/java/com/android/server/display/HighBrightnessModeController.java +++ b/services/core/java/com/android/server/display/HighBrightnessModeController.java @@ -91,6 +91,7 @@ class HighBrightnessModeController { private int mHeight; private float mAmbientLux; private int mDisplayStatsId; + private int mHbmStatsState = FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF; /** * If HBM is currently running, this is the start time for the current HBM session. @@ -278,6 +279,7 @@ class HighBrightnessModeController { pw.println(" mHbmMode=" + BrightnessInfo.hbmToString(mHbmMode) + (mHbmMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR ? "(" + getHdrBrightnessValue() + ")" : "")); + pw.println(" mHbmStatsState=" + hbmStatsStateToString(mHbmStatsState)); pw.println(" mHbmData=" + mHbmData); pw.println(" mAmbientLux=" + mAmbientLux + (mIsAutoBrightnessEnabled ? "" : " (old/invalid)")); @@ -444,8 +446,8 @@ class HighBrightnessModeController { private void updateHbmMode() { int newHbmMode = calculateHighBrightnessMode(); + updateHbmStats(mHbmMode, newHbmMode); if (mHbmMode != newHbmMode) { - updateHbmStats(mHbmMode, newHbmMode); mHbmMode = newHbmMode; mHbmChangeCallback.run(); } @@ -453,11 +455,16 @@ class HighBrightnessModeController { private void updateHbmStats(int mode, int newMode) { int state = FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF; - if (newMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR) { + if (newMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR + && getHdrBrightnessValue() > mHbmData.transitionPoint) { state = FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR; } else if (newMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT) { state = FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT; } + if (state == mHbmStatsState) { + return; + } + mHbmStatsState = state; int reason = FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN; @@ -491,6 +498,19 @@ class HighBrightnessModeController { mInjector.reportHbmStateChange(mDisplayStatsId, state, reason); } + private String hbmStatsStateToString(int hbmStatsState) { + switch (hbmStatsState) { + case FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF: + return "HBM_OFF"; + case FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR: + return "HBM_ON_HDR"; + case FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT: + return "HBM_ON_SUNLIGHT"; + default: + return String.valueOf(hbmStatsState); + } + } + private int calculateHighBrightnessMode() { if (!deviceSupportsHbm()) { return BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF; diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java index beecdadcd546d..4bb5d7482e25a 100644 --- a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java @@ -28,7 +28,9 @@ import static com.android.server.display.AutomaticBrightnessController import static com.android.server.display.HighBrightnessModeController.HBM_TRANSITION_POINT_INVALID; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -503,6 +505,24 @@ public class HighBrightnessModeControllerTest { eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_LUX_DROP)); } + @Test + public void tetHbmStats_NbmHdrNoReport() { + final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock()); + final int displayStatsId = mDisplayUniqueId.hashCode(); + + hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED); + hbmc.onBrightnessChanged(DEFAULT_MIN); + hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, + DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/); + advanceTime(0); + assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode()); + + // Verify Stats HBM_ON_HDR not report + verify(mInjectorMock, never()).reportHbmStateChange(eq(displayStatsId), + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR), + anyInt()); + } + @Test public void testHbmStats_ThermalOff() throws Exception { final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());