Merge "Make overrideHdrTypes per display"
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 5967233..99005a4 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1223,6 +1223,7 @@
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 @@
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 8bc11cb..dfb4236 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -855,6 +855,16 @@
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 e2f8592..9294dea 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -20,9 +20,11 @@
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 @@
}
}
+ /**
+ * 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 fa3c450..b166e21 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -83,6 +83,9 @@
// 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 9322bf6..2f7ae49 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -225,8 +225,6 @@
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 @@
}
/**
- * 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 4ad995a..b11f22a 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -1528,27 +1528,6 @@
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 @@
(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 e9640cf..a060f07 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 @@
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 @@
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 2f1f98b..2cde526 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 @@
}
}
+ @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 61f2b14..02e5061 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 @@
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 @@
(void*)nativeCreateDisplay },
{"nativeDestroyDisplay", "(Landroid/os/IBinder;)V",
(void*)nativeDestroyDisplay },
+ {"nativeOverrideHdrTypes", "(Landroid/os/IBinder;[I)V",
+ (void*)nativeOverrideHdrTypes },
// clang-format on
};