package me.ccrama.redditslide.Adapters; /** * Created by ccrama on 3/22/2015. */ import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.os.AsyncTask; import android.os.Build; import android.os.Handler; import android.support.design.widget.Snackbar; 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 com.afollestad.materialdialogs.AlertDialogWrapper; 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.Activities.MainActivity; import me.ccrama.redditslide.Activities.SubredditView; import me.ccrama.redditslide.Authentication; import me.ccrama.redditslide.Fragments.SubmissionsView; import me.ccrama.redditslide.R; import me.ccrama.redditslide.Reddit; import me.ccrama.redditslide.SettingValues; import me.ccrama.redditslide.SubmissionViews.PopulateSubmissionViewHolder; import me.ccrama.redditslide.Views.CatchStaggeredGridLayoutManager; import me.ccrama.redditslide.Views.CreateCardView; import me.ccrama.redditslide.util.LogUtil; import me.ccrama.redditslide.util.OnSingleClickListener; public class SubmissionAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements BaseAdapter { private final RecyclerView listView; public final String subreddit; public Activity context; private final boolean custom; public SubredditPosts dataSet; public List<Submission> seen; private final int LOADING_SPINNER = 5; private final int NO_MORE = 3; private final int SPACER = 6; SubmissionDisplay displayer; public SubmissionAdapter(Activity context, SubredditPosts dataSet, RecyclerView listView, String subreddit, SubmissionDisplay displayer) { this.subreddit = subreddit.toLowerCase(); this.listView = listView; this.dataSet = dataSet; this.context = context; this.seen = new ArrayList<>(); custom = SettingValues.prefs.contains(Reddit.PREF_LAYOUT + subreddit.toLowerCase()); this.displayer = displayer; MainActivity.randomoverride = ""; } @Override public void setError(Boolean b) { listView.setAdapter(new ErrorAdapter()); isError = true; listView.setLayoutManager(SubmissionsView.createLayoutManager(SubmissionsView.getNumColumns(context.getResources().getConfiguration().orientation))); } public boolean isError; @Override public long getItemId(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.offline && !dataSet.nomore) { return LOADING_SPINNER; } else if (position == dataSet.posts.size() && (dataSet.offline || dataSet.nomore)) { return NO_MORE; } return dataSet.posts.get(position).getCreated().getTime(); } @Override public void undoSetError() { listView.setAdapter(this); isError = false; listView.setLayoutManager(SubmissionsView.createLayoutManager(SubmissionsView.getNumColumns(context.getResources().getConfiguration().orientation))); } @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.offline && !dataSet.nomore) { return LOADING_SPINNER; } else if (position == dataSet.posts.size() && (dataSet.offline || 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(boolean ignore18) { 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, subreddit, (subreddit.equals("frontpage") || subreddit.equals("mod") || subreddit.equals("friends") || (subreddit.equals("all")) || subreddit.contains(".") || subreddit.contains("+"))); holder.itemView.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { if (Authentication.didOnline || submission.getComments() != null) { holder.title.setAlpha(0.54f); holder.body.setAlpha(0.54f); if (context instanceof MainActivity) { final MainActivity a = (MainActivity) context; if (a.singleMode && a.commentPager && a.adapter instanceof MainActivity.OverviewPagerAdapterComment) { if (a.openingComments != submission) { clicked = holder2.getAdapterPosition(); a.openingComments = submission; a.toOpenComments = a.pager.getCurrentItem() + 1; a.currentComment = holder.getAdapterPosition() - 1; ((MainActivity.OverviewPagerAdapterComment) (a).adapter).storedFragment = (a).adapter.getCurrentFragment(); ((MainActivity.OverviewPagerAdapterComment) (a).adapter).size = a.toOpenComments + 1; try { a.adapter.notifyDataSetChanged(); } catch(Exception ignored){ } } a.pager.postDelayed(new Runnable() { @Override public void run() { a.pager.setCurrentItem(a.pager.getCurrentItem() + 1, true); } }, 400); } else { Intent i2 = new Intent(context, CommentsScreen.class); i2.putExtra(CommentsScreen.EXTRA_PAGE, holder2.getAdapterPosition() - 1); i2.putExtra(CommentsScreen.EXTRA_SUBREDDIT, subreddit); i2.putExtra("fullname", submission.getFullName()); context.startActivityForResult(i2, 940); clicked = holder2.getAdapterPosition(); } } else if (context instanceof SubredditView) { final SubredditView a = (SubredditView) context; if (a.singleMode && a.commentPager) { if (a.openingComments != submission) { clicked = holder2.getAdapterPosition(); a.openingComments = submission; a.currentComment = holder.getAdapterPosition() - 1; ((SubredditView.OverviewPagerAdapterComment) (a).adapter).storedFragment = (a).adapter.getCurrentFragment(); ((SubredditView.OverviewPagerAdapterComment) a.adapter).size = 3; a.adapter.notifyDataSetChanged(); } a.pager.postDelayed(new Runnable() { @Override public void run() { a.pager.setCurrentItem(a.pager.getCurrentItem() + 1, true); } }, 400); } else { Intent i2 = new Intent(context, CommentsScreen.class); i2.putExtra(CommentsScreen.EXTRA_PAGE, holder2.getAdapterPosition() - 1); i2.putExtra(CommentsScreen.EXTRA_SUBREDDIT, subreddit); i2.putExtra("fullname", submission.getFullName()); context.startActivityForResult(i2, 940); clicked = holder2.getAdapterPosition(); } } } else { if (!Reddit.appRestart.contains("offlinepopup")) { new AlertDialogWrapper.Builder(context).setTitle( R.string.cache_no_comments_found) .setMessage(R.string.cache_no_comments_found_message) .setCancelable(false) .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Reddit.appRestart.edit() .putString("offlinepopup", "") .apply(); } }) .show(); } else { Snackbar s = Snackbar.make(holder.itemView, R.string.cache_no_comments_found_snackbar, Snackbar.LENGTH_SHORT); s.setAction(R.string.misc_more_info, new View.OnClickListener() { @Override public void onClick(View v) { new AlertDialogWrapper.Builder(context).setTitle( R.string.cache_no_comments_found) .setMessage(R.string.cache_no_comments_found_message) .setCancelable(false) .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Reddit.appRestart.edit() .putString("offlinepopup", "") .apply(); } }) .show(); } }); View view = s.getView(); TextView tv = (TextView) view.findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } } } } ); new PopulateSubmissionViewHolder().populateSubmissionViewHolder(holder, submission, context, false, false, dataSet.posts, listView, custom, dataSet.offline, dataSet.subreddit.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, displayer, true); } }); } } if (holder2 instanceof SpacerViewHolder) { View header = (context).findViewById(R.id.header); int height = header.getHeight(); if (height == 0) { header.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); height = header.getMeasuredHeight(); 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); } } else { 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; } } public void performClick(int adapterPosition) { if (listView != null) { RecyclerView.ViewHolder holder = listView.findViewHolderForLayoutPosition(adapterPosition); if (holder != null) { View view = holder.itemView; if (view != null) { view.performClick(); } } } } }