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:
@@ -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 {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user