Fixed infinite loading duplicate posts when there is no more posts to load. Minor bugs fixed. Minor layout tweaks.

This commit is contained in:
Alex Ning 2019-01-22 01:05:46 +08:00
parent 91e6174aa5
commit f7a192dcbe
3 changed files with 128 additions and 113 deletions

View File

@ -87,7 +87,6 @@ class ParsePost {
int previewWidth = -1; int previewWidth = -1;
int previewHeight = -1; int previewHeight = -1;
if(data.has(JSONUtils.PREVIEW_KEY)) { if(data.has(JSONUtils.PREVIEW_KEY)) {
Log.i("haspreview", Integer.toString(i));
previewUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0) previewUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0)
.getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY); .getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
previewWidth = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0) previewWidth = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0)
@ -95,7 +94,6 @@ class ParsePost {
previewHeight = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0) previewHeight = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0)
.getJSONObject(JSONUtils.SOURCE_KEY).getInt(JSONUtils.HEIGHT_KEY); .getJSONObject(JSONUtils.SOURCE_KEY).getInt(JSONUtils.HEIGHT_KEY);
} }
if(data.has(JSONUtils.CROSSPOST_PARENT_LIST)) { if(data.has(JSONUtils.CROSSPOST_PARENT_LIST)) {
//Cross post //Cross post
data = data.getJSONArray(JSONUtils.CROSSPOST_PARENT_LIST).getJSONObject(0); data = data.getJSONArray(JSONUtils.CROSSPOST_PARENT_LIST).getJSONObject(0);
@ -160,129 +158,136 @@ class ParsePost {
} }
bestPostData.add(linkPost); bestPostData.add(linkPost);
} }
} else if(isVideo) { } else {
//Video post if(previewUrl.equals("")) {
Log.i("video", Integer.toString(i)); previewUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0)
JSONObject redditVideoObject = data.getJSONObject(JSONUtils.MEDIA_KEY).getJSONObject(JSONUtils.REDDIT_VIDEO_KEY); .getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
int postType = Post.VIDEO_TYPE; }
String videoUrl = redditVideoObject.getString(JSONUtils.DASH_URL_KEY);
Post videoPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, if(isVideo) {
title, previewUrl, permalink, score, postType, voteType, //Video post
gilded, nsfw, stickied, isCrosspost, true); Log.i("video", Integer.toString(i));
JSONObject redditVideoObject = data.getJSONObject(JSONUtils.MEDIA_KEY).getJSONObject(JSONUtils.REDDIT_VIDEO_KEY);
int postType = Post.VIDEO_TYPE;
String videoUrl = redditVideoObject.getString(JSONUtils.DASH_URL_KEY);
videoPost.setPreviewWidth(previewWidth); Post videoPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime,
videoPost.setPreviewHeight(previewHeight); title, previewUrl, permalink, score, postType, voteType,
videoPost.setVideoUrl(videoUrl);
videoPost.setDownloadableGifOrVideo(false);
bestPostData.add(videoPost);
} else if(data.has(JSONUtils.PREVIEW_KEY)){
JSONObject variations = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0);
if (variations.has(JSONUtils.VARIANTS_KEY) && variations.getJSONObject(JSONUtils.VARIANTS_KEY).has(JSONUtils.MP4_KEY)) {
//Gif video post (MP4)
Log.i("gif video mp4", Integer.toString(i));
int postType = Post.GIF_VIDEO_TYPE;
String videoUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.MP4_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
String gifDownloadUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
Post post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title,
previewUrl, permalink, score, postType, voteType,
gilded, nsfw, stickied, isCrosspost, false);
post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight);
post.setVideoUrl(videoUrl);
post.setDownloadableGifOrVideo(true);
post.setGifOrVideoDownloadUrl(gifDownloadUrl);
bestPostData.add(post);
} else if(data.getJSONObject(JSONUtils.PREVIEW_KEY).has(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY)) {
//Gif video post (Dash)
Log.i("gif video dash", Integer.toString(i));
int postType = Post.GIF_VIDEO_TYPE;
String videoUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY)
.getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.DASH_URL_KEY);
Post post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title,
previewUrl, permalink, score, postType, voteType,
gilded, nsfw, stickied, isCrosspost, true); gilded, nsfw, stickied, isCrosspost, true);
post.setPreviewWidth(previewWidth); videoPost.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight); videoPost.setPreviewHeight(previewHeight);
post.setVideoUrl(videoUrl); videoPost.setVideoUrl(videoUrl);
post.setDownloadableGifOrVideo(false); videoPost.setDownloadableGifOrVideo(false);
bestPostData.add(post); bestPostData.add(videoPost);
} else if(data.has(JSONUtils.PREVIEW_KEY)){
JSONObject variations = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0);
if (variations.has(JSONUtils.VARIANTS_KEY) && variations.getJSONObject(JSONUtils.VARIANTS_KEY).has(JSONUtils.MP4_KEY)) {
//Gif video post (MP4)
Log.i("gif video mp4", Integer.toString(i));
int postType = Post.GIF_VIDEO_TYPE;
String videoUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.MP4_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
String gifDownloadUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
Post post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title,
previewUrl, permalink, score, postType, voteType,
gilded, nsfw, stickied, isCrosspost, false);
post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight);
post.setVideoUrl(videoUrl);
post.setDownloadableGifOrVideo(true);
post.setGifOrVideoDownloadUrl(gifDownloadUrl);
bestPostData.add(post);
} else if(data.getJSONObject(JSONUtils.PREVIEW_KEY).has(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY)) {
//Gif video post (Dash)
Log.i("gif video dash", Integer.toString(i));
int postType = Post.GIF_VIDEO_TYPE;
String videoUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY)
.getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.DASH_URL_KEY);
Post post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title,
previewUrl, permalink, score, postType, voteType,
gilded, nsfw, stickied, isCrosspost, true);
post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight);
post.setVideoUrl(videoUrl);
post.setDownloadableGifOrVideo(false);
bestPostData.add(post);
} else {
if (url.endsWith("jpg") || url.endsWith("png")) {
//Image post
Log.i("image", Integer.toString(i));
int postType = Post.IMAGE_TYPE;
Post imagePost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime,
title, url, url, permalink, score, postType,
voteType, gilded, nsfw, stickied, isCrosspost);
imagePost.setPreviewWidth(previewWidth);
imagePost.setPreviewHeight(previewHeight);
bestPostData.add(imagePost);
} else {
if (url.contains(permalink)) {
//Text post but with a preview
Log.i("text with image", Integer.toString(i));
int postType = Post.TEXT_TYPE;
Post textWithImagePost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime,
title, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost);
textWithImagePost.setPreviewWidth(previewWidth);
textWithImagePost.setPreviewHeight(previewHeight);
if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) {
textWithImagePost.setSelfText("");
} else {
textWithImagePost.setSelfText(data.getString(JSONUtils.SELFTEXT_HTML_KEY).trim());
}
bestPostData.add(textWithImagePost);
} else {
//Link post
Log.i("link", Integer.toString(i));
int postType = Post.LINK_TYPE;
Post linkPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime,
title, previewUrl, url, permalink, score,
postType, voteType, gilded, nsfw, stickied, isCrosspost);
if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) {
linkPost.setSelfText("");
} else {
linkPost.setSelfText(data.getString(JSONUtils.SELFTEXT_HTML_KEY).trim());
}
linkPost.setPreviewWidth(previewWidth);
linkPost.setPreviewHeight(previewHeight);
bestPostData.add(linkPost);
}
}
}
} else { } else {
if (url.endsWith("jpg") || url.endsWith("png")) { if (url.endsWith("jpg") || url.endsWith("png")) {
//Image post //Image post
Log.i("image", Integer.toString(i)); Log.i("CP image", Integer.toString(i));
int postType = Post.IMAGE_TYPE; int postType = Post.IMAGE_TYPE;
Post linkPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime,
Post imagePost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, url, permalink, score, postType,
title, url, url, permalink, score, postType,
voteType, gilded, nsfw, stickied, isCrosspost); voteType, gilded, nsfw, stickied, isCrosspost);
linkPost.setPreviewWidth(previewWidth);
imagePost.setPreviewWidth(previewWidth); linkPost.setPreviewHeight(previewHeight);
imagePost.setPreviewHeight(previewHeight); bestPostData.add(linkPost);
bestPostData.add(imagePost);
} else { } else {
if (url.contains(permalink)) { //CP No Preview Link post
//Text post but with a preview Log.i("CP no preview link", Integer.toString(i));
Log.i("text with image", Integer.toString(i)); int postType = Post.NO_PREVIEW_LINK_TYPE;
int postType = Post.TEXT_TYPE; bestPostData.add(new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title,
Post textWithImagePost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, url, url, permalink, score, postType, voteType,
title, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); gilded, nsfw, stickied, isCrosspost));
textWithImagePost.setPreviewWidth(previewWidth);
textWithImagePost.setPreviewHeight(previewHeight);
if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) {
textWithImagePost.setSelfText("");
} else {
textWithImagePost.setSelfText(data.getString(JSONUtils.SELFTEXT_HTML_KEY).trim());
}
bestPostData.add(textWithImagePost);
} else {
//Link post
Log.i("link", Integer.toString(i));
int postType = Post.LINK_TYPE;
Post linkPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime,
title, previewUrl, url, permalink, score,
postType, voteType, gilded, nsfw, stickied, isCrosspost);
if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) {
linkPost.setSelfText("");
} else {
linkPost.setSelfText(data.getString(JSONUtils.SELFTEXT_HTML_KEY).trim());
}
linkPost.setPreviewWidth(previewWidth);
linkPost.setPreviewHeight(previewHeight);
bestPostData.add(linkPost);
}
} }
} }
} else {
if (url.endsWith("jpg") || url.endsWith("png")) {
//Image post
Log.i("CP image", Integer.toString(i));
int postType = Post.IMAGE_TYPE;
Post linkPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime,
title, previewUrl, url, permalink, score, postType,
voteType, gilded, nsfw, stickied, isCrosspost);
linkPost.setPreviewWidth(previewWidth);
linkPost.setPreviewHeight(previewHeight);
bestPostData.add(linkPost);
} else {
//CP No Preview Link post
Log.i("CP no preview link", Integer.toString(i));
int postType = Post.NO_PREVIEW_LINK_TYPE;
bestPostData.add(new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title,
url, url, permalink, score, postType, voteType,
gilded, nsfw, stickied, isCrosspost));
}
} }
} }
} }

View File

@ -16,6 +16,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
static final int TYPE_FRONT_PAGE = 0; static final int TYPE_FRONT_PAGE = 0;
static final int TYPE_SUBREDDIT = 1; static final int TYPE_SUBREDDIT = 1;
static final int TYPE_USER = 2; static final int TYPE_USER = 2;
private Retrofit retrofit; private Retrofit retrofit;
private String accessToken; private String accessToken;
private Locale locale; private Locale locale;
@ -86,6 +87,10 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
this.params = params; this.params = params;
this.callback = callback; this.callback = callback;
if(params.key.equals("null")) {
return;
}
paginationNetworkStateLiveData.postValue(NetworkState.LOADING); paginationNetworkStateLiveData.postValue(NetworkState.LOADING);
switch (postType) { switch (postType) {

View File

@ -82,6 +82,7 @@
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:textSize="12sp" android:textSize="12sp"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:layout_centerVertical="true"
app:chipBackgroundColor="@color/colorPrimaryDark"/> app:chipBackgroundColor="@color/colorPrimaryDark"/>
<ImageView <ImageView
@ -90,6 +91,7 @@
android:layout_height="24dp" android:layout_height="24dp"
android:layout_toEndOf="@id/type_text_view_item_best_post" android:layout_toEndOf="@id/type_text_view_item_best_post"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_centerVertical="true"
android:visibility="gone"/> android:visibility="gone"/>
<TextView <TextView
@ -102,7 +104,8 @@
android:layout_toEndOf="@id/gilded_image_view_item_best_post" android:layout_toEndOf="@id/gilded_image_view_item_best_post"
android:visibility="gone" android:visibility="gone"
android:textSize="20sp" android:textSize="20sp"
android:textColor="@color/gold"/> android:textColor="@color/gold"
android:layout_centerVertical="true"/>
<ImageView <ImageView
android:id="@+id/crosspost_image_view_item_best_post" android:id="@+id/crosspost_image_view_item_best_post"
@ -115,6 +118,7 @@
android:layout_toEndOf="@id/gilded_number_text_view_item_best_post" android:layout_toEndOf="@id/gilded_number_text_view_item_best_post"
android:src="@drawable/crosspost" android:src="@drawable/crosspost"
android:tint="@color/colorAccent" android:tint="@color/colorAccent"
android:layout_centerVertical="true"
android:visibility="gone"/> android:visibility="gone"/>
<android.support.design.chip.Chip <android.support.design.chip.Chip
@ -128,6 +132,7 @@
android:textSize="12sp" android:textSize="12sp"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:visibility="gone" android:visibility="gone"
android:layout_centerVertical="true"
app:chipBackgroundColor="@color/colorAccent"/> app:chipBackgroundColor="@color/colorAccent"/>
</RelativeLayout> </RelativeLayout>