Prototyping : Demo Image on color setting

Implement prototyping of demo image on color setting

Bug: 182797883
Test: adb shell am instrument -w -e class com.android.settings.display.ColorModePreferenceFragmentTest com.android.settings.tests.unit/androidx.test.runner.AndroidJUnitRunner test pass
Change-Id: Iebaaa6867f2039a25a5e1fd280a89b5bc9297e6b
This commit is contained in:
Alfred Lin
2021-05-18 01:59:16 +00:00
committed by NT Tsai
parent 1741d5d12c
commit 7f8e775754
15 changed files with 479 additions and 11 deletions

View File

@@ -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<View> 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<Integer> getViewPagerResource() {
return new ArrayList<Integer>(
Arrays.asList(
R.layout.color_mode_view1,
R.layout.color_mode_view2,
R.layout.color_mode_view3));
}
void addViewPager(LayoutPreference preview) {
final ArrayList<Integer> 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<View>();
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<View> mPageViewList;
ColorPagerAdapter(ArrayList<View> 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) {