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

Commit 10da1de1 authored by Christine Franks's avatar Christine Franks Committed by Android (Google) Code Review
Browse files

Merge "Support vendor modes in color mode preference" into sc-dev

parents 81399d6f cd61dd33
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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>
+3 −19
Original line number Diff line number Diff line
@@ -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);
    }
@@ -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();
    }
}
+61 −55
Original line number Diff line number Diff line
@@ -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;
@@ -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())) {
@@ -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
@@ -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;
+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;
    }
}
+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.
@@ -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