Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 317a3574 authored by Daniel Solomon's avatar Daniel Solomon
Browse files

Switch to Saturated color mode when Accessibility transforms are active

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
parent 54419ca2
Loading
Loading
Loading
Loading
+33 −0
Original line number Original line Diff line number Diff line
@@ -365,6 +365,10 @@ public final class ColorDisplayController {
     * Get the current color mode.
     * Get the current color mode.
     */
     */
    public int getColorMode() {
    public int getColorMode() {
        if (getAccessibilityTransformActivated()) {
            return COLOR_MODE_SATURATED;
        }

        final int colorMode = System.getIntForUser(mContext.getContentResolver(),
        final int colorMode = System.getIntForUser(mContext.getContentResolver(),
            System.DISPLAY_COLOR_MODE, -1, mUserId);
            System.DISPLAY_COLOR_MODE, -1, mUserId);
        if (colorMode < COLOR_MODE_NATURAL || colorMode > COLOR_MODE_SATURATED) {
        if (colorMode < COLOR_MODE_NATURAL || colorMode > COLOR_MODE_SATURATED) {
@@ -416,6 +420,18 @@ public final class ColorDisplayController {
                R.integer.config_nightDisplayColorTemperatureDefault);
                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) {
    private void onSettingChanged(@NonNull String setting) {
        if (DEBUG) {
        if (DEBUG) {
            Slog.d(TAG, "onSettingChanged: " + setting);
            Slog.d(TAG, "onSettingChanged: " + setting);
@@ -441,6 +457,10 @@ public final class ColorDisplayController {
                case System.DISPLAY_COLOR_MODE:
                case System.DISPLAY_COLOR_MODE:
                    mCallback.onDisplayColorModeChanged(getColorMode());
                    mCallback.onDisplayColorModeChanged(getColorMode());
                    break;
                    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);
                        false /* notifyForDescendants */, mContentObserver, mUserId);
                cr.registerContentObserver(System.getUriFor(System.DISPLAY_COLOR_MODE),
                cr.registerContentObserver(System.getUriFor(System.DISPLAY_COLOR_MODE),
                        false /* notifyForDecendants */, mContentObserver, mUserId);
                        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
         * @param displayColorMode the color mode
         */
         */
        default void onDisplayColorModeChanged(int displayColorMode) {}
        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) {}
    }
    }
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -300,6 +300,11 @@ public final class ColorDisplayService extends SystemService
        dtm.setColorMode(mode, mIsActivated ? mMatrixNight : MATRIX_IDENTITY);
        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
     * Set coefficients based on native mode. Use DisplayTransformManager#isNativeModeEnabled while
     * setting is stable; when setting is changing, pass native mode selection directly.
     * setting is stable; when setting is changing, pass native mode selection directly.
+111 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.Handler;
import android.os.UserHandle;
import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Settings;
import android.provider.Settings.Secure;
import android.provider.Settings.Secure;
import android.provider.Settings.System;
import android.support.test.InstrumentationRegistry;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
import android.test.mock.MockContentResolver;
@@ -895,6 +896,52 @@ public class ColorDisplayServiceTest {
        assertActivated(true /* activated */);
        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.
     * Configures Night display to use a custom schedule.
     *
     *
@@ -934,6 +981,35 @@ public class ColorDisplayServiceTest {
                mUserId);
                mUserId);
    }
    }


    /**
     * 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}.
     * Convenience method to start {@link #mColorDisplayService}.
     */
     */
@@ -961,6 +1037,41 @@ public class ColorDisplayServiceTest {
                .isEqualTo(activated);
                .isEqualTo(activated);
    }
    }


    /**
     * 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.
     * Convenience for making a {@link LocalTime} instance with an offset relative to now.
     *
     *