diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 8223726322a5c..7032cc05dbf20 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1232,7 +1232,7 @@ public class PackageParser { XmlResourceParser parser = null; try { res = new Resources(assets, mMetrics, null); - assets.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + assets.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Build.VERSION.RESOURCES_SDK_INT); parser = assets.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME); @@ -1568,7 +1568,7 @@ public class PackageParser { private static AssetManager newConfiguredAssetManager() { AssetManager assetManager = new AssetManager(); - assetManager.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + assetManager.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Build.VERSION.RESOURCES_SDK_INT); return assetManager; } diff --git a/core/java/android/content/pm/split/DefaultSplitAssetLoader.java b/core/java/android/content/pm/split/DefaultSplitAssetLoader.java index 5a9966d6e18be..99eb4702d32e4 100644 --- a/core/java/android/content/pm/split/DefaultSplitAssetLoader.java +++ b/core/java/android/content/pm/split/DefaultSplitAssetLoader.java @@ -65,7 +65,7 @@ public class DefaultSplitAssetLoader implements SplitAssetLoader { AssetManager assets = new AssetManager(); try { - assets.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + assets.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Build.VERSION.RESOURCES_SDK_INT); loadApkIntoAssetManager(assets, mBaseCodePath, mFlags); diff --git a/core/java/android/content/pm/split/SplitAssetDependencyLoader.java b/core/java/android/content/pm/split/SplitAssetDependencyLoader.java index 3ad45b6e2555e..4df90eb9f53ee 100644 --- a/core/java/android/content/pm/split/SplitAssetDependencyLoader.java +++ b/core/java/android/content/pm/split/SplitAssetDependencyLoader.java @@ -83,7 +83,7 @@ public class SplitAssetDependencyLoader throws PackageParser.PackageParserException { final AssetManager assets = new AssetManager(); try { - assets.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + assets.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Build.VERSION.RESOURCES_SDK_INT); for (String assetPath : assetPaths) { diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java index db24ffef99cfe..6e3d343a19432 100644 --- a/core/java/android/content/res/AssetManager.java +++ b/core/java/android/content/res/AssetManager.java @@ -759,7 +759,7 @@ public final class AssetManager implements AutoCloseable { int orientation, int touchscreen, int density, int keyboard, int keyboardHidden, int navigation, int screenWidth, int screenHeight, int smallestScreenWidthDp, int screenWidthDp, int screenHeightDp, - int screenLayout, int uiMode, int majorVersion); + int screenLayout, int uiMode, int colorMode, int majorVersion); /** * Retrieve the resource identifier for the given resource name. diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index 05892e0ad6602..0ffc6c64d41ec 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -420,7 +420,7 @@ public class ResourcesImpl { mConfiguration.smallestScreenWidthDp, mConfiguration.screenWidthDp, mConfiguration.screenHeightDp, mConfiguration.screenLayout, mConfiguration.uiMode, - Build.VERSION.RESOURCES_SDK_INT); + mConfiguration.colorMode, Build.VERSION.RESOURCES_SDK_INT); if (DEBUG_CONFIG) { Slog.i(TAG, "**** Updating config of " + this + ": final config is " diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 105cc47c88aab..a534ca7c94bb3 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -777,8 +777,7 @@ public final class Display { public boolean isHdr() { synchronized (this) { updateDisplayInfoLocked(); - int[] types = mDisplayInfo.hdrCapabilities.getSupportedHdrTypes(); - return types != null && types.length > 0; + return mDisplayInfo.isHdr(); } } @@ -788,12 +787,7 @@ public final class Display { public boolean isWideColorGamut() { synchronized (this) { updateDisplayInfoLocked(); - for (int colorMode : mDisplayInfo.supportedColorModes) { - if (colorMode == COLOR_MODE_DCI_P3 || colorMode > COLOR_MODE_SRGB) { - return true; - } - } - return false; + return mDisplayInfo.isWideColorGamut(); } } diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index 1aef6ec0f302b..82388f8a344b6 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -519,6 +519,20 @@ public final class DisplayInfo implements Parcelable { logicalHeight : logicalWidth; } + public boolean isHdr() { + int[] types = hdrCapabilities.getSupportedHdrTypes(); + return types != null && types.length > 0; + } + + public boolean isWideColorGamut() { + for (int colorMode : supportedColorModes) { + if (colorMode == Display.COLOR_MODE_DCI_P3 || colorMode > Display.COLOR_MODE_SRGB) { + return true; + } + } + return false; + } + /** * Returns true if the specified UID has access to this display. */ diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index d382f245e0d78..723dce6fcf1ee 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -681,7 +681,7 @@ static void android_content_AssetManager_setConfiguration(JNIEnv* env, jobject c jint smallestScreenWidthDp, jint screenWidthDp, jint screenHeightDp, jint screenLayout, jint uiMode, - jint sdkVersion) + jint colorMode, jint sdkVersion) { AssetManager* am = assetManagerForJavaObject(env, clazz); if (am == NULL) { @@ -712,6 +712,7 @@ static void android_content_AssetManager_setConfiguration(JNIEnv* env, jobject c config.screenHeightDp = (uint16_t)screenHeightDp; config.screenLayout = (uint8_t)screenLayout; config.uiMode = (uint8_t)uiMode; + config.colorMode = (uint8_t)colorMode; config.sdkVersion = (uint16_t)sdkVersion; config.minorVersion = 0; @@ -1691,7 +1692,7 @@ static const JNINativeMethod gAssetManagerMethods[] = { { "getSizeConfigurations", "()[Landroid/content/res/Configuration;", (void*) android_content_AssetManager_getSizeConfigurations }, // @FastNative - { "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIIII)V", + { "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIIIII)V", (void*) android_content_AssetManager_setConfiguration }, // @FastNative { "getResourceIdentifier","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1987f9013b211..d62c62e7b3288 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4826,6 +4826,14 @@ public class WindowManagerService extends IWindowManager.Stub mDisplayMetrics, dw, dh, displayId); config.densityDpi = displayInfo.logicalDensityDpi; + config.colorMode = + (displayInfo.isHdr() + ? Configuration.COLOR_MODE_HDR_YES + : Configuration.COLOR_MODE_HDR_NO) + | (displayInfo.isWideColorGamut() + ? Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_YES + : Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_NO); + // Update the configuration based on available input devices, lid switch, // and platform configuration. config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;