package net.osmand.plus.quickaction; import android.content.Context; import android.support.annotation.StringRes; import android.support.v4.view.MotionEventCompat; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import java.util.ArrayList; import java.util.Collections; import java.util.List; public abstract class SwitchableAction<T> extends QuickAction { private transient EditText title; protected SwitchableAction(int type) { super(type); } public SwitchableAction(QuickAction quickAction) { super(quickAction); } @Override public void setAutoGeneratedTitle(EditText title) { this.title = title; } @Override public void drawUI(ViewGroup parent, final MapActivity activity) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.quick_action_switchable_action, parent, false); final RecyclerView list = (RecyclerView) view.findViewById(R.id.list); final QuickActionItemTouchHelperCallback touchHelperCallback = new QuickActionItemTouchHelperCallback(); final ItemTouchHelper touchHelper = new ItemTouchHelper(touchHelperCallback); final Adapter adapter = new Adapter(new QuickActionListFragment.OnStartDragListener() { @Override public void onStartDrag(RecyclerView.ViewHolder viewHolder) { touchHelper.startDrag(viewHolder); } }); touchHelperCallback.setItemMoveCallback(adapter); touchHelper.attachToRecyclerView(list); if (!getParams().isEmpty()) { adapter.addItems(loadListFromParams()); } list.setAdapter(adapter); TextView dscrTitle = (TextView) view.findViewById(R.id.textDscrTitle); TextView dscrHint = (TextView) view.findViewById(R.id.textDscrHint); Button addBtn = (Button) view.findViewById(R.id.btnAdd); dscrTitle.setText(parent.getContext().getString(getDiscrTitle()) + ":"); dscrHint.setText(getDiscrHint()); addBtn.setText(getAddBtnText()); addBtn.setOnClickListener(getOnAddBtnClickListener(activity, adapter)); parent.addView(view); } @Override public boolean fillParams(View root, MapActivity activity) { final RecyclerView list = (RecyclerView) root.findViewById(R.id.list); final Adapter adapter = (Adapter) list.getAdapter(); boolean hasParams = adapter.itemsList != null && !adapter.itemsList.isEmpty(); if (hasParams) saveListToParams(adapter.itemsList); return hasParams; } protected class Adapter extends RecyclerView.Adapter<Adapter.ItemHolder> implements QuickActionItemTouchHelperCallback.OnItemMoveCallback { private List<T> itemsList = new ArrayList<>(); private final QuickActionListFragment.OnStartDragListener onStartDragListener; public Adapter(QuickActionListFragment.OnStartDragListener onStartDragListener) { this.onStartDragListener = onStartDragListener; this.itemsList = new ArrayList<>(); } @Override public Adapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); return new Adapter.ItemHolder(inflater.inflate(R.layout.quick_action_switchable_item, parent, false)); } @Override public void onBindViewHolder(final Adapter.ItemHolder holder, final int position) { final T item = itemsList.get(position); holder.title.setText(getItemName(item)); holder.handleView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { onStartDragListener.onStartDrag(holder); } return false; } }); holder.closeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String oldTitle = getTitle(itemsList); String defaultName = holder.handleView.getContext().getString(getNameRes()); deleteItem(holder.getAdapterPosition()); if (oldTitle.equals(title.getText().toString()) || title.getText().toString().equals(defaultName)) { String newTitle = getTitle(itemsList); title.setText(newTitle); } } }); } @Override public int getItemCount() { return itemsList.size(); } public void deleteItem(int position) { if (position == -1) { return; } itemsList.remove(position); notifyItemRemoved(position); } public void addItems(List<T> data) { if (!itemsList.containsAll(data)) { itemsList.addAll(data); notifyDataSetChanged(); } } public void addItem(T item, Context context) { if (!itemsList.contains(item)) { String oldTitle = getTitle(itemsList); String defaultName = context.getString(getNameRes()); int oldSize = itemsList.size(); itemsList.add(item); notifyItemRangeInserted(oldSize, itemsList.size() - oldSize); if (oldTitle.equals(title.getText().toString()) || title.getText().toString().equals(defaultName)) { String newTitle = getTitle(itemsList); title.setText(newTitle); } } } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { int selectedPosition = viewHolder.getAdapterPosition(); int targetPosition = target.getAdapterPosition(); if (selectedPosition < 0 || targetPosition < 0) { return false; } String oldTitle = getTitle(itemsList); String defaultName = recyclerView.getContext().getString(getNameRes()); Collections.swap(itemsList, selectedPosition, targetPosition); if (selectedPosition - targetPosition < -1) { notifyItemMoved(selectedPosition, targetPosition); notifyItemMoved(targetPosition - 1, selectedPosition); } else if (selectedPosition - targetPosition > 1) { notifyItemMoved(selectedPosition, targetPosition); notifyItemMoved(targetPosition + 1, selectedPosition); } else { notifyItemMoved(selectedPosition, targetPosition); } notifyItemChanged(selectedPosition); notifyItemChanged(targetPosition); if (oldTitle.equals(title.getText().toString()) || title.getText().toString().equals(defaultName)) { String newTitle = getTitle(itemsList); title.setText(newTitle); } return true; } @Override public void onViewDropped(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { } public class ItemHolder extends RecyclerView.ViewHolder { public TextView title; public ImageView handleView; public ImageView closeBtn; public ItemHolder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.title); handleView = (ImageView) itemView.findViewById(R.id.handle_view); closeBtn = (ImageView) itemView.findViewById(R.id.closeImageButton); } } } protected abstract String getTitle(List<T> filters); protected abstract void saveListToParams(List<T> list); protected abstract List<T> loadListFromParams(); protected abstract String getItemName(T item); protected abstract @StringRes int getAddBtnText(); protected abstract @StringRes int getDiscrHint(); protected abstract @StringRes int getDiscrTitle(); protected abstract String getListKey(); protected abstract View.OnClickListener getOnAddBtnClickListener(MapActivity activity, final Adapter adapter); }