Merge "Make overrideHdrTypes per display"

This commit is contained in:
Chavi Weingarten
2022-09-22 18:11:31 +00:00
committed by Android (Google) Code Review
9 changed files with 78 additions and 38 deletions

View File

@@ -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 {

View File

@@ -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.

View File

@@ -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);

View File

@@ -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);

View File

@@ -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
*/

View File

@@ -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",

View File

@@ -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);
}
}

View File

@@ -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(

View File

@@ -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
};