summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Christine Franks <christyfranks@google.com> 2019-01-04 17:17:45 -0800
committer Christine Franks <christyfranks@google.com> 2019-01-24 10:58:00 -0800
commitd154fe5dbf081585f876b01faba508d5af2fe632 (patch)
tree83c0e06558b7079f51deba68c8529fd7136dc6d7
parenta75a6ee0c1f635dd9b1d77875ce6e62c9e0c5816 (diff)
Move color modes to ColorDisplayService
Bug: 123352608 Test: atest FrameworksServicesTests:ColorDisplayServiceTest Change-Id: Iee9034721366723a7b2faba0ea2adc9479c6fec5
-rw-r--r--core/java/android/hardware/display/ColorDisplayManager.java84
-rw-r--r--core/java/android/hardware/display/IColorDisplayManager.aidl3
-rw-r--r--core/java/android/provider/Settings.java6
-rw-r--r--core/java/com/android/internal/app/ColorDisplayController.java150
-rw-r--r--services/core/java/com/android/server/display/ColorDisplayService.java139
-rw-r--r--services/core/java/com/android/server/display/DisplayTransformManager.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java57
7 files changed, 246 insertions, 205 deletions
diff --git a/core/java/android/hardware/display/ColorDisplayManager.java b/core/java/android/hardware/display/ColorDisplayManager.java
index ae5b00377ef6..5dcf3caf077b 100644
--- a/core/java/android/hardware/display/ColorDisplayManager.java
+++ b/core/java/android/hardware/display/ColorDisplayManager.java
@@ -23,12 +23,14 @@ import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.content.ContentResolver;
import android.content.Context;
import android.metrics.LogMaker;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
+import android.provider.Settings.Secure;
import com.android.internal.R;
import com.android.internal.logging.MetricsLogger;
@@ -120,6 +122,42 @@ public final class ColorDisplayManager {
*/
public static final int AUTO_MODE_TWILIGHT = 2;
+ /**
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({COLOR_MODE_NATURAL, COLOR_MODE_BOOSTED, COLOR_MODE_SATURATED, COLOR_MODE_AUTOMATIC})
+ public @interface ColorMode {}
+
+ /**
+ * Color mode with natural colors.
+ *
+ * @hide
+ * @see #setColorMode(int)
+ */
+ public static final int COLOR_MODE_NATURAL = 0;
+ /**
+ * Color mode with boosted colors.
+ *
+ * @hide
+ * @see #setColorMode(int)
+ */
+ public static final int COLOR_MODE_BOOSTED = 1;
+ /**
+ * Color mode with saturated colors.
+ *
+ * @hide
+ * @see #setColorMode(int)
+ */
+ public static final int COLOR_MODE_SATURATED = 2;
+ /**
+ * Color mode with automatic colors.
+ *
+ * @hide
+ * @see #setColorMode(int)
+ */
+ public static final int COLOR_MODE_AUTOMATIC = 3;
+
private final ColorDisplayManagerInternal mManager;
private MetricsLogger mMetricsLogger;
@@ -275,6 +313,24 @@ public final class ColorDisplayManager {
}
/**
+ * Sets the current display color mode.
+ *
+ * @hide
+ */
+ public void setColorMode(int colorMode) {
+ mManager.setColorMode(colorMode);
+ }
+
+ /**
+ * Gets the current display color mode.
+ *
+ * @hide
+ */
+ public int getColorMode() {
+ return mManager.getColorMode();
+ }
+
+ /**
* Returns whether the device has a wide color gamut display.
*
* @hide
@@ -373,6 +429,18 @@ public final class ColorDisplayManager {
return mManager.getTransformCapabilities();
}
+ /**
+ * Returns whether accessibility transforms are currently enabled, which determines whether
+ * color modes are currently configurable for this device.
+ *
+ * @hide
+ */
+ public static boolean areAccessibilityTransformsEnabled(Context context) {
+ final ContentResolver cr = context.getContentResolver();
+ return Secure.getInt(cr, Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0) == 1
+ || Secure.getInt(cr, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0) == 1;
+ }
+
private MetricsLogger getMetricsLogger() {
if (mMetricsLogger == null) {
mMetricsLogger = new MetricsLogger();
@@ -517,6 +585,22 @@ public final class ColorDisplayManager {
}
}
+ int getColorMode() {
+ try {
+ return mCdm.getColorMode();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ void setColorMode(int colorMode) {
+ try {
+ mCdm.setColorMode(colorMode);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
int getTransformCapabilities() {
try {
return mCdm.getTransformCapabilities();
diff --git a/core/java/android/hardware/display/IColorDisplayManager.aidl b/core/java/android/hardware/display/IColorDisplayManager.aidl
index 1918fd5d8cb1..30e76cfe2787 100644
--- a/core/java/android/hardware/display/IColorDisplayManager.aidl
+++ b/core/java/android/hardware/display/IColorDisplayManager.aidl
@@ -38,4 +38,7 @@ interface IColorDisplayManager {
boolean setNightDisplayCustomStartTime(in Time time);
Time getNightDisplayCustomEndTime();
boolean setNightDisplayCustomEndTime(in Time time);
+
+ int getColorMode();
+ void setColorMode(int colorMode);
} \ No newline at end of file
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ba4822f277df..91662a1e8c7a 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -59,6 +59,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.SQLException;
+import android.hardware.display.ColorDisplayManager;
import android.location.LocationManager;
import android.media.AudioFormat;
import android.net.ConnectivityManager;
@@ -89,7 +90,6 @@ import android.util.MemoryIntArray;
import android.view.inputmethod.InputMethodSystemProperty;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.app.ColorDisplayController;
import com.android.internal.widget.ILockSettings;
import java.io.IOException;
@@ -3239,8 +3239,8 @@ public final class Settings {
private static final Validator DISPLAY_COLOR_MODE_VALIDATOR =
new SettingsValidators.InclusiveIntegerRangeValidator(
- ColorDisplayController.COLOR_MODE_NATURAL,
- ColorDisplayController.COLOR_MODE_AUTOMATIC);
+ ColorDisplayManager.COLOR_MODE_NATURAL,
+ ColorDisplayManager.COLOR_MODE_AUTOMATIC);
/**
* The amount of time in milliseconds before the device goes to sleep or begins
diff --git a/core/java/com/android/internal/app/ColorDisplayController.java b/core/java/com/android/internal/app/ColorDisplayController.java
index b03fde7a3fad..2ac0e4de58ac 100644
--- a/core/java/com/android/internal/app/ColorDisplayController.java
+++ b/core/java/com/android/internal/app/ColorDisplayController.java
@@ -16,7 +16,6 @@
package com.android.internal.app;
-import android.annotation.IntDef;
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.content.ContentResolver;
@@ -24,18 +23,13 @@ import android.content.Context;
import android.database.ContentObserver;
import android.hardware.display.ColorDisplayManager;
import android.hardware.display.ColorDisplayManager.AutoMode;
+import android.hardware.display.ColorDisplayManager.ColorMode;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
-import android.os.SystemProperties;
import android.provider.Settings.Secure;
-import android.provider.Settings.System;
import android.util.Slog;
-import com.android.internal.R;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.time.LocalTime;
/**
@@ -49,35 +43,6 @@ public final class ColorDisplayController {
private static final String TAG = "ColorDisplayController";
private static final boolean DEBUG = false;
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({COLOR_MODE_NATURAL, COLOR_MODE_BOOSTED, COLOR_MODE_SATURATED, COLOR_MODE_AUTOMATIC})
- public @interface ColorMode {}
-
- /**
- * Color mode with natural colors.
- *
- * @see #setColorMode(int)
- */
- public static final int COLOR_MODE_NATURAL = 0;
- /**
- * Color mode with boosted colors.
- *
- * @see #setColorMode(int)
- */
- public static final int COLOR_MODE_BOOSTED = 1;
- /**
- * Color mode with saturated colors.
- *
- * @see #setColorMode(int)
- */
- public static final int COLOR_MODE_SATURATED = 2;
- /**
- * Color mode with automatic colors.
- *
- * @see #setColorMode(int)
- */
- public static final int COLOR_MODE_AUTOMATIC = 3;
-
private final Context mContext;
private final int mUserId;
private final ColorDisplayManager mColorDisplayManager;
@@ -197,74 +162,10 @@ public final class ColorDisplayController {
}
/**
- * Get the current color mode from system properties, or return -1.
- *
- * See com.android.server.display.DisplayTransformManager.
- */
- private @ColorMode int getCurrentColorModeFromSystemProperties() {
- final int displayColorSetting = SystemProperties.getInt("persist.sys.sf.native_mode", 0);
- if (displayColorSetting == 0) {
- return "1.0".equals(SystemProperties.get("persist.sys.sf.color_saturation"))
- ? COLOR_MODE_NATURAL : COLOR_MODE_BOOSTED;
- } else if (displayColorSetting == 1) {
- return COLOR_MODE_SATURATED;
- } else if (displayColorSetting == 2) {
- return COLOR_MODE_AUTOMATIC;
- } else {
- return -1;
- }
- }
-
- private boolean isColorModeAvailable(@ColorMode int colorMode) {
- final int[] availableColorModes = mContext.getResources().getIntArray(
- R.array.config_availableColorModes);
- if (availableColorModes != null) {
- for (int mode : availableColorModes) {
- if (mode == colorMode) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
* Get the current color mode.
*/
public int getColorMode() {
- if (getAccessibilityTransformActivated()) {
- if (isColorModeAvailable(COLOR_MODE_SATURATED)) {
- return COLOR_MODE_SATURATED;
- } else if (isColorModeAvailable(COLOR_MODE_AUTOMATIC)) {
- return COLOR_MODE_AUTOMATIC;
- }
- }
-
- int colorMode = System.getIntForUser(mContext.getContentResolver(),
- System.DISPLAY_COLOR_MODE, -1, mUserId);
- if (colorMode == -1) {
- // There might be a system property controlling color mode that we need to respect; if
- // not, this will set a suitable default.
- colorMode = getCurrentColorModeFromSystemProperties();
- }
-
- // This happens when a color mode is no longer available (e.g., after system update or B&R)
- // or the device does not support any color mode.
- if (!isColorModeAvailable(colorMode)) {
- if (colorMode == COLOR_MODE_BOOSTED && isColorModeAvailable(COLOR_MODE_NATURAL)) {
- colorMode = COLOR_MODE_NATURAL;
- } else if (colorMode == COLOR_MODE_SATURATED
- && isColorModeAvailable(COLOR_MODE_AUTOMATIC)) {
- colorMode = COLOR_MODE_AUTOMATIC;
- } else if (colorMode == COLOR_MODE_AUTOMATIC
- && isColorModeAvailable(COLOR_MODE_SATURATED)) {
- colorMode = COLOR_MODE_SATURATED;
- } else {
- colorMode = -1;
- }
- }
-
- return colorMode;
+ return mColorDisplayManager.getColorMode();
}
/**
@@ -273,11 +174,7 @@ public final class ColorDisplayController {
* @param colorMode the color mode
*/
public void setColorMode(@ColorMode int colorMode) {
- if (!isColorModeAvailable(colorMode)) {
- throw new IllegalArgumentException("Invalid colorMode: " + colorMode);
- }
- System.putIntForUser(mContext.getContentResolver(), System.DISPLAY_COLOR_MODE, colorMode,
- mUserId);
+ mColorDisplayManager.setColorMode(colorMode);
}
/**
@@ -294,18 +191,6 @@ public final class ColorDisplayController {
return ColorDisplayManager.getMaximumColorTemperature(mContext);
}
- /**
- * Returns true if any Accessibility color transforms are enabled.
- */
- public boolean getAccessibilityTransformActivated() {
- final ContentResolver cr = mContext.getContentResolver();
- return
- Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
- 0, mUserId) == 1
- || Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
- 0, mUserId) == 1;
- }
-
private void onSettingChanged(@NonNull String setting) {
if (DEBUG) {
Slog.d(TAG, "onSettingChanged: " + setting);
@@ -328,13 +213,6 @@ public final class ColorDisplayController {
case Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE:
mCallback.onColorTemperatureChanged(getColorTemperature());
break;
- case System.DISPLAY_COLOR_MODE:
- mCallback.onDisplayColorModeChanged(getColorMode());
- break;
- case Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED:
- case Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:
- mCallback.onAccessibilityTransformChanged(getAccessibilityTransformActivated());
- break;
}
}
}
@@ -377,14 +255,6 @@ public final class ColorDisplayController {
false /* notifyForDescendants */, mContentObserver, mUserId);
cr.registerContentObserver(Secure.getUriFor(Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE),
false /* notifyForDescendants */, mContentObserver, mUserId);
- cr.registerContentObserver(System.getUriFor(System.DISPLAY_COLOR_MODE),
- false /* notifyForDecendants */, mContentObserver, mUserId);
- cr.registerContentObserver(
- Secure.getUriFor(Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED),
- false /* notifyForDecendants */, mContentObserver, mUserId);
- cr.registerContentObserver(
- Secure.getUriFor(Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED),
- false /* notifyForDecendants */, mContentObserver, mUserId);
}
}
}
@@ -424,19 +294,5 @@ public final class ColorDisplayController {
* @param colorTemperature the color temperature to tint the screen
*/
default void onColorTemperatureChanged(int colorTemperature) {}
-
- /**
- * Callback invoked when the color mode changes.
- *
- * @param displayColorMode the color mode
- */
- default void onDisplayColorModeChanged(int displayColorMode) {}
-
- /**
- * Callback invoked when Accessibility color transforms change.
- *
- * @param state the state Accessibility color transforms (true of active)
- */
- default void onAccessibilityTransformChanged(boolean state) {}
}
}
diff --git a/services/core/java/com/android/server/display/ColorDisplayService.java b/services/core/java/com/android/server/display/ColorDisplayService.java
index 58c88b36f09d..eb0ed0a62ebf 100644
--- a/services/core/java/com/android/server/display/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/ColorDisplayService.java
@@ -19,7 +19,10 @@ package com.android.server.display;
import static android.hardware.display.ColorDisplayManager.AUTO_MODE_CUSTOM_TIME;
import static android.hardware.display.ColorDisplayManager.AUTO_MODE_DISABLED;
import static android.hardware.display.ColorDisplayManager.AUTO_MODE_TWILIGHT;
-
+import static android.hardware.display.ColorDisplayManager.COLOR_MODE_AUTOMATIC;
+import static android.hardware.display.ColorDisplayManager.COLOR_MODE_BOOSTED;
+import static android.hardware.display.ColorDisplayManager.COLOR_MODE_NATURAL;
+import static android.hardware.display.ColorDisplayManager.COLOR_MODE_SATURATED;
import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_DISPLAY_WHITE_BALANCE;
import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_NIGHT_DISPLAY;
import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_SATURATION;
@@ -45,6 +48,7 @@ import android.database.ContentObserver;
import android.graphics.ColorSpace;
import android.hardware.display.ColorDisplayManager;
import android.hardware.display.ColorDisplayManager.AutoMode;
+import android.hardware.display.ColorDisplayManager.ColorMode;
import android.hardware.display.IColorDisplayManager;
import android.hardware.display.Time;
import android.net.Uri;
@@ -53,6 +57,7 @@ import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings.Secure;
import android.provider.Settings.System;
@@ -61,7 +66,6 @@ import android.util.Slog;
import android.view.SurfaceControl;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.AnimationUtils;
-
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.ColorDisplayController;
@@ -71,7 +75,6 @@ import com.android.server.SystemService;
import com.android.server.twilight.TwilightListener;
import com.android.server.twilight.TwilightManager;
import com.android.server.twilight.TwilightState;
-
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
@@ -162,7 +165,7 @@ public final class ColorDisplayService extends SystemService {
}
float[] displayRedGreenBlueXYZ =
- new float[NUM_DISPLAY_PRIMARIES_VALS - NUM_VALUES_PER_PRIMARY];
+ new float[NUM_DISPLAY_PRIMARIES_VALS - NUM_VALUES_PER_PRIMARY];
float[] displayWhiteXYZ = new float[NUM_VALUES_PER_PRIMARY];
for (int i = 0; i < displayRedGreenBlueXYZ.length; i++) {
displayRedGreenBlueXYZ[i] = Float.parseFloat(displayPrimariesValues[i]);
@@ -173,10 +176,10 @@ public final class ColorDisplayService extends SystemService {
}
final ColorSpace.Rgb displayColorSpaceRGB = new ColorSpace.Rgb(
- "Display Color Space",
- displayRedGreenBlueXYZ,
- displayWhiteXYZ,
- 2.2f // gamma, unused for display white balance
+ "Display Color Space",
+ displayRedGreenBlueXYZ,
+ displayWhiteXYZ,
+ 2.2f // gamma, unused for display white balance
);
float[] displayNominalWhiteXYZ = new float[NUM_VALUES_PER_PRIMARY];
@@ -242,8 +245,8 @@ public final class ColorDisplayService extends SystemService {
mCurrentColorTemperatureXYZ = ColorSpace.cctToIlluminantdXyz(cct);
mChromaticAdaptationMatrix =
- ColorSpace.chromaticAdaptation(ColorSpace.Adaptation.BRADFORD,
- mDisplayNominalWhiteXYZ, mCurrentColorTemperatureXYZ);
+ ColorSpace.chromaticAdaptation(ColorSpace.Adaptation.BRADFORD,
+ mDisplayNominalWhiteXYZ, mCurrentColorTemperatureXYZ);
// Convert the adaptation matrix to RGB space
float[] result = ColorSpace.mul3x3(mChromaticAdaptationMatrix,
@@ -385,7 +388,7 @@ public final class ColorDisplayService extends SystemService {
* subtraction from 1. The last row represents a non-multiplied addition, see surfaceflinger's
* ProgramCache for full implementation details.
*/
- private static final float[] MATRIX_INVERT_COLOR = new float[] {
+ private static final float[] MATRIX_INVERT_COLOR = new float[]{
0.402f, -0.598f, -0.599f, 0f,
-1.174f, -0.174f, -1.175f, 0f,
-0.228f, -0.228f, 0.772f, 0f,
@@ -944,6 +947,89 @@ public final class ColorDisplayService extends SystemService {
.setSaturationLevel(packageName, mCurrentUser, saturationLevel);
}
+ private void setColorModeInternal(@ColorMode int colorMode) {
+ if (!isColorModeAvailable(colorMode)) {
+ throw new IllegalArgumentException("Invalid colorMode: " + colorMode);
+ }
+ System.putIntForUser(getContext().getContentResolver(), System.DISPLAY_COLOR_MODE,
+ colorMode,
+ mCurrentUser);
+ }
+
+ private @ColorMode
+ int getColorModeInternal() {
+ final ContentResolver cr = getContext().getContentResolver();
+ if (Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
+ 0, mCurrentUser) == 1
+ || Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
+ 0, mCurrentUser) == 1) {
+ // There are restrictions on the available color modes combined with a11y transforms.
+ if (isColorModeAvailable(COLOR_MODE_SATURATED)) {
+ return COLOR_MODE_SATURATED;
+ } else if (isColorModeAvailable(COLOR_MODE_AUTOMATIC)) {
+ return COLOR_MODE_AUTOMATIC;
+ }
+ }
+
+ int colorMode = System.getIntForUser(cr, System.DISPLAY_COLOR_MODE, -1, mCurrentUser);
+ if (colorMode == -1) {
+ // There might be a system property controlling color mode that we need to respect; if
+ // not, this will set a suitable default.
+ colorMode = getCurrentColorModeFromSystemProperties();
+ }
+
+ // This happens when a color mode is no longer available (e.g., after system update or B&R)
+ // or the device does not support any color mode.
+ if (!isColorModeAvailable(colorMode)) {
+ if (colorMode == COLOR_MODE_BOOSTED && isColorModeAvailable(COLOR_MODE_NATURAL)) {
+ colorMode = COLOR_MODE_NATURAL;
+ } else if (colorMode == COLOR_MODE_SATURATED
+ && isColorModeAvailable(COLOR_MODE_AUTOMATIC)) {
+ colorMode = COLOR_MODE_AUTOMATIC;
+ } else if (colorMode == COLOR_MODE_AUTOMATIC
+ && isColorModeAvailable(COLOR_MODE_SATURATED)) {
+ colorMode = COLOR_MODE_SATURATED;
+ } else {
+ colorMode = -1;
+ }
+ }
+
+ return colorMode;
+ }
+
+ /**
+ * Get the current color mode from system properties, or return -1 if invalid.
+ *
+ * See {@link com.android.server.display.DisplayTransformManager}
+ */
+ private @ColorMode
+ int getCurrentColorModeFromSystemProperties() {
+ final int displayColorSetting = SystemProperties.getInt("persist.sys.sf.native_mode", 0);
+ if (displayColorSetting == 0) {
+ return "1.0".equals(SystemProperties.get("persist.sys.sf.color_saturation"))
+ ? COLOR_MODE_NATURAL : COLOR_MODE_BOOSTED;
+ } else if (displayColorSetting == 1) {
+ return COLOR_MODE_SATURATED;
+ } else if (displayColorSetting == 2) {
+ return COLOR_MODE_AUTOMATIC;
+ } else {
+ return -1;
+ }
+ }
+
+ private boolean isColorModeAvailable(@ColorMode int colorMode) {
+ final int[] availableColorModes = getContext().getResources().getIntArray(
+ R.array.config_availableColorModes);
+ if (availableColorModes != null) {
+ for (int mode : availableColorModes) {
+ if (mode == colorMode) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
private void dumpInternal(PrintWriter pw) {
pw.println("COLOR DISPLAY MANAGER dumpsys (color_display)");
pw.println("Night Display:");
@@ -1445,7 +1531,9 @@ public final class ColorDisplayService extends SystemService {
*/
public interface ColorTransformController {
- /** Apply the given saturation (grayscale) matrix to the associated AppWindow. */
+ /**
+ * Apply the given saturation (grayscale) matrix to the associated AppWindow.
+ */
void applyAppSaturation(@Size(9) float[] matrix, @Size(3) float[] translation);
}
@@ -1453,6 +1541,29 @@ public final class ColorDisplayService extends SystemService {
final class BinderService extends IColorDisplayManager.Stub {
@Override
+ public void setColorMode(int colorMode) {
+ getContext().enforceCallingOrSelfPermission(
+ Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS,
+ "Permission required to set display color mode");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ setColorModeInternal(colorMode);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public int getColorMode() {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ return getColorModeInternal();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
public boolean isDeviceColorManaged() {
final long token = Binder.clearCallingIdentity();
try {
@@ -1640,7 +1751,9 @@ public final class ColorDisplayService extends SystemService {
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return;
+ if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) {
+ return;
+ }
final long token = Binder.clearCallingIdentity();
try {
diff --git a/services/core/java/com/android/server/display/DisplayTransformManager.java b/services/core/java/com/android/server/display/DisplayTransformManager.java
index a5e9728e4b68..b1b7d3c8769b 100644
--- a/services/core/java/com/android/server/display/DisplayTransformManager.java
+++ b/services/core/java/com/android/server/display/DisplayTransformManager.java
@@ -17,6 +17,7 @@
package com.android.server.display;
import android.app.ActivityTaskManager;
+import android.hardware.display.ColorDisplayManager;
import android.opengl.Matrix;
import android.os.IBinder;
import android.os.Parcel;
@@ -27,7 +28,6 @@ import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.app.ColorDisplayController;
import java.util.Arrays;
@@ -248,20 +248,20 @@ public class DisplayTransformManager {
* work in linear space.
*/
public static boolean needsLinearColorMatrix(int colorMode) {
- return colorMode != ColorDisplayController.COLOR_MODE_SATURATED;
+ return colorMode != ColorDisplayManager.COLOR_MODE_SATURATED;
}
public boolean setColorMode(int colorMode, float[] nightDisplayMatrix) {
- if (colorMode == ColorDisplayController.COLOR_MODE_NATURAL) {
+ if (colorMode == ColorDisplayManager.COLOR_MODE_NATURAL) {
applySaturation(COLOR_SATURATION_NATURAL);
setDisplayColor(DISPLAY_COLOR_MANAGED);
- } else if (colorMode == ColorDisplayController.COLOR_MODE_BOOSTED) {
+ } else if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) {
applySaturation(COLOR_SATURATION_BOOSTED);
setDisplayColor(DISPLAY_COLOR_MANAGED);
- } else if (colorMode == ColorDisplayController.COLOR_MODE_SATURATED) {
+ } else if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) {
applySaturation(COLOR_SATURATION_NATURAL);
setDisplayColor(DISPLAY_COLOR_UNMANAGED);
- } else if (colorMode == ColorDisplayController.COLOR_MODE_AUTOMATIC) {
+ } else if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) {
applySaturation(COLOR_SATURATION_NATURAL);
setDisplayColor(DISPLAY_COLOR_ENHANCED);
}
diff --git a/services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java b/services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java
index ca39a7f98f79..0b01657868a8 100644
--- a/services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java
@@ -918,15 +918,14 @@ public class ColorDisplayServiceTest {
}
setAccessibilityColorInversion(true);
- setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+ setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
startService();
- assertAccessibilityTransformActivated(true /* activated */ );
- assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
- if (isColorModeValid(ColorDisplayController.COLOR_MODE_SATURATED)) {
- assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
- } else if (isColorModeValid(ColorDisplayController.COLOR_MODE_AUTOMATIC)) {
- assertActiveColorMode(ColorDisplayController.COLOR_MODE_AUTOMATIC);
+ assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
+ if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) {
+ assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED);
+ } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) {
+ assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC);
}
}
@@ -937,15 +936,14 @@ public class ColorDisplayServiceTest {
}
setAccessibilityColorCorrection(true);
- setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+ setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
startService();
- assertAccessibilityTransformActivated(true /* activated */ );
- assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
- if (isColorModeValid(ColorDisplayController.COLOR_MODE_SATURATED)) {
- assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
- } else if (isColorModeValid(ColorDisplayController.COLOR_MODE_AUTOMATIC)) {
- assertActiveColorMode(ColorDisplayController.COLOR_MODE_AUTOMATIC);
+ assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
+ if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) {
+ assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED);
+ } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) {
+ assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC);
}
}
@@ -957,15 +955,14 @@ public class ColorDisplayServiceTest {
setAccessibilityColorCorrection(true);
setAccessibilityColorInversion(true);
- setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+ setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
startService();
- assertAccessibilityTransformActivated(true /* activated */ );
- assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
- if (isColorModeValid(ColorDisplayController.COLOR_MODE_SATURATED)) {
- assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
- } else if (isColorModeValid(ColorDisplayController.COLOR_MODE_AUTOMATIC)) {
- assertActiveColorMode(ColorDisplayController.COLOR_MODE_AUTOMATIC);
+ assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
+ if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) {
+ assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED);
+ } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) {
+ assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC);
}
}
@@ -977,12 +974,11 @@ public class ColorDisplayServiceTest {
setAccessibilityColorCorrection(false);
setAccessibilityColorInversion(false);
- setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+ setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
startService();
- assertAccessibilityTransformActivated(false /* activated */ );
- assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
- assertActiveColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+ assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
+ assertActiveColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
}
/**
@@ -1098,17 +1094,6 @@ public class ColorDisplayServiceTest {
}
/**
- * Convenience method for asserting that Accessibility color transform is detected.
- *
- * @param state {@code true} if any Accessibility transform should be activated
- */
- private void assertAccessibilityTransformActivated(boolean state) {
- assertWithMessage("Unexpected Accessibility color transform state")
- .that(mColorDisplayController.getAccessibilityTransformActivated())
- .isEqualTo(state);
- }
-
- /**
* Convenience method for asserting that the active color mode matches expectation.
*
* @param mode the expected active color mode.