summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/res/Configuration.java25
-rw-r--r--core/java/android/view/Display.java4
-rw-r--r--core/java/android/view/ViewRootImpl.java3
-rw-r--r--services/core/Android.mk1
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java23
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;
+ }
}