diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java index d57a272217e28..00bccc686919c 100644 --- a/core/java/android/hardware/display/DisplayManagerInternal.java +++ b/core/java/android/hardware/display/DisplayManagerInternal.java @@ -28,6 +28,7 @@ import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.DisplayInfo; +import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.window.DisplayWindowPolicyController; import android.window.ScreenCapture; @@ -397,6 +398,11 @@ public abstract class DisplayManagerInternal { */ public abstract DisplayWindowPolicyController getDisplayWindowPolicyController(int displayId); + /** + * Get DisplayPrimaries from SF for a particular display. + */ + public abstract SurfaceControl.DisplayPrimaries getDisplayNativePrimaries(int displayId); + /** * Describes the requested power state of the display. * diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 3a037edf12eb0..9ab78bc9cb321 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -3884,6 +3884,19 @@ public final class DisplayManagerService extends SystemService { return displayIdToMirror; } } + + @Override + public SurfaceControl.DisplayPrimaries getDisplayNativePrimaries(int displayId) { + IBinder displayToken; + synchronized (mSyncRoot) { + displayToken = getDisplayToken(displayId); + if (displayToken == null) { + throw new IllegalArgumentException("Invalid displayId=" + displayId); + } + } + + return SurfaceControl.getDisplayNativePrimaries(displayToken); + } } class DesiredDisplayModeSpecsObserver diff --git a/services/core/java/com/android/server/display/color/ColorDisplayService.java b/services/core/java/com/android/server/display/color/ColorDisplayService.java index b51f3f5876594..21a851895c154 100644 --- a/services/core/java/com/android/server/display/color/ColorDisplayService.java +++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java @@ -50,6 +50,7 @@ import android.database.ContentObserver; import android.hardware.display.ColorDisplayManager; import android.hardware.display.ColorDisplayManager.AutoMode; import android.hardware.display.ColorDisplayManager.ColorMode; +import android.hardware.display.DisplayManagerInternal; import android.hardware.display.IColorDisplayManager; import android.hardware.display.Time; import android.net.Uri; @@ -154,7 +155,8 @@ public final class ColorDisplayService extends SystemService { @VisibleForTesting final DisplayWhiteBalanceTintController mDisplayWhiteBalanceTintController = - new DisplayWhiteBalanceTintController(); + new DisplayWhiteBalanceTintController( + LocalServices.getService(DisplayManagerInternal.class)); private final NightDisplayTintController mNightDisplayTintController = new NightDisplayTintController(); private final TintController mGlobalSaturationTintController = diff --git a/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java b/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java index 93a78c1507ad1..c5dd6acdd008c 100644 --- a/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java +++ b/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java @@ -16,6 +16,8 @@ package com.android.server.display.color; +import static android.view.Display.DEFAULT_DISPLAY; + import static com.android.server.display.color.DisplayTransformManager.LEVEL_COLOR_MATRIX_DISPLAY_WHITE_BALANCE; import android.annotation.NonNull; @@ -24,10 +26,9 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.ColorSpace; import android.hardware.display.ColorDisplayManager; +import android.hardware.display.DisplayManagerInternal; import android.opengl.Matrix; -import android.os.IBinder; import android.util.Slog; -import android.view.SurfaceControl; import android.view.SurfaceControl.DisplayPrimaries; import com.android.internal.R; @@ -64,6 +65,12 @@ final class DisplayWhiteBalanceTintController extends TintController { // This feature becomes disallowed if the device is in an unsupported strong/light state. private boolean mIsAllowed = true; + private final DisplayManagerInternal mDisplayManagerInternal; + + DisplayWhiteBalanceTintController(DisplayManagerInternal dm) { + mDisplayManagerInternal = dm; + } + @Override public void setUp(Context context, boolean needsLinear) { mSetUp = false; @@ -287,12 +294,8 @@ final class DisplayWhiteBalanceTintController extends TintController { } private ColorSpace.Rgb getDisplayColorSpaceFromSurfaceControl() { - final IBinder displayToken = SurfaceControl.getInternalDisplayToken(); - if (displayToken == null) { - return null; - } - - DisplayPrimaries primaries = SurfaceControl.getDisplayNativePrimaries(displayToken); + DisplayPrimaries primaries = + mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY); if (primaries == null || primaries.red == null || primaries.green == null || primaries.blue == null || primaries.white == null) { return null; diff --git a/services/tests/mockingservicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java index bc9e9bb9bce85..941a3a419d597 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java @@ -16,14 +16,18 @@ package com.android.server.display.color; +import static android.view.Display.DEFAULT_DISPLAY; + import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertArrayEquals; +import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; +import android.hardware.display.DisplayManagerInternal; import android.os.Binder; import android.os.IBinder; import android.view.SurfaceControl; @@ -50,6 +54,8 @@ public class DisplayWhiteBalanceTintControllerTest { private Context mMockedContext; @Mock private Resources mMockedResources; + @Mock + private DisplayManagerInternal mDisplayManagerInternal; private MockitoSession mSession; private Resources mResources; @@ -81,7 +87,6 @@ public class DisplayWhiteBalanceTintControllerTest { doReturn(mMockedResources).when(mMockedContext).getResources(); mDisplayToken = new Binder(); - doReturn(mDisplayToken).when(() -> SurfaceControl.getInternalDisplayToken()); } @After @@ -114,8 +119,8 @@ public class DisplayWhiteBalanceTintControllerTest { displayPrimaries.white.X = 0.950456f; displayPrimaries.white.Y = 1.000000f; displayPrimaries.white.Z = 1.089058f; - doReturn(displayPrimaries) - .when(() -> SurfaceControl.getDisplayNativePrimaries(mDisplayToken)); + when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)) + .thenReturn(displayPrimaries); setUpTintController(); assertWithMessage("Setup with valid SurfaceControl failed") @@ -134,8 +139,8 @@ public class DisplayWhiteBalanceTintControllerTest { displayPrimaries.green = new CieXyz(); displayPrimaries.blue = new CieXyz(); displayPrimaries.white = new CieXyz(); - doReturn(displayPrimaries) - .when(() -> SurfaceControl.getDisplayNativePrimaries(mDisplayToken)); + when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)) + .thenReturn(displayPrimaries); setUpTintController(); assertWithMessage("Setup with invalid SurfaceControl succeeded") @@ -154,7 +159,7 @@ public class DisplayWhiteBalanceTintControllerTest { .when(mMockedResources) .getStringArray(R.array.config_displayWhiteBalanceDisplayPrimaries); // Make SurfaceControl setup fail - doReturn(null).when(() -> SurfaceControl.getDisplayNativePrimaries(mDisplayToken)); + when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)).thenReturn(null); setUpTintController(); assertWithMessage("Setup with valid Resources failed") @@ -178,7 +183,7 @@ public class DisplayWhiteBalanceTintControllerTest { .when(mMockedResources) .getStringArray(R.array.config_displayWhiteBalanceDisplayPrimaries); // Make SurfaceControl setup fail - doReturn(null).when(() -> SurfaceControl.getDisplayNativePrimaries(mDisplayToken)); + when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)).thenReturn(null); setUpTintController(); assertWithMessage("Setup with invalid Resources succeeded") @@ -208,8 +213,8 @@ public class DisplayWhiteBalanceTintControllerTest { displayPrimaries.white.X = 0.950456f; displayPrimaries.white.Y = 1.000000f; displayPrimaries.white.Z = 1.089058f; - doReturn(displayPrimaries) - .when(() -> SurfaceControl.getDisplayNativePrimaries(mDisplayToken)); + when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)) + .thenReturn(displayPrimaries); setUpTintController(); assertWithMessage("Setup with valid SurfaceControl failed") @@ -234,7 +239,8 @@ public class DisplayWhiteBalanceTintControllerTest { } private void setUpTintController() { - mDisplayWhiteBalanceTintController = new DisplayWhiteBalanceTintController(); + mDisplayWhiteBalanceTintController = new DisplayWhiteBalanceTintController( + mDisplayManagerInternal); mDisplayWhiteBalanceTintController.setUp(mMockedContext, true); mDisplayWhiteBalanceTintController.setActivated(true); } diff --git a/services/tests/servicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java b/services/tests/servicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java index 4ef156e239d37..e0bef1a83821c 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java @@ -18,21 +18,26 @@ package com.android.server.display.color; import static com.google.common.truth.Truth.assertWithMessage; -import androidx.test.InstrumentationRegistry; +import static org.mockito.Mockito.mock; -import java.lang.System; -import java.util.Arrays; +import android.hardware.display.DisplayManagerInternal; + +import androidx.test.InstrumentationRegistry; import org.junit.Before; import org.junit.Test; +import java.util.Arrays; + public class DisplayWhiteBalanceTintControllerTest { private DisplayWhiteBalanceTintController mDisplayWhiteBalanceTintController; @Before public void setUp() { - mDisplayWhiteBalanceTintController = new DisplayWhiteBalanceTintController(); + DisplayManagerInternal displayManagerInternal = mock(DisplayManagerInternal.class); + mDisplayWhiteBalanceTintController = + new DisplayWhiteBalanceTintController(displayManagerInternal); mDisplayWhiteBalanceTintController.setUp(InstrumentationRegistry.getContext(), true); mDisplayWhiteBalanceTintController.setActivated(true); }