diff options
9 files changed, 78 insertions, 38 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 596723336b89..99005a463f73 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 8bc11cbc61de..dfb42365357d 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 e2f8592ad329..9294dea50b0d 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 fa3c4506d6e9..b166e215075a 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 9322bf6deefb..2f7ae498b8b1 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); @@ -2038,18 +2036,6 @@ public final class SurfaceControl implements Parcelable { } /** - * 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 */ public static long[] getPhysicalDisplayIds() { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 4ad995adaa11..b11f22a030d9 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<IBinder> token(ibinderForJavaObject(env, tokenObject)); - if (token == nullptr || jHdrTypes == nullptr) return; - - int* hdrTypes = env->GetIntArrayElements(jHdrTypes, 0); - int numHdrTypes = env->GetArrayLength(jHdrTypes); - - std::vector<ui::Hdr> hdrTypesVector; - for (int i = 0; i < numHdrTypes; i++) { - hdrTypesVector.push_back(static_cast<ui::Hdr>(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 e9640cf6b4d5..a060f076d4fb 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 2f1f98b22e0f..2cde526c6dbf 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 61f2b1411a0b..02e5061a3ac6 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 <android_util_Binder.h> #include <gui/SurfaceComposerClient.h> #include <jni.h> +#include <nativehelper/ScopedPrimitiveArray.h> #include <nativehelper/ScopedUtfChars.h> 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<IBinder> token(ibinderForJavaObject(env, tokenObject)); + if (token == nullptr || jHdrTypes == nullptr) return; + + ScopedIntArrayRO hdrTypes(env, jHdrTypes); + size_t numHdrTypes = hdrTypes.size(); + + std::vector<ui::Hdr> hdrTypesVector; + hdrTypesVector.reserve(numHdrTypes); + for (int i = 0; i < numHdrTypes; i++) { + hdrTypesVector.push_back(static_cast<ui::Hdr>(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 }; |