package me.ccrama.redditslide.Adapters;
import android.app.Activity;
import android.os.AsyncTask;
import android.support.v4.widget.SwipeRefreshLayout;
import android.widget.Toast;
import net.dean.jraw.http.NetworkException;
import net.dean.jraw.models.Contribution;
import net.dean.jraw.models.Submission;
import net.dean.jraw.paginators.Paginator;
import net.dean.jraw.paginators.SubmissionSearchPaginator;
import net.dean.jraw.paginators.SubmissionSearchPaginatorMultireddit;
import net.dean.jraw.paginators.TimePeriod;
import java.net.UnknownHostException;
import java.util.ArrayList;
import me.ccrama.redditslide.Activities.MultiredditOverview;
import me.ccrama.redditslide.Authentication;
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 SubredditSearchPosts extends GeneralPosts {
private String term;
private String subreddit = "";
public boolean loading;
private Paginator<Submission> paginator;
public SwipeRefreshLayout refreshLayout;
private ContributionAdapter adapter;
public Activity parent;
public SubredditSearchPosts(String subreddit, String term, Activity parent) {
if (subreddit != null) {
this.subreddit = subreddit;
}
this.parent = parent;
this.term = term;
}
public void bindAdapter(ContributionAdapter a, SwipeRefreshLayout layout) {
this.adapter = a;
this.refreshLayout = layout;
loadMore(a, subreddit, term, true);
}
public void loadMore(ContributionAdapter a, String subreddit, String where, boolean reset) {
this.adapter = a;
this.subreddit = subreddit;
this.term = where;
new LoadData(reset).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void loadMore(ContributionAdapter a, String subreddit, String where, boolean reset,
boolean multi, TimePeriod time) {
this.adapter = a;
this.subreddit = subreddit;
this.term = where;
this.multireddit = multi;
this.time = time;
new LoadData(reset).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
boolean multireddit;
TimePeriod time = TimePeriod.ALL;
public void reset(TimePeriod time) {
this.time = time;
new LoadData(true).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
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(error != null){
if(error instanceof NetworkException){
NetworkException e = (NetworkException)error;
Toast.makeText(adapter.mContext,"Loading failed, " + e.getResponse().getStatusCode() + ": " + ((NetworkException) error).getResponse().getStatusMessage(), Toast.LENGTH_LONG).show();
}
if(error.getCause() instanceof UnknownHostException){
Toast.makeText(adapter.mContext,"Loading failed, please check your internet connection", Toast.LENGTH_LONG).show();
}
}
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);
}
}
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> newSubmissions = new ArrayList<>();
try {
if (reset || paginator == null) {
if (multireddit) {
paginator = new SubmissionSearchPaginatorMultireddit(Authentication.reddit,
term);
((SubmissionSearchPaginatorMultireddit) paginator).setMultiReddit(
MultiredditOverview.searchMulti);
((SubmissionSearchPaginatorMultireddit) paginator).setSearchSorting(
SubmissionSearchPaginatorMultireddit.SearchSort.valueOf(
Reddit.search.toString()));
((SubmissionSearchPaginatorMultireddit) paginator).setSyntax(
SubmissionSearchPaginatorMultireddit.SearchSyntax.LUCENE);
} else {
paginator = new SubmissionSearchPaginator(Authentication.reddit, term);
if (!subreddit.isEmpty()) {
((SubmissionSearchPaginator) paginator).setSubreddit(subreddit);
}
((SubmissionSearchPaginator) paginator).setSearchSorting(Reddit.search);
((SubmissionSearchPaginator) paginator).setSyntax(
SubmissionSearchPaginator.SearchSyntax.LUCENE);
}
paginator.setTimePeriod((time));
}
if (!paginator.hasNext()) {
nomore = true;
return newSubmissions;
}
for (Submission s : paginator.next()) {
newSubmissions.add(s);
}
return newSubmissions;
} catch (Exception e) {
error = e;
e.printStackTrace();
return null;
}
}
Exception error;
}
}