package me.ccrama.redditslide.Adapters;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.text.Html;
import android.view.View;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import net.dean.jraw.models.MultiReddit;
import net.dean.jraw.models.Submission;
import net.dean.jraw.paginators.MultiRedditPaginator;
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.ContentType;
import me.ccrama.redditslide.HasSeen;
import me.ccrama.redditslide.LastComments;
import me.ccrama.redditslide.OfflineSubreddit;
import me.ccrama.redditslide.PostLoader;
import me.ccrama.redditslide.PostMatch;
import me.ccrama.redditslide.Reddit;
import me.ccrama.redditslide.SettingValues;
import me.ccrama.redditslide.SubmissionCache;
import me.ccrama.redditslide.Synccit.MySynccitReadTask;
import me.ccrama.redditslide.UserSubscriptions;
import me.ccrama.redditslide.util.LogUtil;
import me.ccrama.redditslide.util.NetworkUtil;
/**
* This class is reponsible for loading subreddit specific submissions
* {@link loadMore(Context, SubmissionDisplay, boolean, String)} is implemented
* asynchronously.
* <p>
* Created by ccrama on 9/17/2015.
*/
public class MultiredditPosts implements PostLoader {
public List<Submission> posts;
public boolean nomore = false;
public boolean stillShow;
public boolean offline;
public boolean loading;
public String profile;
private MultiRedditPaginator paginator;
Context c;
MultiredditAdapter adapter;
public MultiredditPosts(String multireddit) {
this(multireddit, "");
}
public MultiredditPosts(String multireddit, String profile) {
posts = new ArrayList<>();
LogUtil.e("MJWHITTA: Profile is " + profile + ".");
LogUtil.e("MJWHITTA: Multireddit is " + multireddit + ".");
if (profile.isEmpty()) {
this.multiReddit = UserSubscriptions.getMultiredditByDisplayName(multireddit);
} else {
this.multiReddit = UserSubscriptions.getPublicMultiredditByDisplayName(profile, multireddit);
}
this.profile = profile;
}
@Override
public void loadMore(Context context, SubmissionDisplay displayer, boolean reset) {
this.c = context;
new LoadData(context, displayer, reset).execute(multiReddit);
}
public void loadMore(Context context, SubmissionDisplay displayer, boolean reset, MultiredditAdapter adapter) {
this.adapter = adapter;
this.c = context;
loadMore(context, displayer, reset);
}
public void loadPhotos(List<Submission> submissions) {
for (Submission submission : submissions) {
String url;
ContentType.Type type = ContentType.getContentType(submission);
if (submission.getThumbnails() != null) {
if (type == ContentType.Type.IMAGE
|| type == ContentType.Type.SELF
|| (submission.getThumbnailType() == Submission.ThumbnailType.URL)) {
if (type == ContentType.Type.IMAGE) {
if (((!NetworkUtil.isConnectedWifi(c) && SettingValues.lowResMobile)
|| SettingValues.lowResAlways)
&& submission.getThumbnails() != null
&& submission.getThumbnails().getVariations() != null
&& submission.getThumbnails().getVariations().length > 0) {
int length = submission.getThumbnails().getVariations().length;
if (SettingValues.lqLow && length >= 3) {
url = Html.fromHtml(
submission.getThumbnails().getVariations()[2].getUrl())
.toString(); //unescape url characters
} else if (SettingValues.lqMid && length >= 4) {
url = Html.fromHtml(
submission.getThumbnails().getVariations()[3].getUrl())
.toString(); //unescape url characters
} else if (length >= 5) {
url = Html.fromHtml(submission.getThumbnails().getVariations()[
length
- 1].getUrl()).toString(); //unescape url characters
} else {
url = Html.fromHtml(submission.getThumbnails().getSource().getUrl())
.toString(); //unescape url characters
}
} else {
if (submission.getDataNode().has("preview") && submission.getDataNode()
.get("preview")
.get("images")
.get(0)
.get("source")
.has("height")) { //Load the preview image which has probably already been cached in memory instead of the direct link
url = submission.getDataNode()
.get("preview")
.get("images")
.get(0)
.get("source")
.get("url")
.asText();
} else {
url = submission.getUrl();
}
}
((Reddit) c.getApplicationContext()).getImageLoader()
.loadImage(url, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
} else if (submission.getThumbnails() != null) {
if (((!NetworkUtil.isConnectedWifi(c) && SettingValues.lowResMobile)
|| SettingValues.lowResAlways)
&& submission.getThumbnails().getVariations().length != 0) {
int length = submission.getThumbnails().getVariations().length;
if (SettingValues.lqLow && length >= 3) {
url = Html.fromHtml(
submission.getThumbnails().getVariations()[2].getUrl())
.toString(); //unescape url characters
} else if (SettingValues.lqMid && length >= 4) {
url = Html.fromHtml(
submission.getThumbnails().getVariations()[3].getUrl())
.toString(); //unescape url characters
} else if (length >= 5) {
url = Html.fromHtml(submission.getThumbnails().getVariations()[
length
- 1].getUrl()).toString(); //unescape url characters
} else {
url = Html.fromHtml(submission.getThumbnails().getSource().getUrl())
.toString(); //unescape url characters
}
} else {
url = Html.fromHtml(submission.getThumbnails().getSource().getUrl())
.toString(); //unescape url characters
}
((Reddit) c.getApplicationContext()).getImageLoader()
.loadImage(url, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
} else if (submission.getThumbnail() != null && (submission.getThumbnailType()
== Submission.ThumbnailType.URL
|| submission.getThumbnailType() == Submission.ThumbnailType.NSFW)) {
((Reddit) c.getApplicationContext()).getImageLoader()
.loadImage(submission.getUrl(), new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
}
}
}
}
}
@Override
public List<Submission> getPosts() {
return posts;
}
public MultiReddit multiReddit;
@Override
public boolean hasMore() {
return !nomore;
}
public boolean skipOne;
boolean usedOffline;
/**
* Asynchronous task for loading data
*/
private class LoadData extends AsyncTask<MultiReddit, Void, List<Submission>> {
final boolean reset;
Context context;
final SubmissionDisplay displayer;
public LoadData(Context context, SubmissionDisplay displayer, boolean reset) {
this.context = context;
this.displayer = displayer;
this.reset = reset;
}
@Override
public void onPostExecute(List<Submission> submissions) {
loading = false;
if (submissions != null && !submissions.isEmpty()) {
// new submissions found
int start = 0;
if (posts != null) {
start = posts.size() + 1;
}
if (reset || offline || posts == null) {
posts = new ArrayList<>(new LinkedHashSet(submissions));
start = -1;
} else {
posts.addAll(submissions);
posts = new ArrayList<>(new LinkedHashSet(posts));
offline = false;
}
if (!usedOffline)
OfflineSubreddit.getSubreddit("multi" + multiReddit.getDisplayName().toLowerCase(), false, context).overwriteSubmissions(posts).writeToMemory(c);
String[] ids = new String[submissions.size()];
int i = 0;
for (Submission s : submissions) {
ids[i] = s.getId();
i++;
}
if (!SettingValues.synccitName.isEmpty() && !offline) {
new MySynccitReadTask().execute(ids);
}
final int finalStart = start;
// update online
displayer.updateSuccess(posts, finalStart);
} else if (submissions != null) {
// end of submissions
nomore = true;
} else if (!OfflineSubreddit.getSubreddit("multi" + multiReddit.getDisplayName().toLowerCase(), false, context).submissions.isEmpty() && !nomore && SettingValues.cache) {
offline = true;
final OfflineSubreddit cached = OfflineSubreddit.getSubreddit("multi" + multiReddit.getDisplayName().toLowerCase(), true, context);
List<Submission> finalSubs = new ArrayList<>();
for (Submission s : cached.submissions) {
if (!PostMatch.doesMatch(s, "multi" + multiReddit.getDisplayName().toLowerCase(), false)) {
finalSubs.add(s);
}
}
posts = finalSubs;
if (!cached.submissions.isEmpty()) {
stillShow = true;
} else {
displayer.updateOfflineError();
}
// update offline
displayer.updateOffline(submissions, cached.time);
} else if (!nomore) {
// error
displayer.updateError();
}
}
@Override
protected List<Submission> doInBackground(MultiReddit... subredditPaginators) {
if (!NetworkUtil.isConnected(context)) {
offline = true;
return null;
} else {
offline = false;
}
stillShow = true;
if (reset || paginator == null) {
offline = false;
paginator = new MultiRedditPaginator(Authentication.reddit, subredditPaginators[0]);
paginator.setSorting(SettingValues.getSubmissionSort(
"multi" + subredditPaginators[0].getDisplayName().toLowerCase()));
paginator.setTimePeriod(SettingValues.getSubmissionTimePeriod("multi" + subredditPaginators[0].getDisplayName().toLowerCase()));
paginator.setLimit(Constants.PAGINATOR_POST_LIMIT);
}
List<Submission> things = new ArrayList<>();
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);
}
}
List<Submission> filteredSubmissions = new ArrayList<>();
for (Submission s : things) {
if (!PostMatch.doesMatch(s, paginator.getMultiReddit().getDisplayName(), false)) {
filteredSubmissions.add(s);
}
}
HasSeen.setHasSeenSubmission(filteredSubmissions);
SubmissionCache.cacheSubmissions(filteredSubmissions, context, paginator.getMultiReddit().getDisplayName());
if (!(SettingValues.noImages && ((!NetworkUtil.isConnectedWifi(c) && SettingValues.lowResMobile) || SettingValues.lowResAlways)))
loadPhotos(filteredSubmissions);
if (SettingValues.storeHistory) LastComments.setCommentsSince(filteredSubmissions);
return filteredSubmissions;
}
}
}