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(); + } + } }