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);
}
}
}