diff options
| -rw-r--r-- | core/java/android/content/res/Configuration.java | 25 | ||||
| -rw-r--r-- | core/java/android/view/Display.java | 4 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 3 | ||||
| -rw-r--r-- | services/core/Android.mk | 1 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 23 |
6 files changed, 43 insertions, 15 deletions
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 88c1627f955b..6834ba816910 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -16,29 +16,26 @@ package android.content.res; -import android.graphics.Point; -import android.graphics.Rect; -import android.util.DisplayMetrics; -import android.view.Display; -import android.view.DisplayInfo; -import com.android.internal.util.XmlUtils; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlSerializer; - import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo.Config; +import android.graphics.Rect; import android.os.Build; import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import android.view.DisplayInfo; import android.view.View; +import com.android.internal.util.XmlUtils; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1818,9 +1815,11 @@ public final class Configuration implements Parcelable, Comparable<Configuration } /** - * Return whether the screen has a wide color gamut. + * Return whether the screen has a wide color gamut and wide color gamut rendering + * is supported by this device. * - * @return true if the screen has a wide color gamut, false otherwise + * @return true if the screen has a wide color gamut and wide color gamut rendering + * is supported, false otherwise */ public boolean isScreenWideColorGamut() { return (colorMode & COLOR_MODE_WIDE_COLOR_GAMUT_MASK) == COLOR_MODE_WIDE_COLOR_GAMUT_YES; diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 3e9fab1aee27..cdb9b8229314 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -21,6 +21,7 @@ import static android.Manifest.permission.CONFIGURE_DISPLAY_COLOR_MODE; import android.annotation.IntDef; import android.annotation.RequiresPermission; import android.content.res.CompatibilityInfo; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.PixelFormat; import android.graphics.Point; @@ -854,6 +855,9 @@ public final class Display { /** * Returns whether this display can be used to display wide color gamut content. + * This does not necessarily mean the device itself can render wide color gamut + * content. To ensure wide color gamut content can be produced, refer to + * {@link Configuration#isScreenWideColorGamut()}. */ public boolean isWideColorGamut() { synchronized (this) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1fc4c3eb516a..e27eab92319b 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -963,7 +963,8 @@ public final class ViewRootImpl implements ViewParent, || insets.top != 0 || insets.bottom != 0; final boolean translucent = attrs.format != PixelFormat.OPAQUE || hasSurfaceInsets; final boolean wideGamut = - attrs.getColorMode() == ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT; + mContext.getResources().getConfiguration().isScreenWideColorGamut() + && attrs.getColorMode() == ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT; mAttachInfo.mThreadedRenderer = ThreadedRenderer.create(mContext, translucent, attrs.getTitle().toString()); diff --git a/services/core/Android.mk b/services/core/Android.mk index f5f8fde18250..2e962d534e67 100644 --- a/services/core/Android.mk +++ b/services/core/Android.mk @@ -33,6 +33,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ android.hardware.oemlock-V1.0-java-static \ android.hardware.tetheroffload.control-V1.0-java-static \ android.hardware.vibrator-V1.0-java-constants \ + android.hardware.configstore-V1.0-java-static ifneq ($(INCREMENTAL_BUILDS),) LOCAL_PROGUARD_ENABLED := disabled diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index fbe6f94ddc3b..c98d60dcad93 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1217,7 +1217,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo (displayInfo.isHdr() ? Configuration.COLOR_MODE_HDR_YES : Configuration.COLOR_MODE_HDR_NO) - | (displayInfo.isWideColorGamut() + | (displayInfo.isWideColorGamut() && mService.hasWideColorGamutSupport() ? Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_YES : Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_NO); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 7944e68259bb..0c2ca859a31f 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -131,6 +131,8 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; +import android.hardware.configstore.V1_0.ISurfaceFlingerConfigs; +import android.hardware.configstore.V1_0.OptionalBool; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerInternal; import android.hardware.input.InputManager; @@ -715,6 +717,9 @@ public class WindowManagerService extends IWindowManager.Stub final DisplayManager mDisplayManager; private final Display[] mDisplays; + // Indicates whether this device supports wide color gamut rendering + private boolean mHasWideColorGamutSupport; + // Who is holding the screen on. private Session mHoldingScreenOn; private PowerManager.WakeLock mHoldingScreenWakeLock; @@ -4726,6 +4731,20 @@ public class WindowManagerService extends IWindowManager.Stub public void systemReady() { mPolicy.systemReady(); mTaskSnapshotController.systemReady(); + mHasWideColorGamutSupport = queryWideColorGamutSupport(); + } + + private static boolean queryWideColorGamutSupport() { + try { + ISurfaceFlingerConfigs surfaceFlinger = ISurfaceFlingerConfigs.getService(); + OptionalBool hasWideColor = surfaceFlinger.hasWideColorDisplay(); + if (hasWideColor != null) { + return hasWideColor.value; + } + } catch (RemoteException e) { + // Ignore, we're in big trouble if we can't talk to SurfaceFlinger's config store + } + return false; } // ------------------------------------------------------------- @@ -7521,4 +7540,8 @@ public class WindowManagerService extends IWindowManager.Stub } } } + + boolean hasWideColorGamutSupport() { + return mHasWideColorGamutSupport; + } } |