package me.ccrama.redditslide.Adapters; import android.os.AsyncTask; import android.support.v4.widget.SwipeRefreshLayout; import net.dean.jraw.models.Contribution; import net.dean.jraw.models.Submission; import net.dean.jraw.paginators.Sorting; import net.dean.jraw.paginators.TimePeriod; import net.dean.jraw.paginators.UserContributionPaginator; import java.util.ArrayList; import me.ccrama.redditslide.Authentication; import me.ccrama.redditslide.HasSeen; import me.ccrama.redditslide.PostMatch; import me.ccrama.redditslide.Reddit; import me.ccrama.redditslide.util.LogUtil; /** * Created by ccrama on 9/17/2015. */ public class ContributionPosts extends GeneralPosts { protected final String where; protected final String subreddit; public boolean loading; private UserContributionPaginator paginator; protected SwipeRefreshLayout refreshLayout; protected ContributionAdapter adapter; public ContributionPosts(String subreddit, String where) { this.subreddit = subreddit; this.where = where; } public void bindAdapter(ContributionAdapter a, SwipeRefreshLayout layout) { this.adapter = a; this.refreshLayout = layout; loadMore(a, subreddit, true); } public void loadMore(ContributionAdapter adapter, String subreddit, boolean reset) { new LoadData(reset).execute(subreddit); } public class LoadData extends AsyncTask<String, Void, ArrayList<Contribution>> { final boolean reset; public LoadData(boolean reset) { this.reset = reset; } @Override public void onPostExecute(ArrayList<Contribution> submissions) { loading = false; if (submissions != null && !submissions.isEmpty()) { // new submissions found int start = 0; if (posts != null) { start = posts.size() + 1; } ArrayList<Contribution> filteredSubmissions = new ArrayList<>(); for (Contribution c : submissions) { if (c instanceof Submission) { if (!PostMatch.doesMatch((Submission) c)) { filteredSubmissions.add(c); } } else { filteredSubmissions.add(c); } } HasSeen.setHasSeenContrib(filteredSubmissions); if (reset || posts == null) { posts = filteredSubmissions; start = -1; } else { posts.addAll(filteredSubmissions); } final int finalStart = start; // update online if (refreshLayout != null) { refreshLayout.setRefreshing(false); } if (finalStart != -1) { adapter.notifyItemRangeInserted(finalStart + 1, posts.size()); } else { adapter.notifyDataSetChanged(); } } else if (submissions != null) { // end of submissions nomore = true; adapter.notifyDataSetChanged(); } else if (!nomore) { // error adapter.setError(true); } refreshLayout.setRefreshing(false); } @Override protected ArrayList<Contribution> doInBackground(String... subredditPaginators) { ArrayList<Contribution> newData = new ArrayList<>(); try { if (reset || paginator == null) { paginator = new UserContributionPaginator(Authentication.reddit, where, subreddit); paginator.setSorting(Reddit.getSorting(subreddit, Sorting.NEW)); paginator.setTimePeriod(Reddit.getTime(subreddit, TimePeriod.ALL)); } if (!paginator.hasNext()) { nomore = true; return new ArrayList<>(); } for (Contribution c : paginator.next()) { if (c instanceof Submission) { Submission s = (Submission) c; newData.add(s); } else { newData.add(c); } } return newData; } catch (Exception e) { return null; } } } }