summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-10-25 21:04:00 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-10-25 21:04:00 +0000
commit4745025d36ce428dce07ef13ee6039f7234ea087 (patch)
treede2ed9dc79ce7dabab77b42b2f3e5ed72c803fa0
parent16d7566d9d528550e06fb55598e8bb78f3ec87ba (diff)
parent7b234981058d57883360085d715e7d19a0455943 (diff)
downloadbase-4745025d36ce428dce07ef13ee6039f7234ea087.tar.gz
Merge cherrypicks of [3120219, 3121602, 3124243, 3125180] into oc-mr1-release
Change-Id: Iba119bfeb023f798076d19b82546db78ab06edb5
-rwxr-xr-xcore/java/android/provider/Settings.java6
-rw-r--r--core/java/com/android/internal/app/NightDisplayController.java61
-rw-r--r--core/res/res/values/config.xml12
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--services/core/java/com/android/server/display/DisplayTransformManager.java92
-rw-r--r--services/core/java/com/android/server/display/NightDisplayService.java30
6 files changed, 196 insertions, 6 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index a248bf79f2a6..ba62b4734a7c 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3048,6 +3048,12 @@ public final class Settings {
private static final Validator DIM_SCREEN_VALIDATOR = sBooleanValidator;
/**
+ * The display color mode.
+ * @hide
+ */
+ public static final String DISPLAY_COLOR_MODE = "display_color_mode";
+
+ /**
* The amount of time in milliseconds before the device goes to sleep or begins
* to dream after a period of inactivity. This value is also known as the
* user activity timeout period since the screen isn't necessarily turned off
diff --git a/core/java/com/android/internal/app/NightDisplayController.java b/core/java/com/android/internal/app/NightDisplayController.java
index 7a1383c7a01c..d581777ba5bf 100644
--- a/core/java/com/android/internal/app/NightDisplayController.java
+++ b/core/java/com/android/internal/app/NightDisplayController.java
@@ -26,6 +26,7 @@ import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings.Secure;
+import android.provider.Settings.System;
import android.util.Slog;
import com.android.internal.R;
@@ -54,6 +55,10 @@ public final class NightDisplayController {
@IntDef({ AUTO_MODE_DISABLED, AUTO_MODE_CUSTOM, AUTO_MODE_TWILIGHT })
public @interface AutoMode {}
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({ COLOR_MODE_NATURAL, COLOR_MODE_BOOSTED, COLOR_MODE_SATURATED })
+ public @interface ColorMode {}
+
/**
* Auto mode value to prevent Night display from being automatically activated. It can still
* be activated manually via {@link #setActivated(boolean)}.
@@ -76,6 +81,25 @@ public final class NightDisplayController {
*/
public static final int AUTO_MODE_TWILIGHT = 2;
+ /**
+ * 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;
+
private final Context mContext;
private final int mUserId;
@@ -306,6 +330,31 @@ public final class NightDisplayController {
}
/**
+ * Get the current color mode.
+ */
+ public int getColorMode() {
+ final int colorMode = System.getIntForUser(mContext.getContentResolver(),
+ System.DISPLAY_COLOR_MODE, COLOR_MODE_BOOSTED, mUserId);
+ if (colorMode < COLOR_MODE_NATURAL || colorMode > COLOR_MODE_SATURATED) {
+ return COLOR_MODE_BOOSTED;
+ }
+ return colorMode;
+ }
+
+ /**
+ * Set the current color mode.
+ *
+ * @param colorMode the color mode
+ */
+ public void setColorMode(@ColorMode int colorMode) {
+ if (colorMode < COLOR_MODE_NATURAL || colorMode > COLOR_MODE_SATURATED) {
+ return;
+ }
+ System.putIntForUser(mContext.getContentResolver(), System.DISPLAY_COLOR_MODE, colorMode,
+ mUserId);
+ }
+
+ /**
* Returns the minimum allowed color temperature (in Kelvin) to tint the display when activated.
*/
public int getMinimumColorTemperature() {
@@ -351,6 +400,9 @@ public final class NightDisplayController {
case Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE:
mCallback.onColorTemperatureChanged(getColorTemperature());
break;
+ case System.DISPLAY_COLOR_MODE:
+ mCallback.onDisplayColorModeChanged(getColorMode());
+ break;
}
}
}
@@ -379,6 +431,8 @@ public final class NightDisplayController {
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);
}
}
}
@@ -425,5 +479,12 @@ public final class NightDisplayController {
* @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) {}
}
}
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index b2727f84e87f..3d7578539482 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -890,6 +890,18 @@
<!-- Maximum color temperature, in Kelvin, supported by Night display. -->
<integer name="config_nightDisplayColorTemperatureMax">4082</integer>
+ <string-array name="config_nightDisplayColorTemperatureCoefficientsNative">
+ <!-- R a-coefficient --> <item>0.0</item>
+ <!-- R b-coefficient --> <item>0.0</item>
+ <!-- R y-intercept --> <item>1.0</item>
+ <!-- G a-coefficient --> <item>-0.00000000962353339</item>
+ <!-- G b-coefficient --> <item>0.000153045476</item>
+ <!-- G y-intercept --> <item>0.390782778</item>
+ <!-- B a-coefficient --> <item>-0.0000000189359041</item>
+ <!-- B b-coefficient --> <item>0.000302412211</item>
+ <!-- B y-intercept --> <item>-0.198650895</item>
+ </string-array>
+
<string-array name="config_nightDisplayColorTemperatureCoefficients">
<!-- R a-coefficient --> <item>0.0</item>
<!-- R b-coefficient --> <item>0.0</item>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 0548db69a05d..15a353ba2b05 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2814,6 +2814,7 @@
<java-symbol type="integer" name="config_nightDisplayColorTemperatureMin" />
<java-symbol type="integer" name="config_nightDisplayColorTemperatureMax" />
<java-symbol type="array" name="config_nightDisplayColorTemperatureCoefficients" />
+ <java-symbol type="array" name="config_nightDisplayColorTemperatureCoefficientsNative" />
<!-- Default first user restrictions -->
<java-symbol type="array" name="config_defaultFirstUserRestrictions" />
diff --git a/services/core/java/com/android/server/display/DisplayTransformManager.java b/services/core/java/com/android/server/display/DisplayTransformManager.java
index dbbb318db63b..2aba871f521e 100644
--- a/services/core/java/com/android/server/display/DisplayTransformManager.java
+++ b/services/core/java/com/android/server/display/DisplayTransformManager.java
@@ -16,15 +16,20 @@
package com.android.server.display;
+import android.app.ActivityManager;
+import android.app.IActivityManager;
import android.opengl.Matrix;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.app.NightDisplayController;
import java.util.Arrays;
/**
@@ -50,6 +55,17 @@ public class DisplayTransformManager {
private static final int SURFACE_FLINGER_TRANSACTION_COLOR_MATRIX = 1015;
private static final int SURFACE_FLINGER_TRANSACTION_DALTONIZER = 1014;
+ static final String PERSISTENT_PROPERTY_SATURATION = "persist.sys.sf.color_saturation";
+
+ static final String PERSISTENT_PROPERTY_NATIVE_MODE = "persist.sys.sf.native_mode";
+
+ private static final int SURFACE_FLINGER_TRANSACTION_SATURATION = 1022;
+ private static final int SURFACE_FLINGER_TRANSACTION_NATIVE_MODE = 1023;
+
+ static final float COLOR_SATURATION_NATURAL = 1.0f;
+
+ static final float COLOR_SATURATION_BOOSTED = 1.1f;
+
/**
* Map of level -> color transformation matrix.
*/
@@ -68,9 +84,18 @@ public class DisplayTransformManager {
@GuardedBy("mDaltonizerModeLock")
private int mDaltonizerMode = -1;
+ private IBinder mSurfaceFlinger;
+
/* package */ DisplayTransformManager() {
}
+ public IBinder getSurfaceFlinger() {
+ if (mSurfaceFlinger == null) {
+ mSurfaceFlinger = ServiceManager.getService("SurfaceFlinger");
+ }
+ return mSurfaceFlinger;
+ }
+
/**
* Returns a copy of the color transform matrix set for a given level.
*/
@@ -201,4 +226,71 @@ public class DisplayTransformManager {
}
}
}
+
+ public static boolean isNativeModeEnabled() {
+ return SystemProperties.getBoolean(PERSISTENT_PROPERTY_NATIVE_MODE, false);
+ }
+
+ public boolean setColorMode(int colorMode) {
+ if (colorMode == NightDisplayController.COLOR_MODE_NATURAL) {
+ applySaturation(COLOR_SATURATION_NATURAL);
+ setNativeMode(false);
+ } else if (colorMode == NightDisplayController.COLOR_MODE_BOOSTED) {
+ applySaturation(COLOR_SATURATION_BOOSTED);
+ setNativeMode(false);
+ } else if (colorMode == NightDisplayController.COLOR_MODE_SATURATED) {
+ applySaturation(COLOR_SATURATION_NATURAL);
+ setNativeMode(true);
+ }
+
+ updateConfiguration();
+
+ return true;
+ }
+
+ /**
+ * Propagates the provided saturation to the SurfaceFlinger.
+ */
+ private void applySaturation(float saturation) {
+ SystemProperties.set(PERSISTENT_PROPERTY_SATURATION, Float.toString(saturation));
+ if (getSurfaceFlinger() != null) {
+ final Parcel data = Parcel.obtain();
+ data.writeInterfaceToken("android.ui.ISurfaceComposer");
+ data.writeFloat(saturation);
+ try {
+ getSurfaceFlinger().transact(SURFACE_FLINGER_TRANSACTION_SATURATION, data, null, 0);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Failed to set saturation", ex);
+ } finally {
+ data.recycle();
+ }
+ }
+ }
+
+ /**
+ * Toggles native mode on/off in SurfaceFlinger.
+ */
+ private void setNativeMode(boolean enabled) {
+ SystemProperties.set(PERSISTENT_PROPERTY_NATIVE_MODE, enabled ? "1" : "0");
+ if (getSurfaceFlinger() != null) {
+ final Parcel data = Parcel.obtain();
+ data.writeInterfaceToken("android.ui.ISurfaceComposer");
+ data.writeInt(enabled ? 1 : 0);
+ try {
+ getSurfaceFlinger().transact(SURFACE_FLINGER_TRANSACTION_NATIVE_MODE, data, null, 0);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Failed to set native mode", ex);
+ } finally {
+ data.recycle();
+ }
+ }
+ }
+
+ void updateConfiguration() {
+ try {
+ ActivityManager.getService().updateConfiguration(null);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not update configuration", e);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/display/NightDisplayService.java b/services/core/java/com/android/server/display/NightDisplayService.java
index eec2c99bac5b..4c9bb3b7fdfe 100644
--- a/services/core/java/com/android/server/display/NightDisplayService.java
+++ b/services/core/java/com/android/server/display/NightDisplayService.java
@@ -128,12 +128,6 @@ public final class NightDisplayService extends SystemService
public NightDisplayService(Context context) {
super(context);
mHandler = new Handler(Looper.getMainLooper());
-
- final String[] coefficients = context.getResources().getStringArray(
- R.array.config_nightDisplayColorTemperatureCoefficients);
- for (int i = 0; i < 9 && i < coefficients.length; i++) {
- mColorTempCoefficients[i] = Float.parseFloat(coefficients[i]);
- }
}
@Override
@@ -238,6 +232,8 @@ public final class NightDisplayService extends SystemService
mController = new NightDisplayController(getContext(), mCurrentUser);
mController.setListener(this);
+ setCoefficientMatrix(getContext());
+
// Prepare color transformation matrix.
setMatrix(mController.getColorTemperature(), mMatrixNight);
@@ -333,6 +329,28 @@ public final class NightDisplayService extends SystemService
applyTint(true);
}
+ @Override
+ public void onDisplayColorModeChanged(int colorMode) {
+ final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);
+ dtm.setColorMode(colorMode);
+
+ setCoefficientMatrix(getContext());
+ setMatrix(mController.getColorTemperature(), mMatrixNight);
+ if (mController.isActivated()) {
+ applyTint(true);
+ }
+ }
+
+ private void setCoefficientMatrix(Context context) {
+ final boolean isNative = DisplayTransformManager.isNativeModeEnabled();
+ final String[] coefficients = context.getResources().getStringArray(isNative ?
+ R.array.config_nightDisplayColorTemperatureCoefficientsNative
+ : R.array.config_nightDisplayColorTemperatureCoefficients);
+ for (int i = 0; i < 9 && i < coefficients.length; i++) {
+ mColorTempCoefficients[i] = Float.parseFloat(coefficients[i]);
+ }
+ }
+
/**
* Applies current color temperature matrix, or removes it if deactivated.
*