Loading res/values/config.xml +20 −0 Original line number Diff line number Diff line Loading @@ -530,4 +530,24 @@ <!-- Whether to show Smart Storage toggle --> <bool name="config_show_smart_storage_toggle">true</bool> <!-- Display settings screen, Color mode options. Must be the same length and order as config_color_mode_options_values below. Only the values that also appear in frameworks/base/core/res/res/values/config.xml's config_availableColorModes are shown. --> <string-array name="config_color_mode_options_strings" translatable="false"> <item>@string/color_mode_option_natural</item> <item>@string/color_mode_option_boosted</item> <item>@string/color_mode_option_saturated</item> <item>@string/color_mode_option_automatic</item> </string-array> <!-- Display settings screen, Color mode options. Must be the same length and order as config_color_mode_options_strings above. Only the values that also appear in frameworks/base/core/res/res/values/config.xml's config_availableColorModes are shown. --> <integer-array name="config_color_mode_options_values" translatable="false"> <item>0</item> <item>1</item> <item>2</item> <item>3</item> </integer-array> </resources> src/com/android/settings/display/ColorModePreferenceController.java +3 −19 Original line number Diff line number Diff line Loading @@ -18,13 +18,10 @@ import android.hardware.display.ColorDisplayManager; import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; public class ColorModePreferenceController extends BasePreferenceController { private ColorDisplayManager mColorDisplayManager; public ColorModePreferenceController(Context context, String key) { super(context, key); } Loading @@ -39,24 +36,11 @@ public class ColorModePreferenceController extends BasePreferenceController { @Override public CharSequence getSummary() { final int colorMode = getColorDisplayManager().getColorMode(); if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) { return mContext.getText(R.string.color_mode_option_automatic); } if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) { return mContext.getText(R.string.color_mode_option_saturated); } if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) { return mContext.getText(R.string.color_mode_option_boosted); } return mContext.getText(R.string.color_mode_option_natural); return ColorModeUtils.getColorModeMapping(mContext.getResources()).get(getColorMode()); } @VisibleForTesting ColorDisplayManager getColorDisplayManager() { if (mColorDisplayManager == null) { mColorDisplayManager = mContext.getSystemService(ColorDisplayManager.class); } return mColorDisplayManager; public int getColorMode() { return mContext.getSystemService(ColorDisplayManager.class).getColorMode(); } } src/com/android/settings/display/ColorModePreferenceFragment.java +61 −55 Original line number Diff line number Diff line Loading @@ -13,9 +13,17 @@ */ package com.android.settings.display; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_AUTOMATIC; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_BOOSTED; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_NATURAL; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_SATURATED; import static android.hardware.display.ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MAX; import static android.hardware.display.ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MIN; import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.drawable.Drawable; import android.hardware.display.ColorDisplayManager; Loading @@ -36,28 +44,26 @@ import com.android.settingslib.widget.LayoutPreference; import java.util.ArrayList; import java.util.List; import java.util.Map; @SuppressWarnings("WeakerAccess") @SearchIndexable public class ColorModePreferenceFragment extends RadioButtonPickerFragment { @VisibleForTesting static final String KEY_COLOR_MODE_NATURAL = "color_mode_natural"; @VisibleForTesting static final String KEY_COLOR_MODE_BOOSTED = "color_mode_boosted"; @VisibleForTesting static final String KEY_COLOR_MODE_SATURATED = "color_mode_saturated"; @VisibleForTesting static final String KEY_COLOR_MODE_AUTOMATIC = "color_mode_automatic"; private static final String KEY_COLOR_MODE_PREFIX = "color_mode_"; private static final int COLOR_MODE_FALLBACK = COLOR_MODE_NATURAL; private ContentObserver mContentObserver; private ColorDisplayManager mColorDisplayManager; private Resources mResources; @Override public void onAttach(Context context) { super.onAttach(context); mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); mResources = context.getResources(); final ContentResolver cr = context.getContentResolver(); mContentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { Loading @@ -81,11 +87,11 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment { @Override public void onDetach() { super.onDetach(); if (mContentObserver != null) { getContext().getContentResolver().unregisterContentObserver(mContentObserver); mContentObserver = null; } super.onDetach(); } @Override Loading @@ -108,72 +114,72 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment { @Override protected List<? extends CandidateInfo> getCandidates() { final Context c = getContext(); final int[] availableColorModes = c.getResources().getIntArray( com.android.internal.R.array.config_availableColorModes); List<ColorModeCandidateInfo> candidates = new ArrayList<>(); if (availableColorModes != null) { for (int colorMode : availableColorModes) { if (colorMode == ColorDisplayManager.COLOR_MODE_NATURAL) { candidates.add(new ColorModeCandidateInfo( c.getText(R.string.color_mode_option_natural), KEY_COLOR_MODE_NATURAL, true /* enabled */)); } else if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) { final Map<Integer, String> colorModesToSummaries = ColorModeUtils.getColorModeMapping(mResources); final List<ColorModeCandidateInfo> candidates = new ArrayList<>(); for (int colorMode : mResources.getIntArray( com.android.internal.R.array.config_availableColorModes)) { candidates.add(new ColorModeCandidateInfo( c.getText(R.string.color_mode_option_boosted), KEY_COLOR_MODE_BOOSTED, true /* enabled */)); } else if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) { candidates.add(new ColorModeCandidateInfo( c.getText(R.string.color_mode_option_saturated), KEY_COLOR_MODE_SATURATED, true /* enabled */)); } else if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) { candidates.add(new ColorModeCandidateInfo( c.getText(R.string.color_mode_option_automatic), KEY_COLOR_MODE_AUTOMATIC, true /* enabled */)); } } colorModesToSummaries.get(colorMode), getKeyForColorMode(colorMode), true /* enabled */)); } return candidates; } @Override protected String getDefaultKey() { final int colorMode = mColorDisplayManager.getColorMode(); if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) { return KEY_COLOR_MODE_AUTOMATIC; } else if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) { return KEY_COLOR_MODE_SATURATED; } else if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) { return KEY_COLOR_MODE_BOOSTED; final int colorMode = getColorMode(); if (isValidColorMode(colorMode)) { return getKeyForColorMode(colorMode); } return KEY_COLOR_MODE_NATURAL; return getKeyForColorMode(COLOR_MODE_FALLBACK); } @Override protected boolean setDefaultKey(String key) { switch (key) { case KEY_COLOR_MODE_NATURAL: mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); break; case KEY_COLOR_MODE_BOOSTED: mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED); break; case KEY_COLOR_MODE_SATURATED: mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_SATURATED); break; case KEY_COLOR_MODE_AUTOMATIC: mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC); break; int colorMode = Integer.parseInt(key.substring(key.lastIndexOf("_") + 1)); if (isValidColorMode(colorMode)) { setColorMode(colorMode); } return true; } /** * Wraps ColorDisplayManager#getColorMode for substitution in testing. */ @VisibleForTesting public int getColorMode() { return mColorDisplayManager.getColorMode(); } /** * Wraps ColorDisplayManager#setColorMode for substitution in testing. */ @VisibleForTesting public void setColorMode(int colorMode) { mColorDisplayManager.setColorMode(colorMode); } @Override public int getMetricsCategory() { return SettingsEnums.COLOR_MODE_SETTINGS; } @VisibleForTesting String getKeyForColorMode(int colorMode) { return KEY_COLOR_MODE_PREFIX + colorMode; } private boolean isValidColorMode(int colorMode) { return colorMode == COLOR_MODE_NATURAL || colorMode == COLOR_MODE_BOOSTED || colorMode == COLOR_MODE_SATURATED || colorMode == COLOR_MODE_AUTOMATIC || (colorMode >= VENDOR_COLOR_MODE_RANGE_MIN && colorMode <= VENDOR_COLOR_MODE_RANGE_MAX); } @VisibleForTesting static class ColorModeCandidateInfo extends CandidateInfo { private final CharSequence mLabel; Loading src/com/android/settings/display/ColorModeUtils.java 0 → 100644 +62 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.display; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_AUTOMATIC; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_BOOSTED; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_NATURAL; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_SATURATED; import static android.hardware.display.ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MAX; import static android.hardware.display.ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MIN; import android.content.res.Resources; import android.util.ArrayMap; import com.android.settings.R; import java.util.Map; final class ColorModeUtils { private ColorModeUtils() { // Do not instantiate. } static Map<Integer, String> getColorModeMapping(Resources resources) { final String[] colorModeOptionsStrings = resources.getStringArray( R.array.config_color_mode_options_strings); final int[] colorModeOptionsValues = resources.getIntArray( R.array.config_color_mode_options_values); if (colorModeOptionsStrings.length != colorModeOptionsValues.length) { throw new RuntimeException("Color mode options of unequal length"); } final Map<Integer, String> colorModesToSummaries = new ArrayMap<>(); for (int i = 0; i < colorModeOptionsValues.length; i++) { final int colorMode = colorModeOptionsValues[i]; if (colorMode == COLOR_MODE_NATURAL || colorMode == COLOR_MODE_BOOSTED || colorMode == COLOR_MODE_SATURATED || colorMode == COLOR_MODE_AUTOMATIC || (colorMode >= VENDOR_COLOR_MODE_RANGE_MIN && colorMode <= VENDOR_COLOR_MODE_RANGE_MAX)) { colorModesToSummaries.put(colorMode, colorModeOptionsStrings[i]); } } return colorModesToSummaries; } } tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java→tests/unit/src/com/android/settings/display/ColorModePreferenceControllerTest.java +28 −33 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. Loading @@ -23,80 +23,75 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; import android.hardware.display.ColorDisplayManager; import androidx.preference.Preference; import com.android.settings.R; import androidx.test.annotation.UiThreadTest; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; 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; @RunWith(RobolectricTestRunner.class) @RunWith(AndroidJUnit4.class) public class ColorModePreferenceControllerTest { @Mock private ColorDisplayManager mColorDisplayManager; private Context mContext; private Preference mPreference; private ColorModePreferenceController mController; @Before public void setup() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mController = spy(new ColorModePreferenceController(mContext, "test")); mPreference = new Preference(mContext); doReturn(mColorDisplayManager).when(mController).getColorDisplayManager(); final Context context = spy(ApplicationProvider.getApplicationContext()); mController = spy(new ColorModePreferenceController(context, "test")); mPreference = new Preference(context); final Resources res = spy(context.getResources()); when(res.getIntArray(com.android.internal.R.array.config_availableColorModes)).thenReturn( new int[]{ ColorDisplayManager.COLOR_MODE_NATURAL, ColorDisplayManager.COLOR_MODE_BOOSTED, ColorDisplayManager.COLOR_MODE_SATURATED, ColorDisplayManager.COLOR_MODE_AUTOMATIC }); doReturn(res).when(context).getResources(); } @Test @UiThreadTest public void updateState_colorModeAutomatic_shouldSetSummaryToAutomatic() { when(mColorDisplayManager.getColorMode()) .thenReturn(ColorDisplayManager.COLOR_MODE_AUTOMATIC); doReturn(ColorDisplayManager.COLOR_MODE_AUTOMATIC).when(mController).getColorMode(); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getText(R.string.color_mode_option_automatic)); assertThat(mPreference.getSummary()).isEqualTo("Adaptive"); } @Test @UiThreadTest public void updateState_colorModeSaturated_shouldSetSummaryToSaturated() { when(mColorDisplayManager.getColorMode()) .thenReturn(ColorDisplayManager.COLOR_MODE_SATURATED); doReturn(ColorDisplayManager.COLOR_MODE_SATURATED).when(mController).getColorMode(); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getText(R.string.color_mode_option_saturated)); assertThat(mPreference.getSummary()).isEqualTo("Saturated"); } @Test public void updateState_colorModeBoosted_shouldSetSummaryToBoosted() { when(mColorDisplayManager.getColorMode()) .thenReturn(ColorDisplayManager.COLOR_MODE_BOOSTED); doReturn(ColorDisplayManager.COLOR_MODE_BOOSTED).when(mController).getColorMode(); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getText(R.string.color_mode_option_boosted)); assertThat(mPreference.getSummary()).isEqualTo("Boosted"); } @Test public void updateState_colorModeNatural_shouldSetSummaryToNatural() { when(mColorDisplayManager.getColorMode()) .thenReturn(ColorDisplayManager.COLOR_MODE_NATURAL); doReturn(ColorDisplayManager.COLOR_MODE_NATURAL).when(mController).getColorMode(); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getText(R.string.color_mode_option_natural)); assertThat(mPreference.getSummary()).isEqualTo("Natural"); } } Loading
res/values/config.xml +20 −0 Original line number Diff line number Diff line Loading @@ -530,4 +530,24 @@ <!-- Whether to show Smart Storage toggle --> <bool name="config_show_smart_storage_toggle">true</bool> <!-- Display settings screen, Color mode options. Must be the same length and order as config_color_mode_options_values below. Only the values that also appear in frameworks/base/core/res/res/values/config.xml's config_availableColorModes are shown. --> <string-array name="config_color_mode_options_strings" translatable="false"> <item>@string/color_mode_option_natural</item> <item>@string/color_mode_option_boosted</item> <item>@string/color_mode_option_saturated</item> <item>@string/color_mode_option_automatic</item> </string-array> <!-- Display settings screen, Color mode options. Must be the same length and order as config_color_mode_options_strings above. Only the values that also appear in frameworks/base/core/res/res/values/config.xml's config_availableColorModes are shown. --> <integer-array name="config_color_mode_options_values" translatable="false"> <item>0</item> <item>1</item> <item>2</item> <item>3</item> </integer-array> </resources>
src/com/android/settings/display/ColorModePreferenceController.java +3 −19 Original line number Diff line number Diff line Loading @@ -18,13 +18,10 @@ import android.hardware.display.ColorDisplayManager; import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; public class ColorModePreferenceController extends BasePreferenceController { private ColorDisplayManager mColorDisplayManager; public ColorModePreferenceController(Context context, String key) { super(context, key); } Loading @@ -39,24 +36,11 @@ public class ColorModePreferenceController extends BasePreferenceController { @Override public CharSequence getSummary() { final int colorMode = getColorDisplayManager().getColorMode(); if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) { return mContext.getText(R.string.color_mode_option_automatic); } if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) { return mContext.getText(R.string.color_mode_option_saturated); } if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) { return mContext.getText(R.string.color_mode_option_boosted); } return mContext.getText(R.string.color_mode_option_natural); return ColorModeUtils.getColorModeMapping(mContext.getResources()).get(getColorMode()); } @VisibleForTesting ColorDisplayManager getColorDisplayManager() { if (mColorDisplayManager == null) { mColorDisplayManager = mContext.getSystemService(ColorDisplayManager.class); } return mColorDisplayManager; public int getColorMode() { return mContext.getSystemService(ColorDisplayManager.class).getColorMode(); } }
src/com/android/settings/display/ColorModePreferenceFragment.java +61 −55 Original line number Diff line number Diff line Loading @@ -13,9 +13,17 @@ */ package com.android.settings.display; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_AUTOMATIC; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_BOOSTED; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_NATURAL; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_SATURATED; import static android.hardware.display.ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MAX; import static android.hardware.display.ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MIN; import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.drawable.Drawable; import android.hardware.display.ColorDisplayManager; Loading @@ -36,28 +44,26 @@ import com.android.settingslib.widget.LayoutPreference; import java.util.ArrayList; import java.util.List; import java.util.Map; @SuppressWarnings("WeakerAccess") @SearchIndexable public class ColorModePreferenceFragment extends RadioButtonPickerFragment { @VisibleForTesting static final String KEY_COLOR_MODE_NATURAL = "color_mode_natural"; @VisibleForTesting static final String KEY_COLOR_MODE_BOOSTED = "color_mode_boosted"; @VisibleForTesting static final String KEY_COLOR_MODE_SATURATED = "color_mode_saturated"; @VisibleForTesting static final String KEY_COLOR_MODE_AUTOMATIC = "color_mode_automatic"; private static final String KEY_COLOR_MODE_PREFIX = "color_mode_"; private static final int COLOR_MODE_FALLBACK = COLOR_MODE_NATURAL; private ContentObserver mContentObserver; private ColorDisplayManager mColorDisplayManager; private Resources mResources; @Override public void onAttach(Context context) { super.onAttach(context); mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); mResources = context.getResources(); final ContentResolver cr = context.getContentResolver(); mContentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { Loading @@ -81,11 +87,11 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment { @Override public void onDetach() { super.onDetach(); if (mContentObserver != null) { getContext().getContentResolver().unregisterContentObserver(mContentObserver); mContentObserver = null; } super.onDetach(); } @Override Loading @@ -108,72 +114,72 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment { @Override protected List<? extends CandidateInfo> getCandidates() { final Context c = getContext(); final int[] availableColorModes = c.getResources().getIntArray( com.android.internal.R.array.config_availableColorModes); List<ColorModeCandidateInfo> candidates = new ArrayList<>(); if (availableColorModes != null) { for (int colorMode : availableColorModes) { if (colorMode == ColorDisplayManager.COLOR_MODE_NATURAL) { candidates.add(new ColorModeCandidateInfo( c.getText(R.string.color_mode_option_natural), KEY_COLOR_MODE_NATURAL, true /* enabled */)); } else if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) { final Map<Integer, String> colorModesToSummaries = ColorModeUtils.getColorModeMapping(mResources); final List<ColorModeCandidateInfo> candidates = new ArrayList<>(); for (int colorMode : mResources.getIntArray( com.android.internal.R.array.config_availableColorModes)) { candidates.add(new ColorModeCandidateInfo( c.getText(R.string.color_mode_option_boosted), KEY_COLOR_MODE_BOOSTED, true /* enabled */)); } else if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) { candidates.add(new ColorModeCandidateInfo( c.getText(R.string.color_mode_option_saturated), KEY_COLOR_MODE_SATURATED, true /* enabled */)); } else if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) { candidates.add(new ColorModeCandidateInfo( c.getText(R.string.color_mode_option_automatic), KEY_COLOR_MODE_AUTOMATIC, true /* enabled */)); } } colorModesToSummaries.get(colorMode), getKeyForColorMode(colorMode), true /* enabled */)); } return candidates; } @Override protected String getDefaultKey() { final int colorMode = mColorDisplayManager.getColorMode(); if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) { return KEY_COLOR_MODE_AUTOMATIC; } else if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) { return KEY_COLOR_MODE_SATURATED; } else if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) { return KEY_COLOR_MODE_BOOSTED; final int colorMode = getColorMode(); if (isValidColorMode(colorMode)) { return getKeyForColorMode(colorMode); } return KEY_COLOR_MODE_NATURAL; return getKeyForColorMode(COLOR_MODE_FALLBACK); } @Override protected boolean setDefaultKey(String key) { switch (key) { case KEY_COLOR_MODE_NATURAL: mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); break; case KEY_COLOR_MODE_BOOSTED: mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED); break; case KEY_COLOR_MODE_SATURATED: mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_SATURATED); break; case KEY_COLOR_MODE_AUTOMATIC: mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC); break; int colorMode = Integer.parseInt(key.substring(key.lastIndexOf("_") + 1)); if (isValidColorMode(colorMode)) { setColorMode(colorMode); } return true; } /** * Wraps ColorDisplayManager#getColorMode for substitution in testing. */ @VisibleForTesting public int getColorMode() { return mColorDisplayManager.getColorMode(); } /** * Wraps ColorDisplayManager#setColorMode for substitution in testing. */ @VisibleForTesting public void setColorMode(int colorMode) { mColorDisplayManager.setColorMode(colorMode); } @Override public int getMetricsCategory() { return SettingsEnums.COLOR_MODE_SETTINGS; } @VisibleForTesting String getKeyForColorMode(int colorMode) { return KEY_COLOR_MODE_PREFIX + colorMode; } private boolean isValidColorMode(int colorMode) { return colorMode == COLOR_MODE_NATURAL || colorMode == COLOR_MODE_BOOSTED || colorMode == COLOR_MODE_SATURATED || colorMode == COLOR_MODE_AUTOMATIC || (colorMode >= VENDOR_COLOR_MODE_RANGE_MIN && colorMode <= VENDOR_COLOR_MODE_RANGE_MAX); } @VisibleForTesting static class ColorModeCandidateInfo extends CandidateInfo { private final CharSequence mLabel; Loading
src/com/android/settings/display/ColorModeUtils.java 0 → 100644 +62 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.display; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_AUTOMATIC; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_BOOSTED; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_NATURAL; import static android.hardware.display.ColorDisplayManager.COLOR_MODE_SATURATED; import static android.hardware.display.ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MAX; import static android.hardware.display.ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MIN; import android.content.res.Resources; import android.util.ArrayMap; import com.android.settings.R; import java.util.Map; final class ColorModeUtils { private ColorModeUtils() { // Do not instantiate. } static Map<Integer, String> getColorModeMapping(Resources resources) { final String[] colorModeOptionsStrings = resources.getStringArray( R.array.config_color_mode_options_strings); final int[] colorModeOptionsValues = resources.getIntArray( R.array.config_color_mode_options_values); if (colorModeOptionsStrings.length != colorModeOptionsValues.length) { throw new RuntimeException("Color mode options of unequal length"); } final Map<Integer, String> colorModesToSummaries = new ArrayMap<>(); for (int i = 0; i < colorModeOptionsValues.length; i++) { final int colorMode = colorModeOptionsValues[i]; if (colorMode == COLOR_MODE_NATURAL || colorMode == COLOR_MODE_BOOSTED || colorMode == COLOR_MODE_SATURATED || colorMode == COLOR_MODE_AUTOMATIC || (colorMode >= VENDOR_COLOR_MODE_RANGE_MIN && colorMode <= VENDOR_COLOR_MODE_RANGE_MAX)) { colorModesToSummaries.put(colorMode, colorModeOptionsStrings[i]); } } return colorModesToSummaries; } }
tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java→tests/unit/src/com/android/settings/display/ColorModePreferenceControllerTest.java +28 −33 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. Loading @@ -23,80 +23,75 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; import android.hardware.display.ColorDisplayManager; import androidx.preference.Preference; import com.android.settings.R; import androidx.test.annotation.UiThreadTest; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; 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; @RunWith(RobolectricTestRunner.class) @RunWith(AndroidJUnit4.class) public class ColorModePreferenceControllerTest { @Mock private ColorDisplayManager mColorDisplayManager; private Context mContext; private Preference mPreference; private ColorModePreferenceController mController; @Before public void setup() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mController = spy(new ColorModePreferenceController(mContext, "test")); mPreference = new Preference(mContext); doReturn(mColorDisplayManager).when(mController).getColorDisplayManager(); final Context context = spy(ApplicationProvider.getApplicationContext()); mController = spy(new ColorModePreferenceController(context, "test")); mPreference = new Preference(context); final Resources res = spy(context.getResources()); when(res.getIntArray(com.android.internal.R.array.config_availableColorModes)).thenReturn( new int[]{ ColorDisplayManager.COLOR_MODE_NATURAL, ColorDisplayManager.COLOR_MODE_BOOSTED, ColorDisplayManager.COLOR_MODE_SATURATED, ColorDisplayManager.COLOR_MODE_AUTOMATIC }); doReturn(res).when(context).getResources(); } @Test @UiThreadTest public void updateState_colorModeAutomatic_shouldSetSummaryToAutomatic() { when(mColorDisplayManager.getColorMode()) .thenReturn(ColorDisplayManager.COLOR_MODE_AUTOMATIC); doReturn(ColorDisplayManager.COLOR_MODE_AUTOMATIC).when(mController).getColorMode(); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getText(R.string.color_mode_option_automatic)); assertThat(mPreference.getSummary()).isEqualTo("Adaptive"); } @Test @UiThreadTest public void updateState_colorModeSaturated_shouldSetSummaryToSaturated() { when(mColorDisplayManager.getColorMode()) .thenReturn(ColorDisplayManager.COLOR_MODE_SATURATED); doReturn(ColorDisplayManager.COLOR_MODE_SATURATED).when(mController).getColorMode(); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getText(R.string.color_mode_option_saturated)); assertThat(mPreference.getSummary()).isEqualTo("Saturated"); } @Test public void updateState_colorModeBoosted_shouldSetSummaryToBoosted() { when(mColorDisplayManager.getColorMode()) .thenReturn(ColorDisplayManager.COLOR_MODE_BOOSTED); doReturn(ColorDisplayManager.COLOR_MODE_BOOSTED).when(mController).getColorMode(); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getText(R.string.color_mode_option_boosted)); assertThat(mPreference.getSummary()).isEqualTo("Boosted"); } @Test public void updateState_colorModeNatural_shouldSetSummaryToNatural() { when(mColorDisplayManager.getColorMode()) .thenReturn(ColorDisplayManager.COLOR_MODE_NATURAL); doReturn(ColorDisplayManager.COLOR_MODE_NATURAL).when(mController).getColorMode(); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getText(R.string.color_mode_option_natural)); assertThat(mPreference.getSummary()).isEqualTo("Natural"); } }