package me.ccrama.redditslide.Adapters; import android.content.Context; import android.os.AsyncTask; import net.dean.jraw.models.Subreddit; import net.dean.jraw.paginators.Paginator; import net.dean.jraw.paginators.SubredditSearchPaginator; import net.dean.jraw.paginators.SubredditStream; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import me.ccrama.redditslide.Authentication; import me.ccrama.redditslide.Constants; import me.ccrama.redditslide.Fragments.SubredditListView; import me.ccrama.redditslide.PostMatch; import me.ccrama.redditslide.Reddit; import me.ccrama.redditslide.SettingValues; /** * This class is reponsible for loading a list of subreddits from an endpoint * {@link loadMore(Context, SubmissionDisplay, boolean, String)} is implemented * asynchronously. * <p/> * Created by ccrama on 3/21/2016. */ public class SubredditNames { public List<Subreddit> posts; public String where; public boolean nomore = false; public boolean stillShow; public boolean loading; public SubredditListView parent; private Paginator<Subreddit> paginator; Context c; public SubredditNames(String where, Context c, SubredditListView parent) { posts = new ArrayList<>(); this.parent = parent; this.where = where; this.c = c; } public void loadMore(Context context, boolean reset) { new LoadData(context, reset).execute(where); } public void loadMore(Context context, boolean reset, String where) { this.where = where; loadMore(context, reset); } public List<Subreddit> getPosts() { return posts; } /** * Asynchronous task for loading data */ private class LoadData extends AsyncTask<String, Void, List<Subreddit>> { final boolean reset; Context context; public LoadData(Context context, boolean reset) { this.context = context; this.reset = reset; } @Override public void onPostExecute(List<Subreddit> submissions) { loading = false; context = null; if (submissions != null && !submissions.isEmpty()) { ArrayList<Subreddit> toRemove = new ArrayList<>(); for (Subreddit s : submissions) { if (!SettingValues.subredditFilters.isEmpty() && PostMatch.contains(s.getDisplayName().toLowerCase(), PostMatch.subreddits, true)) toRemove.add(s); } submissions.removeAll(toRemove); // new submissions found int start = 0; if (posts != null) { start = posts.size() + 1; } if (reset || posts == null) { posts = new ArrayList<>(new LinkedHashSet(submissions)); start = -1; } else { posts.addAll(submissions); posts = new ArrayList<>(new LinkedHashSet(posts)); } final int finalStart = start; //update online parent.updateSuccess(posts, finalStart); } else if (!nomore) { parent.updateError(); } } @Override protected List<Subreddit> doInBackground(String... subredditPaginators) { List<Subreddit> things = new ArrayList<>(); if (PostMatch.subreddits == null) PostMatch.subreddits = SettingValues.subredditFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); if (subredditPaginators[0].equalsIgnoreCase("trending")) { List<String> trending = Authentication.reddit.getTrendingSubreddits(); for (String s : trending) { things.add(Authentication.reddit.getSubreddit(s)); } nomore = true; } else if (subredditPaginators[0].equalsIgnoreCase("popular")) { stillShow = true; if (reset || paginator == null) { paginator = new SubredditStream(Authentication.reddit, subredditPaginators[0]); paginator.setSorting(SettingValues.getSubmissionSort(where)); paginator.setTimePeriod(SettingValues.getSubmissionTimePeriod(where)); paginator.setLimit(Constants.PAGINATOR_POST_LIMIT); } try { if (paginator != null && paginator.hasNext()) { things.addAll(paginator.next()); } else { nomore = true; } } catch (Exception e) { e.printStackTrace(); if (e.getMessage().contains("Forbidden")) { Reddit.authentication.updateToken(context); } } } else { stillShow = true; if (reset || paginator == null) { paginator = new SubredditSearchPaginator(Authentication.reddit, subredditPaginators[0]); paginator.setSorting(SettingValues.getSubmissionSort(where)); paginator.setTimePeriod(SettingValues.getSubmissionTimePeriod(where)); paginator.setLimit(Constants.PAGINATOR_POST_LIMIT); } try { if (paginator != null && paginator.hasNext()) { things.addAll(paginator.next()); } else { nomore = true; } } catch (Exception e) { e.printStackTrace(); if (e.getMessage().contains("Forbidden")) { Reddit.authentication.updateToken(context); } } } return things; } } }