summaryrefslogtreecommitdiff
path: root/services/core/java/com/android/server/display/DisplayTransformManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/core/java/com/android/server/display/DisplayTransformManager.java')
-rw-r--r--services/core/java/com/android/server/display/DisplayTransformManager.java92
1 files changed, 92 insertions, 0 deletions
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);
+ }
+ }
}