package de.westnordost.streetcomplete.quests; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import de.westnordost.streetcomplete.R; import de.westnordost.streetcomplete.view.ImageSelectAdapter; /** * Abstract class for quests with a list of images and one to select. */ public abstract class ImageListQuestAnswerFragment extends AbstractQuestFormAnswerFragment { public static final String OSM_VALUES = "osm_values"; private static final String SELECTED_INDICES = "selected_indices", EXPANDED = "expanded"; protected ImageSelectAdapter imageSelector; private Button showMoreButton; private int maxInitiallyShownItems; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); View contentView = setContentView(R.layout.quest_generic_list); RecyclerView valueList = (RecyclerView) contentView.findViewById(R.id.listSelect); GridLayoutManager lm = new GridLayoutManager(getActivity(), 4); valueList.setLayoutManager(lm); valueList.setNestedScrollingEnabled(false); showMoreButton = (Button) view.findViewById(R.id.buttonShowMore); showMoreButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { List<ImageSelectAdapter.Item> all = Arrays.<ImageSelectAdapter.Item>asList(getItems()); imageSelector.addItems(all.subList(imageSelector.getItemCount(), all.size())); showMoreButton.setVisibility(View.GONE); } }); int selectableItems = getMaxSelectableItems(); TextView selectHint = (TextView) view.findViewById(R.id.selectHint); selectHint.setText(selectableItems == 1 ? R.string.quest_roofShape_select_one : R.string.quest_select_hint); imageSelector = new ImageSelectAdapter(selectableItems); int initiallyShow = getMaxNumberOfInitiallyShownItems(); if(savedInstanceState != null) { if(savedInstanceState.getBoolean(EXPANDED)) initiallyShow = -1; showInitialItems(initiallyShow); List<Integer> selectedIndices = savedInstanceState.getIntegerArrayList(SELECTED_INDICES); imageSelector.selectIndices(selectedIndices); } else { showInitialItems(initiallyShow); } valueList.setAdapter(imageSelector); return view; } /** return -1 for any number*/ protected abstract int getMaxSelectableItems(); /** return -1 for showing all items at once */ protected abstract int getMaxNumberOfInitiallyShownItems(); protected abstract OsmItem[] getItems(); private void showInitialItems(int initiallyShow) { List<ImageSelectAdapter.Item> all = Arrays.<ImageSelectAdapter.Item>asList(getItems()); if(initiallyShow == -1 || initiallyShow >= all.size()) { imageSelector.setItems(all); showMoreButton.setVisibility(View.GONE); } else { imageSelector.setItems(all.subList(0, initiallyShow)); } } @Override protected void onClickOk() { applyAnswer(); } protected void applyAnswer() { Bundle answer = new Bundle(); ArrayList<String> osmValues = new ArrayList<>(); for(Integer selectedIndex : imageSelector.getSelectedIndices()) { osmValues.add(getItems()[selectedIndex].osmValue); } if(!osmValues.isEmpty()) { answer.putStringArrayList(OSM_VALUES, osmValues); } applyFormAnswer(answer); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putIntegerArrayList(SELECTED_INDICES, imageSelector.getSelectedIndices()); outState.putBoolean(EXPANDED, showMoreButton.getVisibility() == View.GONE); } @Override public boolean hasChanges() { return !imageSelector.getSelectedIndices().isEmpty(); } protected static class OsmItem extends ImageSelectAdapter.Item { public final String osmValue; public OsmItem(String osmValue, int drawableId, int titleId) { super(drawableId, titleId); this.osmValue = osmValue; } public OsmItem(String osmValue, int drawableId) { this(osmValue, drawableId, -1); } } }