Loading core/java/com/android/internal/app/ColorDisplayController.java +33 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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); Loading @@ -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; } } } Loading Loading @@ -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); } } } Loading Loading @@ -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) {} } } services/core/java/com/android/server/display/ColorDisplayService.java +5 −0 Original line number Diff line number Diff line Loading @@ -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. Loading services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java +111 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. * Loading Loading @@ -934,6 +981,35 @@ public class ColorDisplayServiceTest { 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}. */ Loading Loading @@ -961,6 +1037,41 @@ public class ColorDisplayServiceTest { .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. * Loading Loading
core/java/com/android/internal/app/ColorDisplayController.java +33 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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); Loading @@ -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; } } } Loading Loading @@ -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); } } } Loading Loading @@ -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) {} } }
services/core/java/com/android/server/display/ColorDisplayService.java +5 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java +111 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. * Loading Loading @@ -934,6 +981,35 @@ public class ColorDisplayServiceTest { 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}. */ Loading Loading @@ -961,6 +1037,41 @@ public class ColorDisplayServiceTest { .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. * Loading