summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2013-12-16 13:45:39 -0800
committerAlan Viverette <alanv@google.com>2013-12-16 13:45:39 -0800
commitf242659afc6539f9f1104833a88e37b5f9203417 (patch)
tree26354c0be8c1e37df8249bf65450e97e9e24c6c2
parentf51021c32c1998456e1d8f6b0effc0297c2fff05 (diff)
downloadframeworks_base-f242659afc6539f9f1104833a88e37b5f9203417.zip
frameworks_base-f242659afc6539f9f1104833a88e37b5f9203417.tar.gz
frameworks_base-f242659afc6539f9f1104833a88e37b5f9203417.tar.bz2
Refactor display adjustments into their own utils class
Change-Id: Iddc413d7841d44b00e06ed1c5a02d54eb60858df
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityManagerService.java219
-rw-r--r--services/java/com/android/server/accessibility/DisplayAdjustmentUtils.java246
2 files changed, 257 insertions, 208 deletions
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 5e10d26..43e1f12 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -141,51 +141,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
private static final int MAX_POOL_SIZE = 10;
- /** Matrix and offset used for converting color to grayscale. */
- private static final float[] GRAYSCALE_MATRIX = new float[] {
- .2126f, .2126f, .2126f, 0,
- .7152f, .7152f, .7152f, 0,
- .0722f, .0722f, .0722f, 0,
- 0, 0, 0, 1
- };
-
- /** Matrix and offset used for standard display inversion. */
- private static final float[] INVERSION_MATRIX_STANDARD = new float[] {
- -1, 0, 0, 0,
- 0, -1, 0, 0,
- 0, 0, -1, 0,
- 1, 1, 1, 1
- };
-
- /** Matrix and offset used for hue-only display inversion. */
- private static final float[] INVERSION_MATRIX_HUE_ONLY = new float[] {
- 0, .5f, .5f, 0,
- .5f, 0, .5f, 0,
- .5f, .5f, 0, 0,
- 0, 0, 0, 1
- };
-
- /** Matrix and offset used for value-only display inversion. */
- private static final float[] INVERSION_MATRIX_VALUE_ONLY = new float[] {
- 0, -.5f, -.5f, 0,
- -.5f, 0, -.5f, 0,
- -.5f, -.5f, 0, 0,
- 1, 1, 1, 1
- };
-
- /** Default contrast for display contrast enhancement. */
- private static final float DEFAULT_DISPLAY_CONTRAST = 2;
-
- /** Default brightness for display contrast enhancement. */
- private static final float DEFAULT_DISPLAY_BRIGHTNESS = 0;
-
- /** Default inversion mode for display color inversion. */
- private static final int DEFAULT_DISPLAY_INVERSION = AccessibilityManager.INVERSION_STANDARD;
-
- /** Default inversion mode for display color correction. */
- private static final int DEFAULT_DISPLAY_DALTONIZER =
- AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY;
-
private static int sIdCounter = 0;
private static int sNextWindowId;
@@ -1453,121 +1408,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
private boolean readDisplayColorAdjustmentSettingsLocked(UserState userState) {
- final ContentResolver cr = mContext.getContentResolver();
- final int userId = userState.mUserId;
-
- boolean hasColorTransform = Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) == 1;
-
- if (!hasColorTransform) {
- hasColorTransform |= Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED, 0, userId) == 1;
- }
-
- if (!hasColorTransform) {
- hasColorTransform |= Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) == 1;
- }
-
- if (userState.mHasDisplayColorAdjustment != hasColorTransform) {
- userState.mHasDisplayColorAdjustment = hasColorTransform;
+ final boolean displayAdjustmentsEnabled = DisplayAdjustmentUtils.hasAdjustments(mContext,
+ userState.mUserId);
+ if (displayAdjustmentsEnabled != userState.mHasDisplayColorAdjustment) {
+ userState.mHasDisplayColorAdjustment = displayAdjustmentsEnabled;
return true;
}
-
- // If adjustment is enabled, always assume there was a transform change.
- return hasColorTransform;
- }
-
- private void updateDisplayColorAdjustmentSettingsLocked(UserState userState) {
- final ContentResolver cr = mContext.getContentResolver();
- final int userId = userState.mUserId;
- float[] colorMatrix = new float[16];
- float[] outputMatrix = new float[16];
- boolean hasColorTransform = false;
-
- Matrix.setIdentityM(colorMatrix, 0);
-
- final boolean inversionEnabled = Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) == 1;
- if (inversionEnabled) {
- final int inversionMode = Settings.Secure.getIntForUser(cr,
- Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION, DEFAULT_DISPLAY_INVERSION,
- userId);
- final float[] inversionMatrix;
- switch (inversionMode) {
- case AccessibilityManager.INVERSION_HUE_ONLY:
- inversionMatrix = INVERSION_MATRIX_HUE_ONLY;
- break;
- case AccessibilityManager.INVERSION_VALUE_ONLY:
- inversionMatrix = INVERSION_MATRIX_VALUE_ONLY;
- break;
- default:
- inversionMatrix = INVERSION_MATRIX_STANDARD;
- }
-
- Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, inversionMatrix, 0);
-
- final float[] temp = colorMatrix;
- colorMatrix = outputMatrix;
- outputMatrix = colorMatrix;
-
- hasColorTransform = true;
- }
-
- final boolean contrastEnabled = Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED, 0, userId) == 1;
- if (contrastEnabled) {
- final float contrast = Settings.Secure.getFloatForUser(cr,
- Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST, DEFAULT_DISPLAY_CONTRAST,
- userId);
- final float brightness = Settings.Secure.getFloatForUser(cr,
- Settings.Secure.ACCESSIBILITY_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY_BRIGHTNESS,
- userId);
- final float off = brightness * contrast - 0.5f * contrast + 0.5f;
- final float[] contrastMatrix = {
- contrast, 0, 0, 0,
- 0, contrast, 0, 0,
- 0, 0, contrast, 0,
- off, off, off, 1
- };
-
- Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, contrastMatrix, 0);
-
- final float[] temp = colorMatrix;
- colorMatrix = outputMatrix;
- outputMatrix = colorMatrix;
-
- hasColorTransform = true;
- }
-
- final boolean daltonizerEnabled = Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0;
- if (daltonizerEnabled) {
- final int daltonizerMode = Settings.Secure.getIntForUser(cr,
- Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER,
- userId);
- // Monochromacy isn't supported by the native Daltonizer.
- if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) {
- Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, GRAYSCALE_MATRIX, 0);
-
- final float[] temp = colorMatrix;
- colorMatrix = outputMatrix;
- outputMatrix = temp;
-
- hasColorTransform = true;
- nativeSetDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
- } else {
- nativeSetDaltonizerMode(daltonizerMode);
- }
- } else {
- nativeSetDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
- }
-
- if (hasColorTransform) {
- nativeSetColorTransform(colorMatrix);
- } else {
- nativeSetColorTransform(null);
- }
+ // If display adjustment is enabled, always assume there was a change in
+ // the adjustment settings.
+ return displayAdjustmentsEnabled;
}
private void updateTouchExplorationLocked(UserState userState) {
@@ -1657,6 +1506,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
return false;
}
+ private void updateDisplayColorAdjustmentSettingsLocked(UserState userState) {
+ DisplayAdjustmentUtils.applyAdjustments(mContext, userState.mUserId);
+ }
+
@Override
public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
mSecurityPolicy.enforceCallingPermission(Manifest.permission.DUMP, FUNCTION_DUMP);
@@ -1696,56 +1549,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
}
- /**
- * Sets the surface flinger's Daltonization mode. This adjusts the color
- * space to correct for or simulate various types of color blindness.
- *
- * @param mode new Daltonization mode
- */
- private static void nativeSetDaltonizerMode(int mode) {
- try {
- final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
- if (flinger != null) {
- final Parcel data = Parcel.obtain();
- data.writeInterfaceToken("android.ui.ISurfaceComposer");
- data.writeInt(mode);
- flinger.transact(1014, data, null, 0);
- data.recycle();
- }
- } catch (RemoteException ex) {
- Slog.e(LOG_TAG, "Failed to set Daltonizer mode", ex);
- }
- }
-
- /**
- * Sets the surface flinger's color transformation as a 4x4 matrix. If the
- * matrix is null, color transformations are disabled.
- *
- * @param m the float array that holds the transformation matrix, or null to
- * disable transformation
- */
- private static void nativeSetColorTransform(float[] m) {
- try {
- final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
- if (flinger != null) {
- final Parcel data = Parcel.obtain();
- data.writeInterfaceToken("android.ui.ISurfaceComposer");
- if (m != null) {
- data.writeInt(1);
- for (int i = 0; i < 16; i++) {
- data.writeFloat(m[i]);
- }
- } else {
- data.writeInt(0);
- }
- flinger.transact(1015, data, null, 0);
- data.recycle();
- }
- } catch (RemoteException ex) {
- Slog.e(LOG_TAG, "Failed to set color transform", ex);
- }
- }
-
private class AccessibilityConnectionWrapper implements DeathRecipient {
private final int mWindowId;
private final int mUserId;
diff --git a/services/java/com/android/server/accessibility/DisplayAdjustmentUtils.java b/services/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
new file mode 100644
index 0000000..52bdeda
--- /dev/null
+++ b/services/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.accessibility;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.opengl.Matrix;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.util.Slog;
+import android.view.accessibility.AccessibilityManager;
+
+/**
+ * Utility methods for performing accessibility display adjustments.
+ */
+class DisplayAdjustmentUtils {
+ private static final String LOG_TAG = DisplayAdjustmentUtils.class.getSimpleName();
+
+ /** Matrix and offset used for converting color to gray-scale. */
+ private static final float[] GRAYSCALE_MATRIX = new float[] {
+ .2126f, .2126f, .2126f, 0,
+ .7152f, .7152f, .7152f, 0,
+ .0722f, .0722f, .0722f, 0,
+ 0, 0, 0, 1
+ };
+
+ /** Matrix and offset used for standard display inversion. */
+ private static final float[] INVERSION_MATRIX_STANDARD = new float[] {
+ -1, 0, 0, 0,
+ 0, -1, 0, 0,
+ 0, 0, -1, 0,
+ 1, 1, 1, 1
+ };
+
+ /** Matrix and offset used for hue-only display inversion. */
+ private static final float[] INVERSION_MATRIX_HUE_ONLY = new float[] {
+ 0, .5f, .5f, 0,
+ .5f, 0, .5f, 0,
+ .5f, .5f, 0, 0,
+ 0, 0, 0, 1
+ };
+
+ /** Matrix and offset used for value-only display inversion. */
+ private static final float[] INVERSION_MATRIX_VALUE_ONLY = new float[] {
+ 0, -.5f, -.5f, 0,
+ -.5f, 0, -.5f, 0,
+ -.5f, -.5f, 0, 0,
+ 1, 1, 1, 1
+ };
+
+ /** Default contrast for display contrast enhancement. */
+ private static final float DEFAULT_DISPLAY_CONTRAST = 2;
+
+ /** Default brightness for display contrast enhancement. */
+ private static final float DEFAULT_DISPLAY_BRIGHTNESS = 0;
+
+ /** Default inversion mode for display color inversion. */
+ private static final int DEFAULT_DISPLAY_INVERSION = AccessibilityManager.INVERSION_STANDARD;
+
+ /** Default inversion mode for display color correction. */
+ private static final int DEFAULT_DISPLAY_DALTONIZER =
+ AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY;
+
+ /**
+ * Returns whether the specified user with has any display color
+ * adjustments.
+ */
+ public static boolean hasAdjustments(Context context, int userId) {
+ final ContentResolver cr = context.getContentResolver();
+
+ boolean hasColorTransform = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) == 1;
+
+ if (!hasColorTransform) {
+ hasColorTransform |= Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED, 0, userId) == 1;
+ }
+
+ if (!hasColorTransform) {
+ hasColorTransform |= Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) == 1;
+ }
+
+ return hasColorTransform;
+ }
+
+ /**
+ * Applies the specified user's display color adjustments.
+ */
+ public static void applyAdjustments(Context context, int userId) {
+ final ContentResolver cr = context.getContentResolver();
+ float[] colorMatrix = new float[16];
+ float[] outputMatrix = new float[16];
+ boolean hasColorTransform = false;
+
+ Matrix.setIdentityM(colorMatrix, 0);
+
+ final boolean inversionEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) == 1;
+ if (inversionEnabled) {
+ final int inversionMode = Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION, DEFAULT_DISPLAY_INVERSION,
+ userId);
+ final float[] inversionMatrix;
+ switch (inversionMode) {
+ case AccessibilityManager.INVERSION_HUE_ONLY:
+ inversionMatrix = INVERSION_MATRIX_HUE_ONLY;
+ break;
+ case AccessibilityManager.INVERSION_VALUE_ONLY:
+ inversionMatrix = INVERSION_MATRIX_VALUE_ONLY;
+ break;
+ default:
+ inversionMatrix = INVERSION_MATRIX_STANDARD;
+ }
+
+ Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, inversionMatrix, 0);
+
+ colorMatrix = outputMatrix;
+ outputMatrix = colorMatrix;
+
+ hasColorTransform = true;
+ }
+
+ final boolean contrastEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED, 0, userId) == 1;
+ if (contrastEnabled) {
+ final float contrast = Settings.Secure.getFloatForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST, DEFAULT_DISPLAY_CONTRAST,
+ userId);
+ final float brightness = Settings.Secure.getFloatForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY_BRIGHTNESS,
+ userId);
+ final float off = brightness * contrast - 0.5f * contrast + 0.5f;
+ final float[] contrastMatrix = {
+ contrast, 0, 0, 0,
+ 0, contrast, 0, 0,
+ 0, 0, contrast, 0,
+ off, off, off, 1
+ };
+
+ Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, contrastMatrix, 0);
+
+ colorMatrix = outputMatrix;
+ outputMatrix = colorMatrix;
+
+ hasColorTransform = true;
+ }
+
+ final boolean daltonizerEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0;
+ if (daltonizerEnabled) {
+ final int daltonizerMode = Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER,
+ userId);
+ // Monochromacy isn't supported by the native Daltonizer.
+ if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) {
+ Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, GRAYSCALE_MATRIX, 0);
+
+ final float[] temp = colorMatrix;
+ colorMatrix = outputMatrix;
+ outputMatrix = temp;
+
+ hasColorTransform = true;
+ nativeSetDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
+ } else {
+ nativeSetDaltonizerMode(daltonizerMode);
+ }
+ } else {
+ nativeSetDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
+ }
+
+ if (hasColorTransform) {
+ nativeSetColorTransform(colorMatrix);
+ } else {
+ nativeSetColorTransform(null);
+ }
+ }
+
+ /**
+ * Sets the surface flinger's Daltonization mode. This adjusts the color
+ * space to correct for or simulate various types of color blindness.
+ *
+ * @param mode new Daltonization mode
+ */
+ private static void nativeSetDaltonizerMode(int mode) {
+ try {
+ final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
+ if (flinger != null) {
+ final Parcel data = Parcel.obtain();
+ data.writeInterfaceToken("android.ui.ISurfaceComposer");
+ data.writeInt(mode);
+ flinger.transact(1014, data, null, 0);
+ data.recycle();
+ }
+ } catch (RemoteException ex) {
+ Slog.e(LOG_TAG, "Failed to set Daltonizer mode", ex);
+ }
+ }
+
+ /**
+ * Sets the surface flinger's color transformation as a 4x4 matrix. If the
+ * matrix is null, color transformations are disabled.
+ *
+ * @param m the float array that holds the transformation matrix, or null to
+ * disable transformation
+ */
+ private static void nativeSetColorTransform(float[] m) {
+ try {
+ final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
+ if (flinger != null) {
+ final Parcel data = Parcel.obtain();
+ data.writeInterfaceToken("android.ui.ISurfaceComposer");
+ if (m != null) {
+ data.writeInt(1);
+ for (int i = 0; i < 16; i++) {
+ data.writeFloat(m[i]);
+ }
+ } else {
+ data.writeInt(0);
+ }
+ flinger.transact(1015, data, null, 0);
+ data.recycle();
+ }
+ } catch (RemoteException ex) {
+ Slog.e(LOG_TAG, "Failed to set color transform", ex);
+ }
+ }
+
+}