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
This commit is contained in:
Chavi Weingarten
2022-09-19 22:48:39 +00:00
parent 51847be272
commit 85a1ebf628
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
};