diff --git a/res/drawable-nodpi/color_mode_preview.jpg b/res/drawable-nodpi/color_mode_preview.jpg
deleted file mode 100644
index 804bcf1961a..00000000000
Binary files a/res/drawable-nodpi/color_mode_preview.jpg and /dev/null differ
diff --git a/res/drawable-nodpi/color_mode_preview1.jpg b/res/drawable-nodpi/color_mode_preview1.jpg
new file mode 100644
index 00000000000..71bcb7e59c2
Binary files /dev/null and b/res/drawable-nodpi/color_mode_preview1.jpg differ
diff --git a/res/drawable-nodpi/color_mode_preview2.jpg b/res/drawable-nodpi/color_mode_preview2.jpg
new file mode 100644
index 00000000000..4153d8e7538
Binary files /dev/null and b/res/drawable-nodpi/color_mode_preview2.jpg differ
diff --git a/res/drawable-nodpi/color_mode_preview3.jpg b/res/drawable-nodpi/color_mode_preview3.jpg
new file mode 100644
index 00000000000..ab83f08c92c
Binary files /dev/null and b/res/drawable-nodpi/color_mode_preview3.jpg differ
diff --git a/res/drawable/ic_color_arrow_left_lt.xml b/res/drawable/ic_color_arrow_left_lt.xml
new file mode 100644
index 00000000000..237a1a3a9e2
--- /dev/null
+++ b/res/drawable/ic_color_arrow_left_lt.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/res/drawable/ic_color_arrow_right_lt.xml b/res/drawable/ic_color_arrow_right_lt.xml
new file mode 100644
index 00000000000..510724386a5
--- /dev/null
+++ b/res/drawable/ic_color_arrow_right_lt.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/res/drawable/ic_color_page_indicator_focused.xml b/res/drawable/ic_color_page_indicator_focused.xml
new file mode 100644
index 00000000000..617335803fb
--- /dev/null
+++ b/res/drawable/ic_color_page_indicator_focused.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
diff --git a/res/drawable/ic_color_page_indicator_unfocused.xml b/res/drawable/ic_color_page_indicator_unfocused.xml
new file mode 100644
index 00000000000..57a13d82282
--- /dev/null
+++ b/res/drawable/ic_color_page_indicator_unfocused.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
diff --git a/res/layout/color_mode_preview.xml b/res/layout/color_mode_preview.xml
index 88b8281152f..b8601c927bd 100644
--- a/res/layout/color_mode_preview.xml
+++ b/res/layout/color_mode_preview.xml
@@ -14,16 +14,55 @@
limitations under the License.
-->
-
-
-
+ android:layout_height="wrap_content">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/color_mode_view1.xml b/res/layout/color_mode_view1.xml
new file mode 100644
index 00000000000..4bdaec1da0b
--- /dev/null
+++ b/res/layout/color_mode_view1.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/color_mode_view2.xml b/res/layout/color_mode_view2.xml
new file mode 100644
index 00000000000..c70fa75c4f2
--- /dev/null
+++ b/res/layout/color_mode_view2.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/color_mode_view3.xml b/res/layout/color_mode_view3.xml
new file mode 100644
index 00000000000..430e3b2fee9
--- /dev/null
+++ b/res/layout/color_mode_view3.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index df409dbe645..044d30fc0fc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13542,6 +13542,15 @@
Turn on Game Dashboard shortcut, etc
+
+ Previous
+
+
+ Next
+
+
+ Color preview
+
SIM card access request
diff --git a/src/com/android/settings/display/ColorModePreferenceFragment.java b/src/com/android/settings/display/ColorModePreferenceFragment.java
index b8fa0b9a5fd..ce33e673fde 100644
--- a/src/com/android/settings/display/ColorModePreferenceFragment.java
+++ b/src/com/android/settings/display/ColorModePreferenceFragment.java
@@ -28,12 +28,18 @@ import android.database.ContentObserver;
import android.graphics.drawable.Drawable;
import android.hardware.display.ColorDisplayManager;
import android.net.Uri;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings.Secure;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -43,6 +49,7 @@ import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.widget.LayoutPreference;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -54,10 +61,25 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment {
private static final int COLOR_MODE_FALLBACK = COLOR_MODE_NATURAL;
+ static final String PAGE_VIEWER_SELECTION_INDEX = "page_viewer_selection_index";
+
+ private static final int DOT_INDICATOR_SIZE = 12;
+ private static final int DOT_INDICATOR_LEFT_PADDING = 6;
+ private static final int DOT_INDICATOR_RIGHT_PADDING = 6;
+
private ContentObserver mContentObserver;
private ColorDisplayManager mColorDisplayManager;
private Resources mResources;
+ private View mViewArrowPrevious;
+ private View mViewArrowNext;
+ private ViewPager mViewPager;
+
+ private ArrayList mPageList;
+
+ private ImageView[] mDotIndicators;
+ private View[] mViewPagerImages;
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -85,6 +107,16 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment {
false /* notifyForDescendants */, mContentObserver, mUserId);
}
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ final int selectedPosition = savedInstanceState.getInt(PAGE_VIEWER_SELECTION_INDEX);
+ mViewPager.setCurrentItem(selectedPosition);
+ updateIndicator(selectedPosition);
+ }
+ }
+
@Override
public void onDetach() {
if (mContentObserver != null) {
@@ -94,6 +126,12 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment {
super.onDetach();
}
+ @Override
+ public void onSaveInstanceState(Bundle outState){
+ super.onSaveInstanceState(outState);
+ outState.putInt(PAGE_VIEWER_SELECTION_INDEX, mViewPager.getCurrentItem());
+ }
+
@Override
protected int getPreferenceScreenResId() {
return R.xml.color_mode_settings;
@@ -105,11 +143,69 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment {
screen.addPreference(preview);
}
+ @VisibleForTesting
+ public ArrayList getViewPagerResource() {
+ return new ArrayList(
+ Arrays.asList(
+ R.layout.color_mode_view1,
+ R.layout.color_mode_view2,
+ R.layout.color_mode_view3));
+ }
+
+ void addViewPager(LayoutPreference preview) {
+ final ArrayList tmpviewPagerList = getViewPagerResource();
+ mViewPager = preview.findViewById(R.id.viewpager);
+
+ mViewPagerImages = new View[3];
+ for (int idx = 0; idx < tmpviewPagerList.size(); idx++) {
+ mViewPagerImages[idx] =
+ getLayoutInflater().inflate(tmpviewPagerList.get(idx), null /* root */);
+ }
+
+ mPageList = new ArrayList();
+ mPageList.add(mViewPagerImages[0]);
+ mPageList.add(mViewPagerImages[1]);
+ mPageList.add(mViewPagerImages[2]);
+
+ mViewPager.setAdapter(new ColorPagerAdapter(mPageList));
+
+ mViewArrowPrevious = preview.findViewById(R.id.arrow_previous);
+ mViewArrowPrevious.setOnClickListener(v -> {
+ final int previousPos = mViewPager.getCurrentItem() - 1;
+ mViewPager.setCurrentItem(previousPos, true);
+ });
+
+ mViewArrowNext = preview.findViewById(R.id.arrow_next);
+ mViewArrowNext.setOnClickListener(v -> {
+ final int nextPos = mViewPager.getCurrentItem() + 1;
+ mViewPager.setCurrentItem(nextPos, true);
+ });
+
+ mViewPager.addOnPageChangeListener(createPageListener());
+
+ final ViewGroup viewGroup = (ViewGroup) preview.findViewById(R.id.viewGroup);
+ mDotIndicators = new ImageView[mPageList.size()];
+ for (int i = 0; i < mPageList.size(); i++) {
+ final ImageView imageView = new ImageView(getContext());
+ final ViewGroup.MarginLayoutParams lp =
+ new ViewGroup.MarginLayoutParams(DOT_INDICATOR_SIZE, DOT_INDICATOR_SIZE);
+ lp.setMargins(DOT_INDICATOR_LEFT_PADDING, 0, DOT_INDICATOR_RIGHT_PADDING, 0);
+ imageView.setLayoutParams(lp);
+ mDotIndicators[i] = imageView;
+
+ viewGroup.addView(mDotIndicators[i]);
+ }
+
+ updateIndicator(mViewPager.getCurrentItem());
+ }
+
@Override
protected void addStaticPreferences(PreferenceScreen screen) {
final LayoutPreference preview = new LayoutPreference(screen.getContext(),
R.layout.color_mode_preview);
configureAndInstallPreview(preview, screen);
+
+ addViewPager(preview);
}
@Override
@@ -207,6 +303,88 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment {
}
}
+ private ViewPager.OnPageChangeListener createPageListener() {
+ return new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(
+ int position, float positionOffset, int positionOffsetPixels) {
+ if (positionOffset != 0) {
+ for (int idx = 0; idx < mPageList.size(); idx++) {
+ mViewPagerImages[idx].setVisibility(View.VISIBLE);
+ }
+ } else {
+ mViewPagerImages[position].setContentDescription(
+ getContext().getString(R.string.colors_viewpager_content_description));
+ updateIndicator(position);
+ }
+ }
+
+ @Override
+ public void onPageSelected(int position) {}
+
+ @Override
+ public void onPageScrollStateChanged(int state) {}
+ };
+ }
+
+ private void updateIndicator(int position) {
+ for (int i = 0; i < mPageList.size(); i++) {
+ if (position == i) {
+ mDotIndicators[i].setBackgroundResource(
+ R.drawable.ic_color_page_indicator_focused);
+
+ mViewPagerImages[i].setVisibility(View.VISIBLE);
+ } else {
+ mDotIndicators[i].setBackgroundResource(
+ R.drawable.ic_color_page_indicator_unfocused);
+
+ mViewPagerImages[i].setVisibility(View.INVISIBLE);
+ }
+ }
+
+ if (position == 0) {
+ mViewArrowPrevious.setVisibility(View.INVISIBLE);
+ mViewArrowNext.setVisibility(View.VISIBLE);
+ } else if (position == (mPageList.size() - 1)) {
+ mViewArrowPrevious.setVisibility(View.VISIBLE);
+ mViewArrowNext.setVisibility(View.INVISIBLE);
+ } else {
+ mViewArrowPrevious.setVisibility(View.VISIBLE);
+ mViewArrowNext.setVisibility(View.VISIBLE);
+ }
+ }
+
+ static class ColorPagerAdapter extends PagerAdapter {
+ private final ArrayList mPageViewList;
+
+ ColorPagerAdapter(ArrayList pageViewList) {
+ mPageViewList = pageViewList;
+ }
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ if (mPageViewList.get(position) != null) {
+ container.removeView(mPageViewList.get(position));
+ }
+ }
+
+ @Override
+ public Object instantiateItem(ViewGroup container, int position) {
+ container.addView(mPageViewList.get(position));
+ return mPageViewList.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return mPageViewList.size();
+ }
+
+ @Override
+ public boolean isViewFromObject(View view, Object object) {
+ return object == view;
+ }
+ }
+
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.color_mode_settings) {
diff --git a/tests/unit/src/com/android/settings/display/ColorModePreferenceFragmentTest.java b/tests/unit/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
index cfdedc78e0c..450525c9339 100644
--- a/tests/unit/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
+++ b/tests/unit/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
@@ -39,6 +39,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
import java.util.List;
@RunWith(AndroidJUnit4.class)
@@ -232,4 +233,15 @@ public class ColorModePreferenceFragmentTest {
verify(mFragment).setColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC);
}
+
+ @Test
+ @UiThreadTest
+ public void checkViewPagerTotalCount() throws Throwable {
+ final ArrayList viewPagerResList = mFragment.getViewPagerResource();
+
+ assertThat(viewPagerResList.size()).isEqualTo(3);
+ for (int idx = 0; idx < viewPagerResList.size(); idx++) {
+ assertThat(viewPagerResList.get(idx) > 0).isTrue();
+ }
+ }
}