package treehou.se.habit.ui.adapter; import android.content.Context; import android.content.DialogInterface; import android.support.annotation.IntDef; import android.support.v7.app.AlertDialog; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; import java.util.Map; import se.treehou.ng.ohcommunicator.connector.models.OHInboxItem; import se.treehou.ng.ohcommunicator.services.Connector; import se.treehou.ng.ohcommunicator.services.IServerHandler; import treehou.se.habit.R; import treehou.se.habit.core.db.model.ServerDB; public class InboxAdapter extends RecyclerView.Adapter<InboxAdapter.InboxHolder> { private static String TAG = InboxAdapter.class.getSimpleName(); @Retention(RetentionPolicy.SOURCE) @IntDef({ ItemType.item, ItemType.item_ignored }) @interface ItemType{ int item = 1; int item_ignored = 2; } private List<OHInboxItem> items = new ArrayList<>(); private Context context; private ServerDB server; private ItemListener itemListener = new DummyItemListener(); public class InboxHolder extends RecyclerView.ViewHolder { public final TextView lblName; public LinearLayout louProperties; public InboxHolder(View view) { super(view); lblName = (TextView) view.findViewById(R.id.lbl_server); louProperties = (LinearLayout) itemView.findViewById(R.id.lou_properties); } } public class IgnoreInboxHolder extends InboxHolder { public IgnoreInboxHolder(View view) { super(view); } } public InboxAdapter(Context context, ServerDB server) { this.context = context; this.server = server; } @Override public int getItemViewType(int position) { OHInboxItem item = getItem(position); if(item.isIgnored()){ return ItemType.item_ignored; } return ItemType.item; } @Override public InboxHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { LayoutInflater inflater = LayoutInflater.from(context); InboxHolder inboxHolder = null; switch (viewType) { case ItemType.item: View itemView = inflater.inflate(R.layout.item_inbox, null); inboxHolder = new InboxHolder(itemView); break; case ItemType.item_ignored: itemView = inflater.inflate(R.layout.item_inbox_ignored, null); inboxHolder = new IgnoreInboxHolder(itemView); break; } return inboxHolder; } @Override public void onBindViewHolder(final InboxHolder serverHolder, final int position) { final OHInboxItem inboxItem = items.get(position); serverHolder.lblName.setText(inboxItem.getLabel()); serverHolder.itemView.setOnClickListener(v -> itemListener.onItemClickListener(serverHolder)); serverHolder.itemView.setOnLongClickListener(v -> itemListener.onItemLongClickListener(serverHolder)); LinearLayout louProperties = serverHolder.louProperties; louProperties.removeAllViews(); LayoutInflater inflater = LayoutInflater.from(context); for (Map.Entry<String, String> entry : inboxItem.getProperties().entrySet()) { View louProperty = inflater.inflate(R.layout.item_property, louProperties, false); TextView lblProperty = (TextView) louProperty.findViewById(R.id.lbl_property); lblProperty.setText(context.getString(R.string.inbox_property, entry.getKey(), entry.getValue())); louProperties.addView(louProperty); } IServerHandler serverHandler = new Connector.ServerHandler(server.toGeneric(), context); serverHolder.itemView.setOnClickListener(v -> new AlertDialog.Builder(context) .setTitle(context.getString(R.string.approve_item)) .setMessage(context.getString(R.string.approve_this_item)) .setPositiveButton(R.string.ok, (dialog, which) -> serverHandler.approveInboxItem(inboxItem)) .setNegativeButton(R.string.cancel, null) .show()); } @Override public int getItemCount() { return items.size(); } public OHInboxItem getItem(int position) { return items.get(position); } interface ItemListener { void onItemClickListener(InboxHolder serverHolder); boolean onItemLongClickListener(InboxHolder serverHolder); void itemCountUpdated(int itemCount); } public class DummyItemListener implements ItemListener { @Override public void onItemClickListener(InboxHolder serverHolder) { } @Override public boolean onItemLongClickListener(InboxHolder serverHolder) { return false; } @Override public void itemCountUpdated(int itemCount) { } } public void setItemListener(ItemListener itemListener) { if (itemListener == null) { this.itemListener = new DummyItemListener(); return; } this.itemListener = itemListener; } public void addItem(OHInboxItem item) { items.add(0, item); notifyItemInserted(0); itemListener.itemCountUpdated(items.size()); } public void addAll(List<OHInboxItem> items) { for (OHInboxItem item : items) { this.items.add(0, item); } notifyDataSetChanged(); itemListener.itemCountUpdated(items.size()); } public void removeItem(int position) { Log.d(TAG, "removeItem: " + position); items.remove(position); notifyItemRemoved(position); itemListener.itemCountUpdated(items.size()); } public void removeItem(OHInboxItem item) { int position = items.indexOf(item); items.remove(position); notifyItemRemoved(position); itemListener.itemCountUpdated(items.size()); } /** * Remove all items from adapter */ public void clear() { this.items.clear(); notifyDataSetChanged(); itemListener.itemCountUpdated(items.size()); } }