From 85a1ebf628ccbcfa3361b154241733b500f31043 Mon Sep 17 00:00:00 2001 From: Chavi Weingarten Date: Mon, 19 Sep 2022 22:48:39 +0000 Subject: [PATCH] Make overrideHdrTypes per display The API overrideHdrTypes should be per display. Add an API into DMS so DMS can set the override with the correct displayToken. Remove usage of getInternalDisplayToken in DisplayTests Test: DisplayTest Bug: 242714168 Change-Id: Ib338624a71a897d8d718080850f672a219f9627e --- core/api/test-current.txt | 2 +- .../hardware/display/DisplayManager.java | 10 ++++++++ .../display/DisplayManagerGlobal.java | 16 +++++++++++++ .../hardware/display/IDisplayManager.aidl | 3 +++ core/java/android/view/SurfaceControl.java | 14 ----------- core/jni/android_view_SurfaceControl.cpp | 23 ------------------ .../server/display/DisplayControl.java | 11 +++++++++ .../server/display/DisplayManagerService.java | 13 ++++++++++ ..._android_server_display_DisplayControl.cpp | 24 +++++++++++++++++++ 9 files changed, 78 insertions(+), 38 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 596723336b89c..99005a463f73e 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1223,6 +1223,7 @@ package android.hardware.display { method @Nullable public android.view.Display.Mode getGlobalUserPreferredDisplayMode(); method @NonNull public int[] getUserDisabledHdrTypes(); method public boolean isMinimalPostProcessingRequested(int); + method @RequiresPermission(android.Manifest.permission.ACCESS_SURFACE_FLINGER) public void overrideHdrTypes(int, @NonNull int[]); method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setAreUserDisabledHdrTypesAllowed(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_USER_PREFERRED_DISPLAY_MODE) public void setGlobalUserPreferredDisplayMode(@NonNull android.view.Display.Mode); method @RequiresPermission(android.Manifest.permission.MODIFY_REFRESH_RATE_SWITCHING_TYPE) public void setRefreshRateSwitchingType(int); @@ -2885,7 +2886,6 @@ package android.view { ctor public SurfaceControl(@NonNull android.view.SurfaceControl, @NonNull String); method @NonNull public static android.os.IBinder getInternalDisplayToken(); method public boolean isSameSurface(@NonNull android.view.SurfaceControl); - method public static void overrideHdrTypes(@NonNull android.os.IBinder, @NonNull int[]); } public class SurfaceControlViewHost { diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 8bc11cbc61de9..dfb42365357d3 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -855,6 +855,16 @@ public final class DisplayManager { return mGlobal.getUserDisabledHdrTypes(); } + /** + * Overrides HDR modes for a display device. + * + * @hide + */ + @RequiresPermission(Manifest.permission.ACCESS_SURFACE_FLINGER) + @TestApi + public void overrideHdrTypes(int displayId, @NonNull int[] modes) { + mGlobal.overrideHdrTypes(displayId, modes); + } /** * Creates a virtual display. diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index e2f8592ad3299..9294dea50b0d5 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -20,9 +20,11 @@ package android.hardware.display; import static android.hardware.display.DisplayManager.EventsMask; import static android.view.Display.HdrCapabilities.HdrType; +import android.Manifest; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.app.PropertyInvalidatedCache; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -577,6 +579,20 @@ public final class DisplayManagerGlobal { } } + /** + * Overrides HDR modes for a display device. + * + */ + @RequiresPermission(Manifest.permission.ACCESS_SURFACE_FLINGER) + public void overrideHdrTypes(int displayId, int[] modes) { + try { + mDm.overrideHdrTypes(displayId, modes); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + public void requestColorMode(int displayId, int colorMode) { try { mDm.requestColorMode(displayId, colorMode); diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl index fa3c4506d6e92..b166e215075a6 100644 --- a/core/java/android/hardware/display/IDisplayManager.aidl +++ b/core/java/android/hardware/display/IDisplayManager.aidl @@ -83,6 +83,9 @@ interface IDisplayManager { // No permissions required. int[] getUserDisabledHdrTypes(); + // Requires ACCESS_SURFACE_FLINGER permission. + void overrideHdrTypes(int displayId, in int[] modes); + // Requires CONFIGURE_DISPLAY_COLOR_MODE void requestColorMode(int displayId, int colorMode); diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 9322bf6deefba..2f7ae498b8b10 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -225,8 +225,6 @@ public final class SurfaceControl implements Parcelable { private static native void nativeSetDimmingEnabled(long transactionObj, long nativeObject, boolean dimmingEnabled); - private static native void nativeOverrideHdrTypes(IBinder displayToken, int[] modes); - private static native void nativeSetInputWindowInfo(long transactionObj, long nativeObject, InputWindowHandle handle); @@ -2037,18 +2035,6 @@ public final class SurfaceControl implements Parcelable { IVirtualDisplayCallback.Stub.asInterface(displayToken)); } - /** - * Overrides HDR modes for a display device. - * - * If the caller does not have ACCESS_SURFACE_FLINGER permission, this will throw a Security - * Exception. - * @hide - */ - @TestApi - public static void overrideHdrTypes(@NonNull IBinder displayToken, @NonNull int[] modes) { - nativeOverrideHdrTypes(displayToken, modes); - } - /** * @hide */ diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 4ad995adaa110..b11f22a030d98 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -1528,27 +1528,6 @@ static void nativeReparent(JNIEnv* env, jclass clazz, jlong transactionObj, transaction->reparent(ctrl, newParent); } -static void nativeOverrideHdrTypes(JNIEnv* env, jclass clazz, jobject tokenObject, - jintArray jHdrTypes) { - sp token(ibinderForJavaObject(env, tokenObject)); - if (token == nullptr || jHdrTypes == nullptr) return; - - int* hdrTypes = env->GetIntArrayElements(jHdrTypes, 0); - int numHdrTypes = env->GetArrayLength(jHdrTypes); - - std::vector hdrTypesVector; - for (int i = 0; i < numHdrTypes; i++) { - hdrTypesVector.push_back(static_cast(hdrTypes[i])); - } - env->ReleaseIntArrayElements(jHdrTypes, hdrTypes, 0); - - status_t error = SurfaceComposerClient::overrideHdrTypes(token, hdrTypesVector); - if (error != NO_ERROR) { - jniThrowExceptionFmt(env, "java/lang/SecurityException", - "ACCESS_SURFACE_FLINGER is missing"); - } -} - static jboolean nativeGetBootDisplayModeSupport(JNIEnv* env, jclass clazz) { bool isBootDisplayModeSupported = false; SurfaceComposerClient::getBootDisplayModeSupport(&isBootDisplayModeSupported); @@ -2056,8 +2035,6 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSetGameContentType }, {"nativeGetCompositionDataspaces", "()[I", (void*)nativeGetCompositionDataspaces}, - {"nativeOverrideHdrTypes", "(Landroid/os/IBinder;[I)V", - (void*)nativeOverrideHdrTypes }, {"nativeClearContentFrameStats", "(J)Z", (void*)nativeClearContentFrameStats }, {"nativeGetContentFrameStats", "(JLandroid/view/WindowContentFrameStats;)Z", diff --git a/services/core/java/com/android/server/display/DisplayControl.java b/services/core/java/com/android/server/display/DisplayControl.java index e9640cf6b4d5a..a060f076d4fb5 100644 --- a/services/core/java/com/android/server/display/DisplayControl.java +++ b/services/core/java/com/android/server/display/DisplayControl.java @@ -16,6 +16,9 @@ package com.android.server.display; +import android.Manifest; +import android.annotation.NonNull; +import android.annotation.RequiresPermission; import android.os.IBinder; import java.util.Objects; @@ -26,6 +29,7 @@ import java.util.Objects; public class DisplayControl { private static native IBinder nativeCreateDisplay(String name, boolean secure); private static native void nativeDestroyDisplay(IBinder displayToken); + private static native void nativeOverrideHdrTypes(IBinder displayToken, int[] modes); /** * Create a display in SurfaceFlinger. @@ -52,4 +56,11 @@ public class DisplayControl { nativeDestroyDisplay(displayToken); } + /** + * Overrides HDR modes for a display device. + */ + @RequiresPermission(Manifest.permission.ACCESS_SURFACE_FLINGER) + public static void overrideHdrTypes(@NonNull IBinder displayToken, @NonNull int[] modes) { + nativeOverrideHdrTypes(displayToken, modes); + } } diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 9ab78bc9cb321..3d804a0ddca19 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -3000,6 +3000,19 @@ public final class DisplayManagerService extends SystemService { } } + @Override + public void overrideHdrTypes(int displayId, int[] modes) { + IBinder displayToken; + synchronized (mSyncRoot) { + displayToken = getDisplayToken(displayId); + if (displayToken == null) { + throw new IllegalArgumentException("Invalid display: " + displayId); + } + } + + DisplayControl.overrideHdrTypes(displayToken, modes); + } + @Override // Binder call public void setAreUserDisabledHdrTypesAllowed(boolean areUserDisabledHdrTypesAllowed) { mContext.enforceCallingOrSelfPermission( diff --git a/services/core/jni/com_android_server_display_DisplayControl.cpp b/services/core/jni/com_android_server_display_DisplayControl.cpp index 61f2b1411a0b0..02e5061a3ac63 100644 --- a/services/core/jni/com_android_server_display_DisplayControl.cpp +++ b/services/core/jni/com_android_server_display_DisplayControl.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include namespace android { @@ -33,6 +34,27 @@ static void nativeDestroyDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) { SurfaceComposerClient::destroyDisplay(token); } +static void nativeOverrideHdrTypes(JNIEnv* env, jclass clazz, jobject tokenObject, + jintArray jHdrTypes) { + sp token(ibinderForJavaObject(env, tokenObject)); + if (token == nullptr || jHdrTypes == nullptr) return; + + ScopedIntArrayRO hdrTypes(env, jHdrTypes); + size_t numHdrTypes = hdrTypes.size(); + + std::vector hdrTypesVector; + hdrTypesVector.reserve(numHdrTypes); + for (int i = 0; i < numHdrTypes; i++) { + hdrTypesVector.push_back(static_cast(hdrTypes[i])); + } + + status_t error = SurfaceComposerClient::overrideHdrTypes(token, hdrTypesVector); + if (error != NO_ERROR) { + jniThrowExceptionFmt(env, "java/lang/SecurityException", + "ACCESS_SURFACE_FLINGER is missing"); + } +} + // ---------------------------------------------------------------------------- static const JNINativeMethod sDisplayMethods[] = { @@ -41,6 +63,8 @@ static const JNINativeMethod sDisplayMethods[] = { (void*)nativeCreateDisplay }, {"nativeDestroyDisplay", "(Landroid/os/IBinder;)V", (void*)nativeDestroyDisplay }, + {"nativeOverrideHdrTypes", "(Landroid/os/IBinder;[I)V", + (void*)nativeOverrideHdrTypes }, // clang-format on };