package me.ccrama.redditslide.Adapters; /** * Created by ccrama on 3/22/2015. */ import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.AsyncTask; import android.os.Handler; import android.support.design.widget.Snackbar; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import net.dean.jraw.managers.AccountManager; import net.dean.jraw.models.Submission; import java.util.ArrayList; import java.util.List; import me.ccrama.redditslide.ActionStates; import me.ccrama.redditslide.Activities.CommentsScreen; import me.ccrama.redditslide.Authentication; import me.ccrama.redditslide.Fragments.MultiredditView; import me.ccrama.redditslide.R; import me.ccrama.redditslide.Reddit; import me.ccrama.redditslide.SubmissionViews.PopulateSubmissionViewHolder; import me.ccrama.redditslide.Views.CatchStaggeredGridLayoutManager; import me.ccrama.redditslide.Views.CreateCardView; public class MultiredditAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements BaseAdapter { private final RecyclerView listView; public Activity context; public MultiredditPosts dataSet; public List<Submission> seen; private final int LOADING_SPINNER = 5; private final int NO_MORE = 3; private final int SPACER = 6; SwipeRefreshLayout refreshLayout; MultiredditView baseView; public MultiredditAdapter(Activity context, MultiredditPosts dataSet, RecyclerView listView, SwipeRefreshLayout refreshLayout, MultiredditView baseView) { this.listView = listView; this.dataSet = dataSet; this.context = context; this.seen = new ArrayList<>(); this.refreshLayout = refreshLayout; this.baseView = baseView; } @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 SUBMISSION = 1; return SUBMISSION; } 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 = CreateCardView.CreateView(viewGroup); return new SubmissionViewHolder(v); } } int clicked; public void refreshView() { final RecyclerView.ItemAnimator a = listView.getItemAnimator(); listView.setItemAnimator(null); notifyItemChanged(clicked); listView.postDelayed(new Runnable() { @Override public void run() { listView.setItemAnimator(a); } }, 500); } public void refreshView(ArrayList<Integer> seen) { listView.setItemAnimator(null); final RecyclerView.ItemAnimator a = listView.getItemAnimator(); for (int i : seen) { notifyItemChanged(i + 1); } listView.postDelayed(new Runnable() { @Override public void run() { listView.setItemAnimator(a); } }, 500); } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder2, final int pos) { int i = (pos != 0) ? (pos - 1) : pos; if (holder2 instanceof SubmissionViewHolder) { final SubmissionViewHolder holder = (SubmissionViewHolder) holder2; final Submission submission = dataSet.posts.get(i); CreateCardView.colorCard(submission.getSubredditName().toLowerCase(), holder.itemView, "multi" + dataSet.multiReddit.getDisplayName(), true); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if (Authentication.didOnline || submission.getComments() != null) { holder.title.setAlpha(0.65f); holder.leadImage.setAlpha(0.65f); holder.thumbimage.setAlpha(0.65f); Intent i2 = new Intent(context, CommentsScreen.class); i2.putExtra(CommentsScreen.EXTRA_PAGE, holder2.getAdapterPosition() - 1); i2.putExtra(CommentsScreen.EXTRA_MULTIREDDIT, dataSet.multiReddit.getDisplayName()); context.startActivityForResult(i2, 940); i2.putExtra("fullname", submission.getFullName()); clicked = holder2.getAdapterPosition(); } else { Snackbar s = Snackbar.make(holder.itemView, R.string.offline_comments_not_loaded, Snackbar.LENGTH_SHORT); View view = s.getView(); TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } } }); final boolean saved = submission.isSaved(); new PopulateSubmissionViewHolder().populateSubmissionViewHolder(holder, submission, context, false, false, dataSet.posts, listView, true, false, "multi" + dataSet.multiReddit.getDisplayName().toLowerCase(), null); } 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.findViewById(R.id.reload).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dataSet.loadMore(context, baseView, true, MultiredditAdapter.this); } }); } } 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 } } public class AsyncSave extends AsyncTask<Submission, Void, Void> { View v; public AsyncSave(View v) { this.v = v; } @Override protected Void doInBackground(Submission... submissions) { try { if (ActionStates.isSaved(submissions[0])) { new AccountManager(Authentication.reddit).unsave(submissions[0]); final Snackbar s = Snackbar.make(v, R.string.submission_info_unsaved, Snackbar.LENGTH_SHORT); context.runOnUiThread(new Runnable() { @Override public void run() { View view = s.getView(); TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } }); submissions[0].saved = false; v = null; } else { new AccountManager(Authentication.reddit).save(submissions[0]); final Snackbar s = Snackbar.make(v, R.string.submission_info_saved, Snackbar.LENGTH_SHORT); context.runOnUiThread(new Runnable() { @Override public void run() { View view = s.getView(); TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } }); submissions[0].saved = true; v = null; } } catch (Exception e) { return null; } return null; } } static void fixSliding(int position) { try { Reddit.lastposition.add(position, 0); } catch (IndexOutOfBoundsException e) { fixSliding(position - 1); } } }