package me.ccrama.redditslide.Adapters; /** * Created by ccrama on 3/22/2015. */ import android.app.Activity; import android.content.Intent; import android.graphics.PorterDuff; import android.os.Handler; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import net.dean.jraw.models.Subreddit; import java.util.List; import me.ccrama.redditslide.Activities.SubredditView; import me.ccrama.redditslide.Fragments.SubredditListView; import me.ccrama.redditslide.R; import me.ccrama.redditslide.SpoilerRobotoTextView; import me.ccrama.redditslide.Views.CatchStaggeredGridLayoutManager; import me.ccrama.redditslide.Views.CommentOverflow; import me.ccrama.redditslide.Visuals.Palette; import me.ccrama.redditslide.util.OnSingleClickListener; import me.ccrama.redditslide.util.SubmissionParser; public class SubredditAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements BaseAdapter { private final RecyclerView listView; public Activity context; public SubredditNames dataSet; private final int LOADING_SPINNER = 5; private final int NO_MORE = 3; private final int SPACER = 6; SubredditListView displayer; public SubredditAdapter(Activity context, SubredditNames dataSet, RecyclerView listView, String where, SubredditListView displayer) { String where1 = where.toLowerCase(); this.listView = listView; this.dataSet = dataSet; this.context = context; this.displayer = displayer; } @Override public void setError(Boolean b) { listView.setAdapter(new ErrorAdapter()); } @Override public void undoSetError() { listView.setAdapter(this); } @Override public int getItemViewType(int position) { if (position <= 0 && !dataSet.posts.isEmpty()) { return SPACER; } else if (!dataSet.posts.isEmpty()) { position -= (1); } if (position == dataSet.posts.size() && !dataSet.posts.isEmpty() && !dataSet.nomore) { return LOADING_SPINNER; } else if (position == dataSet.posts.size() && dataSet.nomore) { return NO_MORE; } int SUBREDDIT = 1; return SUBREDDIT; } int tag = 1; @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { tag++; if (i == SPACER) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.spacer, viewGroup, false); return new SpacerViewHolder(v); } else if (i == LOADING_SPINNER) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.loadingmore, viewGroup, false); return new SubmissionFooterViewHolder(v); } else if (i == NO_MORE) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.nomoreposts, viewGroup, false); return new SubmissionFooterViewHolder(v); } else { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.subfordiscover, viewGroup, false); return new SubredditViewHolder(v); } } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder2, final int pos) { int i = pos != 0 ? pos - 1 : pos; if (holder2 instanceof SubredditViewHolder) { final SubredditViewHolder holder = (SubredditViewHolder) holder2; final Subreddit sub = dataSet.posts.get(i); holder.name.setText(sub.getDisplayName()); holder.color.setBackgroundResource(R.drawable.circle); holder.color.getBackground().setColorFilter(Palette.getColor(sub.getDisplayName().toLowerCase()), PorterDuff.Mode.MULTIPLY); holder.itemView.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(context, SubredditView.class); inte.putExtra(SubredditView.EXTRA_SUBREDDIT, sub.getDisplayName()); context.startActivityForResult(inte, 4); } }); holder.overflow.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(context, SubredditView.class); inte.putExtra(SubredditView.EXTRA_SUBREDDIT, sub.getDisplayName()); context.startActivityForResult(inte, 4); } }); holder.body.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(context, SubredditView.class); inte.putExtra(SubredditView.EXTRA_SUBREDDIT, sub.getDisplayName()); context.startActivityForResult(inte, 4); } }); if (sub.getDataNode().get("public_description_html").asText().equals("null")) { holder.body.setVisibility(View.GONE); holder.overflow.setVisibility(View.GONE); } else { holder.body.setVisibility(View.VISIBLE); holder.overflow.setVisibility(View.VISIBLE); setViews(sub.getDataNode().get("public_description_html").asText().trim(), sub.getDisplayName().toLowerCase(), holder.body, holder.overflow); } try { int state = sub.isUserSubscriber() ? View.VISIBLE : View.INVISIBLE; holder.subbed.setVisibility(state); } catch (Exception e) { holder.subbed.setVisibility(View.INVISIBLE); } } else if (holder2 instanceof SubmissionFooterViewHolder) { Handler handler = new Handler(); final Runnable r = new Runnable() { public void run() { notifyItemChanged(dataSet.posts.size() + 1); // the loading spinner to replaced by nomoreposts.xml } }; handler.post(r); if (holder2.itemView.findViewById(R.id.reload) != null) { holder2.itemView.setVisibility(View.INVISIBLE); } } if (holder2 instanceof SpacerViewHolder) { final int height = (context).findViewById(R.id.header).getHeight(); holder2.itemView.findViewById(R.id.height).setLayoutParams(new LinearLayout.LayoutParams(holder2.itemView.getWidth(), height)); if (listView.getLayoutManager() instanceof CatchStaggeredGridLayoutManager) { CatchStaggeredGridLayoutManager.LayoutParams layoutParams = new CatchStaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); layoutParams.setFullSpan(true); holder2.itemView.setLayoutParams(layoutParams); } } } public class SubmissionFooterViewHolder extends RecyclerView.ViewHolder { public SubmissionFooterViewHolder(View itemView) { super(itemView); } } public class SpacerViewHolder extends RecyclerView.ViewHolder { public SpacerViewHolder(View itemView) { super(itemView); } } @Override public int getItemCount() { if (dataSet.posts == null || dataSet.posts.isEmpty()) { return 0; } else { return dataSet.posts.size() + 2; // Always account for footer } } private void setViews(String rawHTML, String subredditName, SpoilerRobotoTextView firstTextView, CommentOverflow commentOverflow) { if (rawHTML.isEmpty()) { return; } List<String> blocks = SubmissionParser.getBlocks(rawHTML); int startIndex = 0; // the <div class="md"> case is when the body contains a table or code block first if (!blocks.get(0).equals("<div class=\"md\">")) { firstTextView.setVisibility(View.VISIBLE); firstTextView.setTextHtml(blocks.get(0), subredditName); startIndex = 1; } else { firstTextView.setText(""); firstTextView.setVisibility(View.GONE); } if (blocks.size() > 1) { if (startIndex == 0) { commentOverflow.setViews(blocks, subredditName); } else { commentOverflow.setViews(blocks.subList(startIndex, blocks.size()), subredditName); } } else { commentOverflow.removeAllViews(); } } }