From 60418b4de8513a1692ee82a434ca8201c9a3a8d5 Mon Sep 17 00:00:00 2001 From: Daniel Solomon Date: Sat, 5 Jan 2019 15:56:30 -0800 Subject: [PATCH] Hide display white balance setting depending on color mode Display white balance relies on a linear color transform matrix to work as intended. When the current color mode is COLOR_MODE_SATURATED, this condition is not guaranteed to be satisfied. In this case, hide the display white balance setting. Bug: 116516917 make ROBOTEST_FILTER=DisplayWhiteBalancePreferenceControllerTest RunSettingsRoboTests -j32 Change-Id: I1fe1eb907485766888832db8b9c342339cc80ea7 --- ...splayWhiteBalancePreferenceController.java | 15 +++++++++- ...yWhiteBalancePreferenceControllerTest.java | 30 ++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/display/DisplayWhiteBalancePreferenceController.java b/src/com/android/settings/display/DisplayWhiteBalancePreferenceController.java index f1363a34d1b..dc8636a435f 100644 --- a/src/com/android/settings/display/DisplayWhiteBalancePreferenceController.java +++ b/src/com/android/settings/display/DisplayWhiteBalancePreferenceController.java @@ -17,9 +17,11 @@ import android.content.Context; import android.hardware.display.ColorDisplayManager; import android.os.UserHandle; import android.provider.Settings.Secure; +import com.android.internal.app.ColorDisplayController; import com.android.settings.core.TogglePreferenceController; public class DisplayWhiteBalancePreferenceController extends TogglePreferenceController { + private ColorDisplayController mColorDisplayController; public DisplayWhiteBalancePreferenceController(Context context, String key) { super(context, key); @@ -27,7 +29,11 @@ public class DisplayWhiteBalancePreferenceController extends TogglePreferenceCon @Override public int getAvailabilityStatus() { - return ColorDisplayManager.isDisplayWhiteBalanceAvailable(mContext) ? + // Display white balance is only valid in linear light space. COLOR_MODE_SATURATED implies + // unmanaged color mode, and hence unknown color processing conditions. + return ColorDisplayManager.isDisplayWhiteBalanceAvailable(mContext) && + getColorDisplayController().getColorMode() != + ColorDisplayController.COLOR_MODE_SATURATED ? AVAILABLE : DISABLED_FOR_USER; } @@ -43,4 +49,11 @@ public class DisplayWhiteBalancePreferenceController extends TogglePreferenceCon isChecked ? 1 : 0, UserHandle.USER_CURRENT); return true; } + + ColorDisplayController getColorDisplayController() { + if (mColorDisplayController == null) { + mColorDisplayController = new ColorDisplayController(mContext); + } + return mColorDisplayController; + } } diff --git a/tests/robotests/src/com/android/settings/display/DisplayWhiteBalancePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/DisplayWhiteBalancePreferenceControllerTest.java index 0ce72fb585c..de560373be6 100644 --- a/tests/robotests/src/com/android/settings/display/DisplayWhiteBalancePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/DisplayWhiteBalancePreferenceControllerTest.java @@ -1,15 +1,21 @@ package com.android.settings.display; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.provider.Settings; import android.provider.Settings.Secure; +import com.android.internal.app.ColorDisplayController; import com.android.settings.testutils.shadow.SettingsShadowResources; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -23,6 +29,9 @@ public class DisplayWhiteBalancePreferenceControllerTest { private Context mContext; private DisplayWhiteBalancePreferenceController mController; + @Mock + private ColorDisplayController mColorDisplayController; + @After public void tearDown() { SettingsShadowResources.reset(); @@ -30,14 +39,19 @@ public class DisplayWhiteBalancePreferenceControllerTest { @Before public void setUp() { + MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mController = new DisplayWhiteBalancePreferenceController(mContext, "display_white_balance"); + mController = spy(new DisplayWhiteBalancePreferenceController(mContext, + "display_white_balance")); + doReturn(mColorDisplayController).when(mController).getColorDisplayController(); } @Test public void isAvailable_configuredAvailable() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_displayWhiteBalanceAvailable, true); + when(mColorDisplayController.getColorMode()) + .thenReturn(ColorDisplayController.COLOR_MODE_NATURAL); assertThat(mController.isAvailable()).isTrue(); } @@ -45,6 +59,20 @@ public class DisplayWhiteBalancePreferenceControllerTest { public void isAvailable_configuredUnavailable() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_displayWhiteBalanceAvailable, false); + when(mColorDisplayController.getColorMode()) + .thenReturn(ColorDisplayController.COLOR_MODE_SATURATED); + assertThat(mController.isAvailable()).isFalse(); + + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_displayWhiteBalanceAvailable, false); + when(mColorDisplayController.getColorMode()) + .thenReturn(ColorDisplayController.COLOR_MODE_NATURAL); + assertThat(mController.isAvailable()).isFalse(); + + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_displayWhiteBalanceAvailable, true); + when(mColorDisplayController.getColorMode()) + .thenReturn(ColorDisplayController.COLOR_MODE_SATURATED); assertThat(mController.isAvailable()).isFalse(); }