Loading core/java/android/provider/Settings.java +0 −10 Original line number Diff line number Diff line Loading @@ -5294,15 +5294,6 @@ public final class Settings { public static final String ACCESSIBILITY_DISPLAY_DALTONIZER = "accessibility_display_daltonizer"; /** * Float list that specifies the color matrix to apply to * the display. Valid values are defined in AccessibilityManager. * * @hide */ public static final String ACCESSIBILITY_DISPLAY_COLOR_MATRIX = "accessibility_display_color_matrix"; /** * Setting that specifies whether automatic click when the mouse pointer stops moving is * enabled. Loading Loading @@ -6334,7 +6325,6 @@ public final class Settings { USB_MASS_STORAGE_ENABLED, // moved to global ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, ACCESSIBILITY_DISPLAY_DALTONIZER, ACCESSIBILITY_DISPLAY_COLOR_MATRIX, ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +0 −1 Original line number Diff line number Diff line Loading @@ -247,7 +247,6 @@ public class SettingsHelper { return Settings.Secure.getInt(mContext.getContentResolver(), name, 0) != 0; case Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES: case Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES: case Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX: case Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER: case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE: return !TextUtils.isEmpty(Settings.Secure.getString( Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +12 −29 Original line number Diff line number Diff line Loading @@ -1422,7 +1422,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { updateTouchExplorationLocked(userState); updatePerformGesturesLocked(userState); updateEnhancedWebAccessibilityLocked(userState); updateDisplayColorAdjustmentSettingsLocked(userState); updateDisplayDaltonizerLocked(userState); updateDisplayInversionLocked(userState); updateMagnificationLocked(userState); updateSoftKeyboardShowModeLocked(userState); scheduleUpdateInputFilter(userState); Loading Loading @@ -1539,7 +1540,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { somethingChanged |= readEnhancedWebAccessibilityEnabledChangedLocked(userState); somethingChanged |= readDisplayMagnificationEnabledSettingLocked(userState); somethingChanged |= readAutoclickEnabledSettingLocked(userState); somethingChanged |= readDisplayColorAdjustmentSettingsLocked(userState); return somethingChanged; } Loading Loading @@ -1602,18 +1602,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } private boolean readDisplayColorAdjustmentSettingsLocked(UserState userState) { final boolean displayAdjustmentsEnabled = DisplayAdjustmentUtils.hasAdjustments(mContext, userState.mUserId); if (displayAdjustmentsEnabled != userState.mHasDisplayColorAdjustment) { userState.mHasDisplayColorAdjustment = displayAdjustmentsEnabled; return true; } // If display adjustment is enabled, always assume there was a change in // the adjustment settings. return displayAdjustmentsEnabled; } private boolean readHighTextContrastEnabledSettingLocked(UserState userState) { final boolean highTextContrastEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), Loading Loading @@ -1730,8 +1718,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } private void updateDisplayColorAdjustmentSettingsLocked(UserState userState) { DisplayAdjustmentUtils.applyAdjustments(mContext, userState.mUserId); private void updateDisplayDaltonizerLocked(UserState userState) { DisplayAdjustmentUtils.applyDaltonizerSetting(mContext, userState.mUserId); } private void updateDisplayInversionLocked(UserState userState) { DisplayAdjustmentUtils.applyInversionSetting(mContext, userState.mUserId); } private void updateMagnificationLocked(UserState userState) { Loading Loading @@ -4184,7 +4176,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { public boolean mIsAutoclickEnabled; public boolean mIsPerformGesturesEnabled; public boolean mIsFilterKeyEventsEnabled; public boolean mHasDisplayColorAdjustment; public boolean mAccessibilityFocusOnlyInActiveWindow; private Service mUiAutomationService; Loading Loading @@ -4300,9 +4291,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private final Uri mDisplayDaltonizerUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER); private final Uri mDisplayColorMatrixUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX); private final Uri mHighTextContrastUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED); Loading Loading @@ -4333,8 +4321,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mDisplayDaltonizerEnabledUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mDisplayDaltonizerUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mDisplayColorMatrixUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mHighTextContrastUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( Loading Loading @@ -4377,14 +4363,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (readEnhancedWebAccessibilityEnabledChangedLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mDisplayInversionEnabledUri.equals(uri) || mDisplayDaltonizerEnabledUri.equals(uri) } else if (mDisplayDaltonizerEnabledUri.equals(uri) || mDisplayDaltonizerUri.equals(uri)) { if (readDisplayColorAdjustmentSettingsLocked(userState)) { updateDisplayColorAdjustmentSettingsLocked(userState); } } else if (mDisplayColorMatrixUri.equals(uri)) { updateDisplayColorAdjustmentSettingsLocked(userState); updateDisplayDaltonizerLocked(userState); } else if (mDisplayInversionEnabledUri.equals(uri)) { updateDisplayInversionLocked(userState); } else if (mHighTextContrastUri.equals(uri)) { if (readHighTextContrastEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); Loading services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java +30 −136 Original line number Diff line number Diff line Loading @@ -18,23 +18,23 @@ 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.provider.Settings.Secure; import android.view.accessibility.AccessibilityManager; import com.android.server.LocalServices; import com.android.server.display.DisplayTransformManager; /** * Utility methods for performing accessibility display adjustments. */ class DisplayAdjustmentUtils { private static final String LOG_TAG = DisplayAdjustmentUtils.class.getSimpleName(); /** Default inversion mode for display color correction. */ private static final int DEFAULT_DISPLAY_DALTONIZER = AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY; /** Matrix and offset used for converting color to gray-scale. */ private static final float[] GRAYSCALE_MATRIX = new float[] { private static final float[] MATRIX_GRAYSCALE = new float[] { .2126f, .2126f, .2126f, 0, .7152f, .7152f, .7152f, 0, .0722f, .0722f, .0722f, 0, Loading @@ -48,150 +48,44 @@ class DisplayAdjustmentUtils { * represents a non-multiplied addition, see surfaceflinger's ProgramCache * for full implementation details. */ private static final float[] INVERSION_MATRIX_VALUE_ONLY = new float[] { private static final float[] MATRIX_INVERT_COLOR = new float[] { 0.402f, -0.598f, -0.599f, 0, -1.174f, -0.174f, -1.175f, 0, -0.228f, -0.228f, 0.772f, 0, 1, 1, 1, 1 }; /** 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) { public static void applyDaltonizerSetting(Context context, int userId) { final ContentResolver cr = context.getContentResolver(); final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class); if (Settings.Secure.getIntForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0) { return true; int daltonizerMode = AccessibilityManager.DALTONIZER_DISABLED; if (Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) { daltonizerMode = Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER, userId); } if (Settings.Secure.getIntForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) { return true; float[] grayscaleMatrix = null; if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) { // Monochromacy isn't supported by the native Daltonizer. grayscaleMatrix = MATRIX_GRAYSCALE; daltonizerMode = AccessibilityManager.DALTONIZER_DISABLED; } return false; dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_GRAYSCALE, grayscaleMatrix); dtm.setDaltonizerMode(daltonizerMode); } /** * Applies the specified user's display color adjustments. */ public static void applyAdjustments(Context context, int userId) { public static void applyInversionSetting(Context context, int userId) { final ContentResolver cr = context.getContentResolver(); float[] colorMatrix = null; if (Settings.Secure.getIntForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0) { colorMatrix = multiply(colorMatrix, INVERSION_MATRIX_VALUE_ONLY); } if (Settings.Secure.getIntForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) { 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) { colorMatrix = multiply(colorMatrix, GRAYSCALE_MATRIX); setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED); } else { setDaltonizerMode(daltonizerMode); } } else { setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED); } String matrix = Settings.Secure.getStringForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX, userId); if (matrix != null) { final float[] userMatrix = get4x4Matrix(matrix); if (userMatrix != null) { colorMatrix = multiply(colorMatrix, userMatrix); } } final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class); setColorTransform(colorMatrix); final boolean invertColors = Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0; dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_INVERT_COLOR, invertColors ? MATRIX_INVERT_COLOR : null); } private static float[] get4x4Matrix(String matrix) { String[] strValues = matrix.split(","); if (strValues.length != 16) { return null; } float[] values = new float[strValues.length]; try { for (int i = 0; i < values.length; i++) { values[i] = Float.parseFloat(strValues[i]); } } catch (java.lang.NumberFormatException ex) { return null; } return values; } private static float[] multiply(float[] matrix, float[] other) { if (matrix == null) { return other; } float[] result = new float[16]; Matrix.multiplyMM(result, 0, matrix, 0, other, 0); return result; } /** * 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 setDaltonizerMode(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 setColorTransform(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); } } } services/core/java/com/android/server/display/DisplayManagerService.java +1 −0 Original line number Diff line number Diff line Loading @@ -244,6 +244,7 @@ public final class DisplayManagerService extends SystemService { publishBinderService(Context.DISPLAY_SERVICE, new BinderService(), true /*allowIsolated*/); publishLocalService(DisplayManagerInternal.class, new LocalService()); publishLocalService(DisplayTransformManager.class, new DisplayTransformManager()); } @Override Loading Loading
core/java/android/provider/Settings.java +0 −10 Original line number Diff line number Diff line Loading @@ -5294,15 +5294,6 @@ public final class Settings { public static final String ACCESSIBILITY_DISPLAY_DALTONIZER = "accessibility_display_daltonizer"; /** * Float list that specifies the color matrix to apply to * the display. Valid values are defined in AccessibilityManager. * * @hide */ public static final String ACCESSIBILITY_DISPLAY_COLOR_MATRIX = "accessibility_display_color_matrix"; /** * Setting that specifies whether automatic click when the mouse pointer stops moving is * enabled. Loading Loading @@ -6334,7 +6325,6 @@ public final class Settings { USB_MASS_STORAGE_ENABLED, // moved to global ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, ACCESSIBILITY_DISPLAY_DALTONIZER, ACCESSIBILITY_DISPLAY_COLOR_MATRIX, ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +0 −1 Original line number Diff line number Diff line Loading @@ -247,7 +247,6 @@ public class SettingsHelper { return Settings.Secure.getInt(mContext.getContentResolver(), name, 0) != 0; case Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES: case Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES: case Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX: case Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER: case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE: return !TextUtils.isEmpty(Settings.Secure.getString( Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +12 −29 Original line number Diff line number Diff line Loading @@ -1422,7 +1422,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { updateTouchExplorationLocked(userState); updatePerformGesturesLocked(userState); updateEnhancedWebAccessibilityLocked(userState); updateDisplayColorAdjustmentSettingsLocked(userState); updateDisplayDaltonizerLocked(userState); updateDisplayInversionLocked(userState); updateMagnificationLocked(userState); updateSoftKeyboardShowModeLocked(userState); scheduleUpdateInputFilter(userState); Loading Loading @@ -1539,7 +1540,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { somethingChanged |= readEnhancedWebAccessibilityEnabledChangedLocked(userState); somethingChanged |= readDisplayMagnificationEnabledSettingLocked(userState); somethingChanged |= readAutoclickEnabledSettingLocked(userState); somethingChanged |= readDisplayColorAdjustmentSettingsLocked(userState); return somethingChanged; } Loading Loading @@ -1602,18 +1602,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } private boolean readDisplayColorAdjustmentSettingsLocked(UserState userState) { final boolean displayAdjustmentsEnabled = DisplayAdjustmentUtils.hasAdjustments(mContext, userState.mUserId); if (displayAdjustmentsEnabled != userState.mHasDisplayColorAdjustment) { userState.mHasDisplayColorAdjustment = displayAdjustmentsEnabled; return true; } // If display adjustment is enabled, always assume there was a change in // the adjustment settings. return displayAdjustmentsEnabled; } private boolean readHighTextContrastEnabledSettingLocked(UserState userState) { final boolean highTextContrastEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), Loading Loading @@ -1730,8 +1718,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } private void updateDisplayColorAdjustmentSettingsLocked(UserState userState) { DisplayAdjustmentUtils.applyAdjustments(mContext, userState.mUserId); private void updateDisplayDaltonizerLocked(UserState userState) { DisplayAdjustmentUtils.applyDaltonizerSetting(mContext, userState.mUserId); } private void updateDisplayInversionLocked(UserState userState) { DisplayAdjustmentUtils.applyInversionSetting(mContext, userState.mUserId); } private void updateMagnificationLocked(UserState userState) { Loading Loading @@ -4184,7 +4176,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { public boolean mIsAutoclickEnabled; public boolean mIsPerformGesturesEnabled; public boolean mIsFilterKeyEventsEnabled; public boolean mHasDisplayColorAdjustment; public boolean mAccessibilityFocusOnlyInActiveWindow; private Service mUiAutomationService; Loading Loading @@ -4300,9 +4291,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private final Uri mDisplayDaltonizerUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER); private final Uri mDisplayColorMatrixUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX); private final Uri mHighTextContrastUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED); Loading Loading @@ -4333,8 +4321,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mDisplayDaltonizerEnabledUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mDisplayDaltonizerUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mDisplayColorMatrixUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mHighTextContrastUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( Loading Loading @@ -4377,14 +4363,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (readEnhancedWebAccessibilityEnabledChangedLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mDisplayInversionEnabledUri.equals(uri) || mDisplayDaltonizerEnabledUri.equals(uri) } else if (mDisplayDaltonizerEnabledUri.equals(uri) || mDisplayDaltonizerUri.equals(uri)) { if (readDisplayColorAdjustmentSettingsLocked(userState)) { updateDisplayColorAdjustmentSettingsLocked(userState); } } else if (mDisplayColorMatrixUri.equals(uri)) { updateDisplayColorAdjustmentSettingsLocked(userState); updateDisplayDaltonizerLocked(userState); } else if (mDisplayInversionEnabledUri.equals(uri)) { updateDisplayInversionLocked(userState); } else if (mHighTextContrastUri.equals(uri)) { if (readHighTextContrastEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); Loading
services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java +30 −136 Original line number Diff line number Diff line Loading @@ -18,23 +18,23 @@ 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.provider.Settings.Secure; import android.view.accessibility.AccessibilityManager; import com.android.server.LocalServices; import com.android.server.display.DisplayTransformManager; /** * Utility methods for performing accessibility display adjustments. */ class DisplayAdjustmentUtils { private static final String LOG_TAG = DisplayAdjustmentUtils.class.getSimpleName(); /** Default inversion mode for display color correction. */ private static final int DEFAULT_DISPLAY_DALTONIZER = AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY; /** Matrix and offset used for converting color to gray-scale. */ private static final float[] GRAYSCALE_MATRIX = new float[] { private static final float[] MATRIX_GRAYSCALE = new float[] { .2126f, .2126f, .2126f, 0, .7152f, .7152f, .7152f, 0, .0722f, .0722f, .0722f, 0, Loading @@ -48,150 +48,44 @@ class DisplayAdjustmentUtils { * represents a non-multiplied addition, see surfaceflinger's ProgramCache * for full implementation details. */ private static final float[] INVERSION_MATRIX_VALUE_ONLY = new float[] { private static final float[] MATRIX_INVERT_COLOR = new float[] { 0.402f, -0.598f, -0.599f, 0, -1.174f, -0.174f, -1.175f, 0, -0.228f, -0.228f, 0.772f, 0, 1, 1, 1, 1 }; /** 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) { public static void applyDaltonizerSetting(Context context, int userId) { final ContentResolver cr = context.getContentResolver(); final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class); if (Settings.Secure.getIntForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0) { return true; int daltonizerMode = AccessibilityManager.DALTONIZER_DISABLED; if (Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) { daltonizerMode = Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER, userId); } if (Settings.Secure.getIntForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) { return true; float[] grayscaleMatrix = null; if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) { // Monochromacy isn't supported by the native Daltonizer. grayscaleMatrix = MATRIX_GRAYSCALE; daltonizerMode = AccessibilityManager.DALTONIZER_DISABLED; } return false; dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_GRAYSCALE, grayscaleMatrix); dtm.setDaltonizerMode(daltonizerMode); } /** * Applies the specified user's display color adjustments. */ public static void applyAdjustments(Context context, int userId) { public static void applyInversionSetting(Context context, int userId) { final ContentResolver cr = context.getContentResolver(); float[] colorMatrix = null; if (Settings.Secure.getIntForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0) { colorMatrix = multiply(colorMatrix, INVERSION_MATRIX_VALUE_ONLY); } if (Settings.Secure.getIntForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) { 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) { colorMatrix = multiply(colorMatrix, GRAYSCALE_MATRIX); setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED); } else { setDaltonizerMode(daltonizerMode); } } else { setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED); } String matrix = Settings.Secure.getStringForUser(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX, userId); if (matrix != null) { final float[] userMatrix = get4x4Matrix(matrix); if (userMatrix != null) { colorMatrix = multiply(colorMatrix, userMatrix); } } final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class); setColorTransform(colorMatrix); final boolean invertColors = Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0; dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_INVERT_COLOR, invertColors ? MATRIX_INVERT_COLOR : null); } private static float[] get4x4Matrix(String matrix) { String[] strValues = matrix.split(","); if (strValues.length != 16) { return null; } float[] values = new float[strValues.length]; try { for (int i = 0; i < values.length; i++) { values[i] = Float.parseFloat(strValues[i]); } } catch (java.lang.NumberFormatException ex) { return null; } return values; } private static float[] multiply(float[] matrix, float[] other) { if (matrix == null) { return other; } float[] result = new float[16]; Matrix.multiplyMM(result, 0, matrix, 0, other, 0); return result; } /** * 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 setDaltonizerMode(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 setColorTransform(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); } } }
services/core/java/com/android/server/display/DisplayManagerService.java +1 −0 Original line number Diff line number Diff line Loading @@ -244,6 +244,7 @@ public final class DisplayManagerService extends SystemService { publishBinderService(Context.DISPLAY_SERVICE, new BinderService(), true /*allowIsolated*/); publishLocalService(DisplayManagerInternal.class, new LocalService()); publishLocalService(DisplayTransformManager.class, new DisplayTransformManager()); } @Override Loading