diff options
| -rw-r--r-- | core/api/test-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/hardware/display/DisplayManager.java | 9 | ||||
| -rw-r--r-- | services/core/java/com/android/server/display/DisplayManagerService.java | 42 |
3 files changed, 49 insertions, 3 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 3baf5a24e683..ffd7b6c29388 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -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.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 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_NONE = 0; // 0x0 field public static final int SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY = 3; // 0x3 diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index eeff6ccafd5d..b766cd19cdb0 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -68,6 +68,15 @@ public final class DisplayManager { private static final boolean DEBUG = false; 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 DisplayManagerGlobal mGlobal; diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 81e550e3d62f..6eb465e1049e 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -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_GONE; 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_AUTO_MIRROR; 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_INTERNAL; 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.ROOT_UID; +import static android.provider.DeviceConfig.NAMESPACE_DISPLAY_MANAGER; import android.Manifest; import android.annotation.NonNull; @@ -137,6 +140,7 @@ import android.window.ScreenCapture; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; +import com.android.internal.os.BackgroundThread; import com.android.internal.util.DumpUtils; import com.android.internal.util.FrameworkStatsLog; 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_DELIVER_DISPLAY_EVENT_FRAME_RATE_OVERRIDE = 7; 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 DisplayManagerHandler mHandler; @@ -250,6 +257,10 @@ public final class DisplayManagerService extends SystemService { @GuardedBy("mSyncRoot") 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. private Display.Mode mUserPreferredMode; // HDR conversion mode chosen by user @@ -674,6 +685,11 @@ public final class DisplayManagerService extends SystemService { synchronized (mSyncRoot) { mSafeMode = safeMode; 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 // relevant configuration should be in place. recordTopInsetLocked(mLogicalDisplayMapper.getDisplayLocked(Display.DEFAULT_DISPLAY)); @@ -681,7 +697,9 @@ public final class DisplayManagerService extends SystemService { updateSettingsLocked(); updateUserDisabledHdrTypesFromSettingsLocked(); updateUserPreferredDisplayModeSettingsLocked(); - updateHdrConversionModeSettingsLocked(); + if (mIsHdrOutputControlEnabled) { + updateHdrConversionModeSettingsLocked(); + } } mDisplayModeDirector.setDesiredDisplayModeSpecsListener( @@ -702,6 +720,12 @@ public final class DisplayManagerService extends SystemService { mContext.registerReceiver(mIdleModeReceiver, filter); } + private boolean isDeviceConfigHdrOutputControlEnabled() { + return DeviceConfig.getBoolean(NAMESPACE_DISPLAY_MANAGER, + HDR_OUTPUT_CONTROL_FLAG, + true); + } + @VisibleForTesting Handler getDisplayHandler() { return mHandler; @@ -2117,7 +2141,7 @@ public final class DisplayManagerService extends SystemService { private HdrConversionMode getHdrConversionModeSettingInternal() { if (!mInjector.getHdrOutputConversionSupport()) { - return new HdrConversionMode(HdrConversionMode.HDR_CONVERSION_UNSUPPORTED); + return HDR_CONVERSION_MODE_UNSUPPORTED; } synchronized (mSyncRoot) { if (mHdrConversionMode != null) { @@ -2129,7 +2153,7 @@ public final class DisplayManagerService extends SystemService { private HdrConversionMode getHdrConversionModeInternal() { if (!mInjector.getHdrOutputConversionSupport()) { - return new HdrConversionMode(HdrConversionMode.HDR_CONVERSION_UNSUPPORTED); + return HDR_CONVERSION_MODE_UNSUPPORTED; } HdrConversionMode mode; synchronized (mSyncRoot) { @@ -3948,6 +3972,9 @@ public final class DisplayManagerService extends SystemService { @Override // Binder call public void setHdrConversionMode(HdrConversionMode hdrConversionMode) { + if (!mIsHdrOutputControlEnabled) { + return; + } mContext.enforceCallingOrSelfPermission( Manifest.permission.MODIFY_HDR_CONVERSION_MODE, "Permission required to set the HDR conversion mode."); @@ -3961,6 +3988,9 @@ public final class DisplayManagerService extends SystemService { @Override // Binder call public HdrConversionMode getHdrConversionModeSetting() { + if (!mIsHdrOutputControlEnabled) { + return HDR_CONVERSION_MODE_UNSUPPORTED; + } final long token = Binder.clearCallingIdentity(); try { return getHdrConversionModeSettingInternal(); @@ -3971,6 +4001,9 @@ public final class DisplayManagerService extends SystemService { @Override // Binder call public HdrConversionMode getHdrConversionMode() { + if (!mIsHdrOutputControlEnabled) { + return HDR_CONVERSION_MODE_UNSUPPORTED; + } final long token = Binder.clearCallingIdentity(); try { return getHdrConversionModeInternal(); @@ -3982,6 +4015,9 @@ public final class DisplayManagerService extends SystemService { @Display.HdrCapabilities.HdrType @Override // Binder call public int[] getSupportedHdrOutputTypes() { + if (!mIsHdrOutputControlEnabled) { + return EMPTY_ARRAY; + } final long token = Binder.clearCallingIdentity(); try { return getSupportedHdrOutputTypesInternal(); |