This is a guest post from developer Carlos Lopez, also known as ShortFuse. He’s the developer of SuperOneClick and Fusion.

With the Pixel 2's release, it seems many Android fans have their pitchforks in hand, and it's the display that's the target of their criticism. Owners of the 2 XL have noticed color shifting at an angle or laggy pixel response, which causes a "jelly-like" effect. Another complaint, which will be the focus of this article, is what some have called "muted colors." At first glance, it seems like the Pixel 2 isn’t capable of showing as many colors as other OLED devices, but this isn’t true—the colors are intentionally “muted” and locked via software. But what does that mean, and more importantly, can we change it?

New Android, new colors

Let's start with a brief explanation of color spaces and gamut. It comes down to how you define 100% red, green, or white. Maybe your idea of pure white is yellower or bluer than somebody else's. This human element was behind "the dress" phenomenon several years ago when everyone argued over whether the dress in question was blue and black or white and gold. A color space is a collection of colors, and different color spaces have varying definitions for red, green, and blue. “Gamut” refers to the range of colors that can be displayed. Don’t worry if this seems confusing. Just know that, generally, a wider gamut means more saturated colors.

Starting with Oreo, devices and apps can play with color spaces and gamuts. There is no 100% clear definition on what color spaces they need to use, but there will be three gamut types: low, HDR, and wide. Low is generally just sRGB or Rec. 709. HDR can be something like HDR10. Meanwhile, wide (which is what we're talking about here) is anything that includes sRGB and 90% or greater of the NTSC color space. Wide could be DCI-P3, AdobeRGB, or Pro Photo RGB.

So what does this all mean? By default, Android Oreo displays a "low" gamut (sRGB). If an app wants to display something greater than sRGB, then it needs to explicitly declare that. An app that does 3D rendering can do that with OpenGL or Vulcan. Standard apps need to add android:colorMode="wideColorGamut" to their AndroidManifest.xml, or use setColorMode(COLOR_MODE_WIDE_COLOR_GAMUT) when launching the activity. In other words, developers have to add code to their apps to use a wider color gamut. If an app doesn't do this, the colors will be limited to low gamut.

White: sRGB, Orange: DCI-P3

You may be thinking, "Colors on my Pixel 2 look ridiculously faded compared to my [insert pre-Oreo OLED device here]." Well, that's likely because none of the apps you are using call for a wide color gamut. Google decided against forcing conversions of color spaces for memory and performance reasons. This is how Google tells developers to handle colors in Oreo.

When wide color gamut mode is enabled, the activity's window uses more memory and GPU processing for screen composition. Before enabling wide color gamut mode, you should carefully consider if the activity truly benefits from it. For example, an activity that displays photos in fullscreen is a good candidate for wide color gamut mode, but an activity that shows small thumbnails is not.

Color spaces on the Pixel

Google has the made the decision to launch the Pixel 2 with sRGB as its default color space. The original Pixel, conversely, launched with Nougat, which didn’t include color space support. While it did display a wider range of colors, they were actually inaccurate most of the time. When Google upgraded the Pixel, it decided against changing the 2016 Pixel’s color space with its Oreo update—it's “grandfathered" into the Nougat-style color space. That decision was probably made in the name of maintaining consistency for users who were accustomed to a certain color space on their devices. Regardless, those that enjoyed the original Pixel’s display might consider the Pixel 2 to be a downgrade.

Unfortunately, Google has handled this transition rather poorly. People aren’t seeing brighter colors on the Pixel 2, not because the device can’t support it, but because Google has not put the effort into updating its apps to support wide color gamut. In my opinion, this is where Google failed. Not even Google Photos has wide gamut support. The only exception I’ve found is Google Camera, which uses a wide gamut in the viewfinder, probably because it's using OpenGL. However, viewing that photo after capture steps the gamut back down to default (sRGB). Google should update its apps to allow wide color gamut, at least with Google Photos. The Pixel Launcher should support wide color gamut, as well. Even Google Chrome doesn't support wide color gamut yet. It's a bit ridiculous, in my opinion, to ask developers to start using wide color gamut when first-party apps don't even support it.

What if someone prefers to use all their apps with brighter colors? Has Google devised a viable solution for these users? Quite simply, no. Google did include an option to add "Vivid Colors" to the display on the Pixel 2, which might look nicer to some. However, it’s barely drawing past the sRGB gamut—colors aren’t getting "bumped up" to the much wider color space by flipping this switch. Furthermore, there's no way to override the default low mode (sRGB) on the Pixel 2. Google would have to add this option at some point, but it looks like any app that actually wants to purposefully use sRGB (eg. a photo-editing app) wouldn’t be able to prevent such an override. As I said before, there are only 3 options: low/default, HDR, and wide. Low and default aren't separate options for developers.

On the bright side, some applications already support wide color gamut in their apps. OpenGL natively supports multiple color spaces, so you may find some games using DCI-P3 or something similar. Google Chrome Beta does support DCI-P3 if you enable it with a flag, so it’s probably only a matter of time until the feature is completed. As for when Google will allow Pixel 2 owners to force color mode, that’s still unknown.

Waiting for Google is never fun, so I’ve developed an app called Oreo Colorizer. It allows you to force your device to display in wide color gamut, and best of all, you don't need to root your device. The app is coming your way soon, so keep an eye out.