From dbbae482baf12f4edc9fe00493a30d99ec57c9a4 Mon Sep 17 00:00:00 2001 From: Sally Qi Date: Tue, 23 May 2023 13:14:41 -0700 Subject: [PATCH] Fix the issue of using SilkFx crash on non-HDR-supported phone. - ideally on non-HDR-supported phone, `Display#isHdrSdrRatioAvailable` should be false, while it's not the case in such phone now. The reason is hdrSdrRatio always gets updated. We should reject such update if there is no SdrHdrRatioMap loaded. Bug: 280804824 Test: play with SilkFX; LocalDisplayAdapterTest Change-Id: If162fc15cae033d056f22d02625ad955006dd65a --- .../com/android/server/display/DisplayDeviceConfig.java | 7 +++++++ .../com/android/server/display/LocalDisplayAdapter.java | 4 +++- .../android/server/display/LocalDisplayAdapterTest.java | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java index ca482dc41ce5c..7a797dd2250ce 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java +++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java @@ -888,6 +888,13 @@ public class DisplayDeviceConfig { return mBacklightToNitsSpline.interpolate(backlight); } + /** + * @return true if there is sdrHdrRatioMap, false otherwise. + */ + public boolean hasSdrToHdrRatioSpline() { + return mSdrToHdrRatioSpline != null; + } + /** * Calculate the HDR brightness for the specified SDR brightenss, restricted by the * maxDesiredHdrSdrRatio (the ratio between the HDR luminance and SDR luminance) diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 79984c9b53557..c7c0fab6140df 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -888,7 +888,9 @@ final class LocalDisplayAdapter extends DisplayAdapter { BrightnessSynchronizer.brightnessFloatToInt( sdrBrightnessState)); - handleHdrSdrNitsChanged(nits, sdrNits); + if (getDisplayDeviceConfig().hasSdrToHdrRatioSpline()) { + handleHdrSdrNitsChanged(nits, sdrNits); + } } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java index 5f82ec1dde027..b7dbaf93b9e20 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -27,6 +27,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; @@ -981,6 +982,7 @@ public class LocalDisplayAdapterTest { DisplayDevice displayDevice = mListener.addedDisplays.get(0); // Turn on / initialize + assumeTrue(displayDevice.getDisplayDeviceConfig().hasSdrToHdrRatioSpline()); Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0, 0); changeStateRunnable.run();