Loading services/core/java/com/android/server/display/BrightnessRangeController.java +1 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ class BrightnessRangeController { mModeChangeCallback = modeChangeCallback; mHdrClamper = hdrClamper; mNormalBrightnessModeController = normalBrightnessModeController; mUseHdrClamper = flags.isHdrClamperEnabled(); mUseHdrClamper = flags.isHdrClamperEnabled() && !flags.useNewHdrBrightnessModifier(); mUseNbmController = flags.isNbmControllerEnabled(); if (mUseNbmController) { mNormalBrightnessModeController.resetNbmData( Loading services/core/java/com/android/server/display/brightness/clamper/HdrBrightnessModifier.java +18 −17 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.server.display.DisplayBrightnessState; import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.brightness.BrightnessReason; import com.android.server.display.config.HdrBrightnessData; import java.io.PrintWriter; Loading Loading @@ -99,7 +100,7 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, mMaxBrightness = mPendingMaxBrightness; mClamperChangeListener.onChanged(); }; onDisplayChanged(displayData); mHandler.post(() -> onDisplayChanged(displayData)); } // Called in DisplayControllerHandler Loading @@ -120,6 +121,8 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, stateBuilder.setHdrBrightness(hdrBrightness); stateBuilder.setCustomAnimationRate(mTransitionRate); stateBuilder.getBrightnessReason().addModifier(BrightnessReason.MODIFIER_HDR); // transition rate applied, reset mTransitionRate = CUSTOM_ANIMATION_RATE_NOT_SET; } Loading Loading @@ -168,10 +171,18 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, } } // Called in DisplayControllerHandler @Override public void onDisplayChanged(BrightnessClamperController.DisplayDeviceData displayData) { mHandler.post(() -> onDisplayChanged(displayData.mDisplayToken, displayData.mWidth, displayData.mHeight, displayData.mDisplayDeviceConfig)); mDisplayDeviceConfig = displayData.mDisplayDeviceConfig; mScreenSize = (float) displayData.mWidth * displayData.mHeight; HdrBrightnessData data = mDisplayDeviceConfig.getHdrBrightnessData(); if (data == null) { unregisterHdrListener(); } else { registerHdrListener(displayData.mDisplayToken); } recalculate(data, mMaxDesiredHdrRatio); } // Called in DisplayControllerHandler, when any modifier state changes Loading Loading @@ -214,20 +225,6 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, // && expectedMaxBrightness != mMaxBrightness } // Called in DisplayControllerHandler private void onDisplayChanged(IBinder displayToken, int width, int height, DisplayDeviceConfig config) { mDisplayDeviceConfig = config; mScreenSize = (float) width * height; HdrBrightnessData data = config.getHdrBrightnessData(); if (data == null) { unregisterHdrListener(); } else { registerHdrListener(displayToken); } recalculate(data, mMaxDesiredHdrRatio); } // Called in DisplayControllerHandler private void recalculate(@Nullable HdrBrightnessData data, float maxDesiredHdrRatio) { Mode newMode = recalculateMode(data); Loading Loading @@ -258,6 +255,10 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, if (data == null) { return Mode.NO_HDR; } // no HDR layer present if (mHdrLayerSize == DEFAULT_HDR_LAYER_SIZE) { return Mode.NO_HDR; } // HDR layer < minHdr % for Nbm if (mHdrLayerSize < mScreenSize * data.minimumHdrPercentOfScreenForNbm) { return Mode.NO_HDR; Loading services/core/java/com/android/server/display/brightness/clamper/LightSensorController.java +8 −7 Original line number Diff line number Diff line Loading @@ -62,6 +62,9 @@ public class LightSensorController { private final SensorEventListener mLightSensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { if (event.sensor != mRegisteredLightSensor) { return; } long now = mInjector.getTime(); mAmbientFilter.addValue(TimeUnit.NANOSECONDS.toMillis(event.timestamp), event.values[0]); Loading Loading @@ -95,15 +98,13 @@ public class LightSensorController { if (mRegisteredLightSensor == mLightSensor) { return; } if (mLightSensor != null) { mSensorManager.registerListener(mLightSensorEventListener, mLightSensor, mLightSensorRate * 1000, mHandler); } if (mRegisteredLightSensor != null) { stop(); } if (mLightSensor == null) { return; } mSensorManager.registerListener(mLightSensorEventListener, mLightSensor, mLightSensorRate * 1000, mHandler); mRegisteredLightSensor = mLightSensor; if (DEBUG) { Loading @@ -115,7 +116,7 @@ public class LightSensorController { if (mRegisteredLightSensor == null) { return; } mSensorManager.unregisterListener(mLightSensorEventListener); mSensorManager.unregisterListener(mLightSensorEventListener, mRegisteredLightSensor); mRegisteredLightSensor = null; mAmbientFilter.clear(); mLightSensorListener.onAmbientLuxChange(INVALID_LUX); Loading services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/LightSensorControllerTest.kt +22 −14 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.server.display.config.SensorData import com.android.server.display.config.createSensorData import com.android.server.display.utils.AmbientFilter import org.junit.Before import org.junit.Test import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.eq Loading Loading @@ -62,31 +63,35 @@ class LightSensorControllerTest { mockLightSensorListener, mockHandler, testInjector) } fun `does not register light sensor if is not configured`() { @Test fun doesNotRegisterLightSensorIfNotConfigured() { controller.restart() verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `does not register light sensor if missing`() { @Test fun doesNotRegisterLightSensorIfMissing() { controller.configure(dummySensorData, DISPLAY_ID) controller.restart() verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `register light sensor if configured and present`() { @Test fun registerLightSensorIfConfiguredAndPresent() { testInjector.lightSensor = TestUtils .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) controller.configure(dummySensorData, DISPLAY_ID) controller.restart() verify(mockSensorManager).registerListener(any(), testInjector.lightSensor, LIGHT_SENSOR_RATE * 1000, mockHandler) eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `register light sensor once if not changed`() { @Test fun registerLightSensorOnceIfNotChanged() { testInjector.lightSensor = TestUtils .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) controller.configure(dummySensorData, DISPLAY_ID) Loading @@ -95,11 +100,12 @@ class LightSensorControllerTest { controller.restart() verify(mockSensorManager).registerListener(any(), testInjector.lightSensor, LIGHT_SENSOR_RATE * 1000, mockHandler) eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `register new light sensor and unregister old if changed`() { @Test fun registerNewAndUnregisterOldLightSensorIfChanged() { val lightSensor1 = TestUtils .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) testInjector.lightSensor = lightSensor1 Loading @@ -112,19 +118,21 @@ class LightSensorControllerTest { controller.configure(dummySensorData, DISPLAY_ID) controller.restart() inOrder { inOrder(mockSensorManager, mockAmbientFilter, mockLightSensorListener) { verify(mockSensorManager).registerListener(any(), lightSensor1, LIGHT_SENSOR_RATE * 1000, mockHandler) verify(mockSensorManager).unregisterListener(any<SensorEventListener>()) eq(lightSensor1), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verify(mockSensorManager).registerListener(any(), eq(lightSensor2), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verify(mockSensorManager).unregisterListener(any<SensorEventListener>(), eq(lightSensor1)) verify(mockAmbientFilter).clear() verify(mockLightSensorListener).onAmbientLuxChange(LightSensorController.INVALID_LUX) verify(mockSensorManager).registerListener(any(), lightSensor2, LIGHT_SENSOR_RATE * 1000, mockHandler) } verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `notifies listener on ambient lux change`() { @Test fun notifiesListenerOnAmbientLuxChange() { val expectedLux = 40f val eventLux = 50 val eventTime = 60L Loading @@ -141,7 +149,7 @@ class LightSensorControllerTest { listener.onSensorChanged(TestUtils.createSensorEvent(testInjector.lightSensor, eventLux, eventTime * 1_000_000)) inOrder { inOrder(mockAmbientFilter, mockLightSensorListener) { verify(mockAmbientFilter).addValue(eventTime, eventLux.toFloat()) verify(mockLightSensorListener).onAmbientLuxChange(expectedLux) } Loading Loading
services/core/java/com/android/server/display/BrightnessRangeController.java +1 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ class BrightnessRangeController { mModeChangeCallback = modeChangeCallback; mHdrClamper = hdrClamper; mNormalBrightnessModeController = normalBrightnessModeController; mUseHdrClamper = flags.isHdrClamperEnabled(); mUseHdrClamper = flags.isHdrClamperEnabled() && !flags.useNewHdrBrightnessModifier(); mUseNbmController = flags.isNbmControllerEnabled(); if (mUseNbmController) { mNormalBrightnessModeController.resetNbmData( Loading
services/core/java/com/android/server/display/brightness/clamper/HdrBrightnessModifier.java +18 −17 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.server.display.DisplayBrightnessState; import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.brightness.BrightnessReason; import com.android.server.display.config.HdrBrightnessData; import java.io.PrintWriter; Loading Loading @@ -99,7 +100,7 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, mMaxBrightness = mPendingMaxBrightness; mClamperChangeListener.onChanged(); }; onDisplayChanged(displayData); mHandler.post(() -> onDisplayChanged(displayData)); } // Called in DisplayControllerHandler Loading @@ -120,6 +121,8 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, stateBuilder.setHdrBrightness(hdrBrightness); stateBuilder.setCustomAnimationRate(mTransitionRate); stateBuilder.getBrightnessReason().addModifier(BrightnessReason.MODIFIER_HDR); // transition rate applied, reset mTransitionRate = CUSTOM_ANIMATION_RATE_NOT_SET; } Loading Loading @@ -168,10 +171,18 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, } } // Called in DisplayControllerHandler @Override public void onDisplayChanged(BrightnessClamperController.DisplayDeviceData displayData) { mHandler.post(() -> onDisplayChanged(displayData.mDisplayToken, displayData.mWidth, displayData.mHeight, displayData.mDisplayDeviceConfig)); mDisplayDeviceConfig = displayData.mDisplayDeviceConfig; mScreenSize = (float) displayData.mWidth * displayData.mHeight; HdrBrightnessData data = mDisplayDeviceConfig.getHdrBrightnessData(); if (data == null) { unregisterHdrListener(); } else { registerHdrListener(displayData.mDisplayToken); } recalculate(data, mMaxDesiredHdrRatio); } // Called in DisplayControllerHandler, when any modifier state changes Loading Loading @@ -214,20 +225,6 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, // && expectedMaxBrightness != mMaxBrightness } // Called in DisplayControllerHandler private void onDisplayChanged(IBinder displayToken, int width, int height, DisplayDeviceConfig config) { mDisplayDeviceConfig = config; mScreenSize = (float) width * height; HdrBrightnessData data = config.getHdrBrightnessData(); if (data == null) { unregisterHdrListener(); } else { registerHdrListener(displayToken); } recalculate(data, mMaxDesiredHdrRatio); } // Called in DisplayControllerHandler private void recalculate(@Nullable HdrBrightnessData data, float maxDesiredHdrRatio) { Mode newMode = recalculateMode(data); Loading Loading @@ -258,6 +255,10 @@ public class HdrBrightnessModifier implements BrightnessStateModifier, if (data == null) { return Mode.NO_HDR; } // no HDR layer present if (mHdrLayerSize == DEFAULT_HDR_LAYER_SIZE) { return Mode.NO_HDR; } // HDR layer < minHdr % for Nbm if (mHdrLayerSize < mScreenSize * data.minimumHdrPercentOfScreenForNbm) { return Mode.NO_HDR; Loading
services/core/java/com/android/server/display/brightness/clamper/LightSensorController.java +8 −7 Original line number Diff line number Diff line Loading @@ -62,6 +62,9 @@ public class LightSensorController { private final SensorEventListener mLightSensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { if (event.sensor != mRegisteredLightSensor) { return; } long now = mInjector.getTime(); mAmbientFilter.addValue(TimeUnit.NANOSECONDS.toMillis(event.timestamp), event.values[0]); Loading Loading @@ -95,15 +98,13 @@ public class LightSensorController { if (mRegisteredLightSensor == mLightSensor) { return; } if (mLightSensor != null) { mSensorManager.registerListener(mLightSensorEventListener, mLightSensor, mLightSensorRate * 1000, mHandler); } if (mRegisteredLightSensor != null) { stop(); } if (mLightSensor == null) { return; } mSensorManager.registerListener(mLightSensorEventListener, mLightSensor, mLightSensorRate * 1000, mHandler); mRegisteredLightSensor = mLightSensor; if (DEBUG) { Loading @@ -115,7 +116,7 @@ public class LightSensorController { if (mRegisteredLightSensor == null) { return; } mSensorManager.unregisterListener(mLightSensorEventListener); mSensorManager.unregisterListener(mLightSensorEventListener, mRegisteredLightSensor); mRegisteredLightSensor = null; mAmbientFilter.clear(); mLightSensorListener.onAmbientLuxChange(INVALID_LUX); Loading
services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/LightSensorControllerTest.kt +22 −14 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.server.display.config.SensorData import com.android.server.display.config.createSensorData import com.android.server.display.utils.AmbientFilter import org.junit.Before import org.junit.Test import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.eq Loading Loading @@ -62,31 +63,35 @@ class LightSensorControllerTest { mockLightSensorListener, mockHandler, testInjector) } fun `does not register light sensor if is not configured`() { @Test fun doesNotRegisterLightSensorIfNotConfigured() { controller.restart() verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `does not register light sensor if missing`() { @Test fun doesNotRegisterLightSensorIfMissing() { controller.configure(dummySensorData, DISPLAY_ID) controller.restart() verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `register light sensor if configured and present`() { @Test fun registerLightSensorIfConfiguredAndPresent() { testInjector.lightSensor = TestUtils .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) controller.configure(dummySensorData, DISPLAY_ID) controller.restart() verify(mockSensorManager).registerListener(any(), testInjector.lightSensor, LIGHT_SENSOR_RATE * 1000, mockHandler) eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `register light sensor once if not changed`() { @Test fun registerLightSensorOnceIfNotChanged() { testInjector.lightSensor = TestUtils .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) controller.configure(dummySensorData, DISPLAY_ID) Loading @@ -95,11 +100,12 @@ class LightSensorControllerTest { controller.restart() verify(mockSensorManager).registerListener(any(), testInjector.lightSensor, LIGHT_SENSOR_RATE * 1000, mockHandler) eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `register new light sensor and unregister old if changed`() { @Test fun registerNewAndUnregisterOldLightSensorIfChanged() { val lightSensor1 = TestUtils .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) testInjector.lightSensor = lightSensor1 Loading @@ -112,19 +118,21 @@ class LightSensorControllerTest { controller.configure(dummySensorData, DISPLAY_ID) controller.restart() inOrder { inOrder(mockSensorManager, mockAmbientFilter, mockLightSensorListener) { verify(mockSensorManager).registerListener(any(), lightSensor1, LIGHT_SENSOR_RATE * 1000, mockHandler) verify(mockSensorManager).unregisterListener(any<SensorEventListener>()) eq(lightSensor1), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verify(mockSensorManager).registerListener(any(), eq(lightSensor2), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verify(mockSensorManager).unregisterListener(any<SensorEventListener>(), eq(lightSensor1)) verify(mockAmbientFilter).clear() verify(mockLightSensorListener).onAmbientLuxChange(LightSensorController.INVALID_LUX) verify(mockSensorManager).registerListener(any(), lightSensor2, LIGHT_SENSOR_RATE * 1000, mockHandler) } verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } fun `notifies listener on ambient lux change`() { @Test fun notifiesListenerOnAmbientLuxChange() { val expectedLux = 40f val eventLux = 50 val eventTime = 60L Loading @@ -141,7 +149,7 @@ class LightSensorControllerTest { listener.onSensorChanged(TestUtils.createSensorEvent(testInjector.lightSensor, eventLux, eventTime * 1_000_000)) inOrder { inOrder(mockAmbientFilter, mockLightSensorListener) { verify(mockAmbientFilter).addValue(eventTime, eventLux.toFloat()) verify(mockLightSensorListener).onAmbientLuxChange(expectedLux) } Loading