OSDN Git Service

Switch to Saturated color mode when Accessibility transforms are active
authorDaniel Solomon <solomondaniel@google.com>
Sat, 31 Mar 2018 01:36:37 +0000 (18:36 -0700)
committerDaniel Solomon <solomondaniel@google.com>
Mon, 2 Apr 2018 21:54:40 +0000 (14:54 -0700)
The Accessibility settings for color inversion and color correction are
incompatible with some color modes. When either of these settings is
toggled, switch to Saturated mode. When both settings are disabled,
revert back to the user's color mode preference.

Bug: 68856024
Test: runtest -c com.android.server.ColorDisplayServiceTest
frameworks-services
Change-Id: I497b893f5d0f4bb5dff23bb38cf20d9b6b587050

core/java/com/android/internal/app/ColorDisplayController.java
services/core/java/com/android/server/display/ColorDisplayService.java
services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java

index 278d31a..f1539ee 100644 (file)
@@ -365,6 +365,10 @@ public final class ColorDisplayController {
      * Get the current color mode.
      */
     public int getColorMode() {
+        if (getAccessibilityTransformActivated()) {
+            return COLOR_MODE_SATURATED;
+        }
+
         final int colorMode = System.getIntForUser(mContext.getContentResolver(),
             System.DISPLAY_COLOR_MODE, -1, mUserId);
         if (colorMode < COLOR_MODE_NATURAL || colorMode > COLOR_MODE_SATURATED) {
@@ -416,6 +420,18 @@ public final class ColorDisplayController {
                 R.integer.config_nightDisplayColorTemperatureDefault);
     }
 
+    /**
+     * 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);
@@ -441,6 +457,10 @@ public final class ColorDisplayController {
                 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;
             }
         }
     }
@@ -471,6 +491,12 @@ public final class ColorDisplayController {
                         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);
             }
         }
     }
@@ -531,5 +557,12 @@ public final class ColorDisplayController {
          * @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) {}
     }
 }
index b3d309d..37035c3 100644 (file)
@@ -300,6 +300,11 @@ public final class ColorDisplayService extends SystemService
         dtm.setColorMode(mode, mIsActivated ? mMatrixNight : MATRIX_IDENTITY);
     }
 
+    @Override
+    public void onAccessibilityTransformChanged(boolean state) {
+        onDisplayColorModeChanged(mController.getColorMode());
+    }
+
     /**
      * Set coefficients based on native mode. Use DisplayTransformManager#isNativeModeEnabled while
      * setting is stable; when setting is changing, pass native mode selection directly.
index 46b364c..43701e9 100644 (file)
@@ -25,6 +25,7 @@ import android.os.Handler;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.provider.Settings.Secure;
+import android.provider.Settings.System;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.runner.AndroidJUnit4;
 import android.test.mock.MockContentResolver;
@@ -895,6 +896,52 @@ public class ColorDisplayServiceTest {
         assertActivated(true /* activated */);
     }
 
+    @Test
+    public void accessibility_colorInversion_transformActivated() {
+        setAccessibilityColorInversion(true);
+        setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+
+        startService();
+        assertAccessibilityTransformActivated(true /* activated */ );
+        assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+        assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
+    }
+
+    @Test
+    public void accessibility_colorCorrection_transformActivated() {
+        setAccessibilityColorCorrection(true);
+        setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+
+        startService();
+        assertAccessibilityTransformActivated(true /* activated */ );
+        assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+        assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
+    }
+
+    @Test
+    public void accessibility_all_transformActivated() {
+        setAccessibilityColorCorrection(true);
+        setAccessibilityColorInversion(true);
+        setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+
+        startService();
+        assertAccessibilityTransformActivated(true /* activated */ );
+        assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+        assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
+    }
+
+    @Test
+    public void accessibility_none_transformActivated() {
+        setAccessibilityColorCorrection(false);
+        setAccessibilityColorInversion(false);
+        setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+
+        startService();
+        assertAccessibilityTransformActivated(false /* activated */ );
+        assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+        assertActiveColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+    }
+
     /**
      * Configures Night display to use a custom schedule.
      *
@@ -935,6 +982,35 @@ public class ColorDisplayServiceTest {
     }
 
     /**
+     * Configures the Accessibility color correction setting state.
+     *
+     * @param state {@code true} if color inversion should be activated
+     */
+    private void setAccessibilityColorCorrection(boolean state) {
+        Secure.putIntForUser(mContext.getContentResolver(),
+                Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, state ? 1 : 0, mUserId);
+    }
+
+    /**
+     * Configures the Accessibility color inversion setting state.
+     *
+     * @param state {@code true} if color inversion should be activated
+     */
+    private void setAccessibilityColorInversion(boolean state) {
+        Secure.putIntForUser(mContext.getContentResolver(),
+                Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, state ? 1 : 0, mUserId);
+    }
+
+    /**
+     * Configures color mode via ColorDisplayController.
+     *
+     * @param mode the color mode to set
+     */
+    private void setColorMode(int mode) {
+        mColorDisplayController.setColorMode(mode);
+    }
+
+    /**
      * Convenience method to start {@link #mColorDisplayService}.
      */
     private void startService() {
@@ -962,6 +1038,41 @@ 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.
+     */
+    private void assertActiveColorMode(int mode) {
+        assertWithMessage("Unexpected color mode setting")
+                .that(mColorDisplayController.getColorMode())
+                .isEqualTo(mode);
+    }
+
+    /**
+     * Convenience method for asserting that the user chosen color mode matches expectation.
+     *
+     * @param mode the expected color mode setting.
+     */
+    private void assertUserColorMode(int mode) {
+        final int actualMode = System.getIntForUser(mContext.getContentResolver(),
+                System.DISPLAY_COLOR_MODE, -1, mUserId);
+        assertWithMessage("Unexpected color mode setting")
+                .that(actualMode)
+                .isEqualTo(mode);
+    }
+
+    /**
      * Convenience for making a {@link LocalTime} instance with an offset relative to now.
      *
      * @param offsetMinutes the offset relative to now (in minutes)