Hide HDR output control feature behind feature flag.

Bug: 234816344
Test: atest HdrConversionTest
Change-Id: I4209b0dbba7570ee850b2a9fda7b4af31d1f70ed
This commit is contained in:
Marc Kassis
2023-02-13 14:54:50 +01:00
parent 00dda9c0c8
commit 4a9cc91019
3 changed files with 49 additions and 3 deletions

View File

@@ -1444,6 +1444,7 @@ package android.hardware.display {
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setUserDisabledHdrTypes(@NonNull int[]); method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setUserDisabledHdrTypes(@NonNull int[]);
method @RequiresPermission(android.Manifest.permission.OVERRIDE_DISPLAY_MODE_REQUESTS) public boolean shouldAlwaysRespectAppRequestedMode(); method @RequiresPermission(android.Manifest.permission.OVERRIDE_DISPLAY_MODE_REQUESTS) public boolean shouldAlwaysRespectAppRequestedMode();
field public static final String DISPLAY_CATEGORY_REAR = "android.hardware.display.category.REAR"; field public static final String DISPLAY_CATEGORY_REAR = "android.hardware.display.category.REAR";
field public static final String HDR_OUTPUT_CONTROL_FLAG = "enable_hdr_output_control";
field public static final int SWITCHING_TYPE_ACROSS_AND_WITHIN_GROUPS = 2; // 0x2 field public static final int SWITCHING_TYPE_ACROSS_AND_WITHIN_GROUPS = 2; // 0x2
field public static final int SWITCHING_TYPE_NONE = 0; // 0x0 field public static final int SWITCHING_TYPE_NONE = 0; // 0x0
field public static final int SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY = 3; // 0x3 field public static final int SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY = 3; // 0x3

View File

@@ -68,6 +68,15 @@ public final class DisplayManager {
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
private static final boolean ENABLE_VIRTUAL_DISPLAY_REFRESH_RATE = true; private static final boolean ENABLE_VIRTUAL_DISPLAY_REFRESH_RATE = true;
/**
* The hdr output control feature flag, the value should be read via
* {@link android.provider.DeviceConfig#getBoolean(String, String, boolean)} with
* {@link android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER} as the namespace.
* @hide
*/
@TestApi
public static final String HDR_OUTPUT_CONTROL_FLAG = "enable_hdr_output_control";
private final Context mContext; private final Context mContext;
private final DisplayManagerGlobal mGlobal; private final DisplayManagerGlobal mGlobal;

View File

@@ -24,6 +24,7 @@ import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED;
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE;
import static android.hardware.display.DisplayManager.EventsMask; import static android.hardware.display.DisplayManager.EventsMask;
import static android.hardware.display.DisplayManager.HDR_OUTPUT_CONTROL_FLAG;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
@@ -38,8 +39,10 @@ import static android.hardware.display.DisplayManagerGlobal.DisplayEvent;
import static android.hardware.display.DisplayViewport.VIEWPORT_EXTERNAL; import static android.hardware.display.DisplayViewport.VIEWPORT_EXTERNAL;
import static android.hardware.display.DisplayViewport.VIEWPORT_INTERNAL; import static android.hardware.display.DisplayViewport.VIEWPORT_INTERNAL;
import static android.hardware.display.DisplayViewport.VIEWPORT_VIRTUAL; import static android.hardware.display.DisplayViewport.VIEWPORT_VIRTUAL;
import static android.hardware.display.HdrConversionMode.HDR_CONVERSION_UNSUPPORTED;
import static android.os.Process.FIRST_APPLICATION_UID; import static android.os.Process.FIRST_APPLICATION_UID;
import static android.os.Process.ROOT_UID; import static android.os.Process.ROOT_UID;
import static android.provider.DeviceConfig.NAMESPACE_DISPLAY_MANAGER;
import android.Manifest; import android.Manifest;
import android.annotation.NonNull; import android.annotation.NonNull;
@@ -137,6 +140,7 @@ import android.window.ScreenCapture;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.display.BrightnessSynchronizer;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils; import com.android.internal.util.DumpUtils;
import com.android.internal.util.FrameworkStatsLog; import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.IndentingPrintWriter;
@@ -232,6 +236,9 @@ public final class DisplayManagerService extends SystemService {
private static final int MSG_LOAD_BRIGHTNESS_CONFIGURATIONS = 6; private static final int MSG_LOAD_BRIGHTNESS_CONFIGURATIONS = 6;
private static final int MSG_DELIVER_DISPLAY_EVENT_FRAME_RATE_OVERRIDE = 7; private static final int MSG_DELIVER_DISPLAY_EVENT_FRAME_RATE_OVERRIDE = 7;
private static final int MSG_DELIVER_DISPLAY_GROUP_EVENT = 8; private static final int MSG_DELIVER_DISPLAY_GROUP_EVENT = 8;
private static final int[] EMPTY_ARRAY = new int[0];
private static final HdrConversionMode HDR_CONVERSION_MODE_UNSUPPORTED = new HdrConversionMode(
HDR_CONVERSION_UNSUPPORTED);
private final Context mContext; private final Context mContext;
private final DisplayManagerHandler mHandler; private final DisplayManagerHandler mHandler;
@@ -250,6 +257,10 @@ public final class DisplayManagerService extends SystemService {
@GuardedBy("mSyncRoot") @GuardedBy("mSyncRoot")
private boolean mAreUserDisabledHdrTypesAllowed = true; private boolean mAreUserDisabledHdrTypesAllowed = true;
// This value indicates whether or not HDR output control is enabled.
// It is read from DeviceConfig and is updated via a listener if the config changes.
private volatile boolean mIsHdrOutputControlEnabled;
// Display mode chosen by user. // Display mode chosen by user.
private Display.Mode mUserPreferredMode; private Display.Mode mUserPreferredMode;
// HDR conversion mode chosen by user // HDR conversion mode chosen by user
@@ -674,6 +685,11 @@ public final class DisplayManagerService extends SystemService {
synchronized (mSyncRoot) { synchronized (mSyncRoot) {
mSafeMode = safeMode; mSafeMode = safeMode;
mSystemReady = true; mSystemReady = true;
mIsHdrOutputControlEnabled = isDeviceConfigHdrOutputControlEnabled();
DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_DISPLAY_MANAGER,
BackgroundThread.getExecutor(),
properties -> mIsHdrOutputControlEnabled =
isDeviceConfigHdrOutputControlEnabled());
// Just in case the top inset changed before the system was ready. At this point, any // Just in case the top inset changed before the system was ready. At this point, any
// relevant configuration should be in place. // relevant configuration should be in place.
recordTopInsetLocked(mLogicalDisplayMapper.getDisplayLocked(Display.DEFAULT_DISPLAY)); recordTopInsetLocked(mLogicalDisplayMapper.getDisplayLocked(Display.DEFAULT_DISPLAY));
@@ -681,7 +697,9 @@ public final class DisplayManagerService extends SystemService {
updateSettingsLocked(); updateSettingsLocked();
updateUserDisabledHdrTypesFromSettingsLocked(); updateUserDisabledHdrTypesFromSettingsLocked();
updateUserPreferredDisplayModeSettingsLocked(); updateUserPreferredDisplayModeSettingsLocked();
updateHdrConversionModeSettingsLocked(); if (mIsHdrOutputControlEnabled) {
updateHdrConversionModeSettingsLocked();
}
} }
mDisplayModeDirector.setDesiredDisplayModeSpecsListener( mDisplayModeDirector.setDesiredDisplayModeSpecsListener(
@@ -702,6 +720,12 @@ public final class DisplayManagerService extends SystemService {
mContext.registerReceiver(mIdleModeReceiver, filter); mContext.registerReceiver(mIdleModeReceiver, filter);
} }
private boolean isDeviceConfigHdrOutputControlEnabled() {
return DeviceConfig.getBoolean(NAMESPACE_DISPLAY_MANAGER,
HDR_OUTPUT_CONTROL_FLAG,
true);
}
@VisibleForTesting @VisibleForTesting
Handler getDisplayHandler() { Handler getDisplayHandler() {
return mHandler; return mHandler;
@@ -2117,7 +2141,7 @@ public final class DisplayManagerService extends SystemService {
private HdrConversionMode getHdrConversionModeSettingInternal() { private HdrConversionMode getHdrConversionModeSettingInternal() {
if (!mInjector.getHdrOutputConversionSupport()) { if (!mInjector.getHdrOutputConversionSupport()) {
return new HdrConversionMode(HdrConversionMode.HDR_CONVERSION_UNSUPPORTED); return HDR_CONVERSION_MODE_UNSUPPORTED;
} }
synchronized (mSyncRoot) { synchronized (mSyncRoot) {
if (mHdrConversionMode != null) { if (mHdrConversionMode != null) {
@@ -2129,7 +2153,7 @@ public final class DisplayManagerService extends SystemService {
private HdrConversionMode getHdrConversionModeInternal() { private HdrConversionMode getHdrConversionModeInternal() {
if (!mInjector.getHdrOutputConversionSupport()) { if (!mInjector.getHdrOutputConversionSupport()) {
return new HdrConversionMode(HdrConversionMode.HDR_CONVERSION_UNSUPPORTED); return HDR_CONVERSION_MODE_UNSUPPORTED;
} }
HdrConversionMode mode; HdrConversionMode mode;
synchronized (mSyncRoot) { synchronized (mSyncRoot) {
@@ -3948,6 +3972,9 @@ public final class DisplayManagerService extends SystemService {
@Override // Binder call @Override // Binder call
public void setHdrConversionMode(HdrConversionMode hdrConversionMode) { public void setHdrConversionMode(HdrConversionMode hdrConversionMode) {
if (!mIsHdrOutputControlEnabled) {
return;
}
mContext.enforceCallingOrSelfPermission( mContext.enforceCallingOrSelfPermission(
Manifest.permission.MODIFY_HDR_CONVERSION_MODE, Manifest.permission.MODIFY_HDR_CONVERSION_MODE,
"Permission required to set the HDR conversion mode."); "Permission required to set the HDR conversion mode.");
@@ -3961,6 +3988,9 @@ public final class DisplayManagerService extends SystemService {
@Override // Binder call @Override // Binder call
public HdrConversionMode getHdrConversionModeSetting() { public HdrConversionMode getHdrConversionModeSetting() {
if (!mIsHdrOutputControlEnabled) {
return HDR_CONVERSION_MODE_UNSUPPORTED;
}
final long token = Binder.clearCallingIdentity(); final long token = Binder.clearCallingIdentity();
try { try {
return getHdrConversionModeSettingInternal(); return getHdrConversionModeSettingInternal();
@@ -3971,6 +4001,9 @@ public final class DisplayManagerService extends SystemService {
@Override // Binder call @Override // Binder call
public HdrConversionMode getHdrConversionMode() { public HdrConversionMode getHdrConversionMode() {
if (!mIsHdrOutputControlEnabled) {
return HDR_CONVERSION_MODE_UNSUPPORTED;
}
final long token = Binder.clearCallingIdentity(); final long token = Binder.clearCallingIdentity();
try { try {
return getHdrConversionModeInternal(); return getHdrConversionModeInternal();
@@ -3982,6 +4015,9 @@ public final class DisplayManagerService extends SystemService {
@Display.HdrCapabilities.HdrType @Display.HdrCapabilities.HdrType
@Override // Binder call @Override // Binder call
public int[] getSupportedHdrOutputTypes() { public int[] getSupportedHdrOutputTypes() {
if (!mIsHdrOutputControlEnabled) {
return EMPTY_ARRAY;
}
final long token = Binder.clearCallingIdentity(); final long token = Binder.clearCallingIdentity();
try { try {
return getSupportedHdrOutputTypesInternal(); return getSupportedHdrOutputTypesInternal();