From 2dd4377423a8bb5b2c9d8b2b3429d75ae602d5b2 Mon Sep 17 00:00:00 2001 From: Sean Callanan Date: Tue, 20 Feb 2018 18:57:29 -0800 Subject: [PATCH] Add a preview image to the color mode preference. For high-color displays, it's desirable to have a preview of the impact the user's color preference will have on images. This commit adds that functionality to ColorModePreferenceFragment by extending RadioButtonPickerFragment to support static content. The image used here is a placeholder pending UX. Bug: 73670362 Test: Added a test verifying that the preview is added correctly. Change-Id: Id54316bbef6a22291a8e8acbda5fcb2839b88c23 --- res/layout/color_mode_preview.xml | 30 +++++++++++++++++++ res/values/dimens.xml | 3 ++ .../display/ColorModePreferenceFragment.java | 15 ++++++++++ .../widget/RadioButtonPickerFragment.java | 8 +++++ .../ColorModePreferenceFragmentTest.java | 18 +++++++++++ 5 files changed, 74 insertions(+) create mode 100644 res/layout/color_mode_preview.xml diff --git a/res/layout/color_mode_preview.xml b/res/layout/color_mode_preview.xml new file mode 100644 index 00000000000..bcd385dcc24 --- /dev/null +++ b/res/layout/color_mode_preview.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 6ede7c644af..bf10008464b 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -60,6 +60,9 @@ 200dp + 320dp + 40dp + 4dp 0dip diff --git a/src/com/android/settings/display/ColorModePreferenceFragment.java b/src/com/android/settings/display/ColorModePreferenceFragment.java index ea8dd6a8ab2..f1bb6e1e996 100644 --- a/src/com/android/settings/display/ColorModePreferenceFragment.java +++ b/src/com/android/settings/display/ColorModePreferenceFragment.java @@ -16,10 +16,12 @@ package com.android.settings.display; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.annotation.VisibleForTesting; +import android.support.v7.preference.PreferenceScreen; import com.android.internal.app.ColorDisplayController; import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.applications.LayoutPreference; import com.android.settings.R; import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settingslib.widget.CandidateInfo; @@ -50,6 +52,19 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment { return R.xml.color_mode_settings; } + @VisibleForTesting + void configureAndInstallPreview(LayoutPreference preview, PreferenceScreen screen) { + preview.setSelectable(false); + screen.addPreference(preview); + } + + @Override + protected void addStaticPreferences(PreferenceScreen screen) { + final LayoutPreference preview = new LayoutPreference(screen.getContext(), + R.layout.color_mode_preview); + configureAndInstallPreview(preview, screen); + } + @Override protected List getCandidates() { Context c = getContext(); diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java index 069d4611892..1465c60d6f3 100644 --- a/src/com/android/settings/widget/RadioButtonPickerFragment.java +++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java @@ -101,6 +101,13 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr return false; } + /** + * Populate any static preferences, independent of the radio buttons. + * These might be used to provide extra information about the choices. + **/ + protected void addStaticPreferences(PreferenceScreen screen) { + } + protected CandidateInfo getCandidate(String key) { return mCandidates.get(key); } @@ -134,6 +141,7 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr final String systemDefaultKey = getSystemDefaultKey(); final PreferenceScreen screen = getPreferenceScreen(); screen.removeAll(); + addStaticPreferences(screen); final int customLayoutResId = getRadioButtonPreferenceCustomLayoutResId(); if (shouldShowItemNone()) { diff --git a/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java index 68937b2f1c0..1ed691b2658 100644 --- a/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java @@ -20,13 +20,17 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.os.Bundle; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; import com.android.internal.app.ColorDisplayController; import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.applications.LayoutPreference; import com.android.settings.R; import com.android.settings.TestConfig; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -37,6 +41,7 @@ import com.android.settingslib.widget.CandidateInfo; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -145,4 +150,17 @@ public class ColorModePreferenceFragmentTest { verify(mFragment).addPreferencesFromResource(R.xml.color_mode_settings); } + @Test + public void addStaticPreferences_shouldAddPreviewImage() { + PreferenceScreen mockPreferenceScreen = Mockito.mock(PreferenceScreen.class); + LayoutPreference mockPreview = Mockito.mock(LayoutPreference.class); + + ArgumentCaptor preferenceCaptor = ArgumentCaptor.forClass(Preference.class); + + mFragment.configureAndInstallPreview(mockPreview, mockPreferenceScreen); + Mockito.verify(mockPreview, times(1)).setSelectable(false); + Mockito.verify(mockPreferenceScreen, times(1)).addPreference(preferenceCaptor.capture()); + + assertThat(preferenceCaptor.getValue()).isEqualTo(mockPreview); + } }