aboutsummaryrefslogtreecommitdiff
path: root/app/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java4
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/FullMarkdownActivity.java4
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/WikiActivity.java5
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsListingRecyclerViewAdapter.java5
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsRecyclerViewAdapter.java5
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java10
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java5
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SidebarFragment.java4
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlock.java7
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java20
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java2
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java18
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/MarkdownUtils.java3
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java62
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java233
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java1
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java7
17 files changed, 301 insertions, 94 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java
index 2a03a058..e62f8773 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java
@@ -64,6 +64,7 @@ import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed;
import ml.docilealligator.infinityforreddit.databinding.ActivityCommentBinding;
import ml.docilealligator.infinityforreddit.events.SwitchAccountEvent;
+import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.utils.Utils;
@@ -207,8 +208,9 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
builder.linkColor(linkColor);
}
};
+ ImageAndGifPlugin imageAndGifPlugin = new ImageAndGifPlugin();
Markwon postBodyMarkwon = MarkdownUtils.createFullRedditMarkwon(this,
- miscPlugin, parentTextColor, parentSpoilerBackgroundColor, null);
+ miscPlugin, imageAndGifPlugin, parentTextColor, parentSpoilerBackgroundColor, null);
MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter(this, mGlide);
binding.commentContentMarkdownView.setLayoutManager(new LinearLayoutManagerBugFixed(this));
binding.commentContentMarkdownView.setAdapter(markwonAdapter);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/FullMarkdownActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/FullMarkdownActivity.java
index aac1cc82..d92ecda7 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/FullMarkdownActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/FullMarkdownActivity.java
@@ -44,6 +44,7 @@ import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.customviews.slidr.Slidr;
import ml.docilealligator.infinityforreddit.events.SwitchAccountEvent;
+import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
@@ -139,8 +140,9 @@ public class FullMarkdownActivity extends BaseActivity {
builder.linkColor(linkColor);
}
};
+ ImageAndGifPlugin imageAndGifPlugin = new ImageAndGifPlugin();
Markwon markwon = MarkdownUtils.createFullRedditMarkwon(this,
- miscPlugin, markdownColor, spoilerBackgroundColor, null);
+ miscPlugin, imageAndGifPlugin, markdownColor, spoilerBackgroundColor, null);
MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter(this, Glide.with(this));
LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(this, new SwipeLockInterface() {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/WikiActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/WikiActivity.java
index 78b957d3..56bef8fb 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/WikiActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/WikiActivity.java
@@ -52,6 +52,7 @@ import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.customviews.slidr.Slidr;
import ml.docilealligator.infinityforreddit.events.SwitchAccountEvent;
+import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.utils.JSONUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
@@ -95,6 +96,7 @@ public class WikiActivity extends BaseActivity {
@Inject
CustomThemeWrapper mCustomThemeWrapper;
private String wikiMarkdown;
+ private ImageAndGifPlugin imageAndGifPlugin;
private Markwon markwon;
private MarkwonAdapter markwonAdapter;
private boolean isRefreshing = false;
@@ -175,8 +177,9 @@ public class WikiActivity extends BaseActivity {
urlMenuBottomSheetFragment.show(getSupportFragmentManager(), null);
return true;
};
+ imageAndGifPlugin = new ImageAndGifPlugin();
markwon = MarkdownUtils.createFullRedditMarkwon(this,
- miscPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener);
+ miscPlugin, imageAndGifPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener);
markwonAdapter = MarkdownUtils.createTablesAdapter(this, mGlide);
LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(this, new SwipeLockInterface() {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsListingRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsListingRecyclerViewAdapter.java
index a3b5b5db..76c0cc64 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsListingRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsListingRecyclerViewAdapter.java
@@ -55,6 +55,7 @@ import ml.docilealligator.infinityforreddit.customviews.SpoilerOnClickTextView;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.databinding.ItemCommentBinding;
+import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.utils.APIUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
@@ -79,6 +80,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
private BaseActivity mActivity;
private Retrofit mOauthRetrofit;
private Locale mLocale;
+ private ImageAndGifPlugin mImageAndGifPlugin;
private Markwon mMarkwon;
private RecyclerView.RecycledViewPool recycledViewPool;
private String mAccessToken;
@@ -168,8 +170,9 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
}
return true;
};
+ mImageAndGifPlugin = new ImageAndGifPlugin();
mMarkwon = MarkdownUtils.createFullRedditMarkwon(mActivity,
- miscPlugin, mCommentColor, commentSpoilerBackgroundColor, onLinkLongClickListener);
+ miscPlugin, mImageAndGifPlugin, mCommentColor, commentSpoilerBackgroundColor, onLinkLongClickListener);
recycledViewPool = new RecyclerView.RecycledViewPool();
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsRecyclerViewAdapter.java
index 298214d3..85ba9dae 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/CommentsRecyclerViewAdapter.java
@@ -67,6 +67,7 @@ import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.databinding.ItemCommentBinding;
import ml.docilealligator.infinityforreddit.fragments.ViewPostDetailFragment;
+import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.post.Post;
import ml.docilealligator.infinityforreddit.utils.APIUtils;
@@ -93,6 +94,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
private Executor mExecutor;
private Retrofit mRetrofit;
private Retrofit mOauthRetrofit;
+ private ImageAndGifPlugin mImageAndGifPlugin;
private Markwon mCommentMarkwon;
private String mAccessToken;
private String mAccountName;
@@ -203,8 +205,9 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
}
return true;
};
+ mImageAndGifPlugin = new ImageAndGifPlugin();
mCommentMarkwon = MarkdownUtils.createFullRedditMarkwon(mActivity,
- miscPlugin, mCommentTextColor, commentSpoilerBackgroundColor, onLinkLongClickListener);
+ miscPlugin, mImageAndGifPlugin, mCommentTextColor, commentSpoilerBackgroundColor, onLinkLongClickListener);
recycledViewPool = new RecyclerView.RecycledViewPool();
mAccessToken = accessToken;
mAccountName = accountName;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java
index 0b90112e..30a3068f 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java
@@ -48,7 +48,7 @@ import com.google.android.material.button.MaterialButton;
import com.google.common.collect.ImmutableList;
import com.libRG.CustomTextView;
-import java.util.ArrayList;
+import java.util.List;
import java.util.Locale;
import java.util.concurrent.Executor;
@@ -103,6 +103,7 @@ import ml.docilealligator.infinityforreddit.databinding.ItemPostDetailVideoAndGi
import ml.docilealligator.infinityforreddit.databinding.ItemPostDetailVideoAutoplayBinding;
import ml.docilealligator.infinityforreddit.databinding.ItemPostDetailVideoAutoplayLegacyControllerBinding;
import ml.docilealligator.infinityforreddit.fragments.ViewPostDetailFragment;
+import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.post.Post;
import ml.docilealligator.infinityforreddit.post.PostPagingSource;
@@ -142,6 +143,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
private SharedPreferences mCurrentAccountSharedPreferences;
private RequestManager mGlide;
private SaveMemoryCenterInisdeDownsampleStrategy mSaveMemoryCenterInsideDownsampleStrategy;
+ private ImageAndGifPlugin mImageAndGifPlugin;
private Markwon mPostDetailMarkwon;
private final MarkwonAdapter mMarkwonAdapter;
private String mAccessToken;
@@ -287,8 +289,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
}
return true;
};
+ mImageAndGifPlugin = new ImageAndGifPlugin();
mPostDetailMarkwon = MarkdownUtils.createFullRedditMarkwon(mActivity,
- miscPlugin, markdownColor, postSpoilerBackgroundColor, onLinkLongClickListener);
+ miscPlugin, mImageAndGifPlugin, markdownColor, postSpoilerBackgroundColor, onLinkLongClickListener);
mMarkwonAdapter = MarkdownUtils.createTablesAdapter(activity, mGlide);
mSeparatePostAndComments = separatePostAndComments;
@@ -646,6 +649,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
if (mPost.getSelfText() != null && !mPost.getSelfText().equals("")) {
((PostDetailBaseViewHolder) holder).contentMarkdownView.setVisibility(View.VISIBLE);
((PostDetailBaseViewHolder) holder).contentMarkdownView.setAdapter(mMarkwonAdapter);
+ mImageAndGifPlugin.setMediaMetadataMap(mPost.getMediaMetadataMap());
mMarkwonAdapter.setMarkdown(mPostDetailMarkwon, mPost.getSelfText());
// noinspection NotifyDataSetChanged
mMarkwonAdapter.notifyDataSetChanged();
@@ -813,7 +817,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
}
@Nullable
- private Post.Preview getSuitablePreview(ArrayList<Post.Preview> previews) {
+ private Post.Preview getSuitablePreview(List<Post.Preview> previews) {
Post.Preview preview;
if (!previews.isEmpty()) {
int previewIndex;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java
index 9218dd34..42f114fd 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java
@@ -34,10 +34,12 @@ import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.customviews.slidr.widget.SliderPanel;
+import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecyclerViewAdapter.RuleViewHolder> {
private BaseActivity activity;
+ private ImageAndGifPlugin imageAndGifPlugin;
private Markwon markwon;
@Nullable
private final SliderPanel sliderPanel;
@@ -83,8 +85,9 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler
}
return true;
};
+ imageAndGifPlugin = new ImageAndGifPlugin();
markwon = MarkdownUtils.createFullRedditMarkwon(activity,
- miscPlugin, mPrimaryTextColor, spoilerBackgroundColor, onLinkLongClickListener);
+ miscPlugin, imageAndGifPlugin, mPrimaryTextColor, spoilerBackgroundColor, onLinkLongClickListener);
}
@NonNull
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SidebarFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SidebarFragment.java
index b55f12ce..e0fd9975 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SidebarFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SidebarFragment.java
@@ -44,6 +44,7 @@ import ml.docilealligator.infinityforreddit.bottomsheetfragments.CopyTextBottomS
import ml.docilealligator.infinityforreddit.bottomsheetfragments.UrlMenuBottomSheetFragment;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed;
+import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.subreddit.FetchSubredditData;
import ml.docilealligator.infinityforreddit.subreddit.SubredditData;
@@ -144,8 +145,9 @@ public class SidebarFragment extends Fragment {
urlMenuBottomSheetFragment.show(getChildFragmentManager(), null);
return true;
};
+ ImageAndGifPlugin imageAndGifPlugin = new ImageAndGifPlugin();
Markwon markwon = MarkdownUtils.createFullRedditMarkwon(activity,
- miscPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener);
+ miscPlugin, imageAndGifPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener);
MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter(activity, Glide.with(this));
linearLayoutManager = new LinearLayoutManagerBugFixed(activity);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlock.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlock.java
index deea10c3..ce456f92 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlock.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlock.java
@@ -2,5 +2,12 @@ package ml.docilealligator.infinityforreddit.markdown;
import org.commonmark.node.CustomBlock;
+import ml.docilealligator.infinityforreddit.post.Post;
+
public class ImageAndGifBlock extends CustomBlock {
+ public Post.MediaMetadata mediaMetadata;
+
+ public ImageAndGifBlock(Post.MediaMetadata mediaMetadata) {
+ this.mediaMetadata = mediaMetadata;
+ }
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java
index aa312eb1..0da8a93e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java
@@ -10,15 +10,18 @@ import org.commonmark.parser.block.BlockStart;
import org.commonmark.parser.block.MatchedBlockParser;
import org.commonmark.parser.block.ParserState;
+import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import ml.docilealligator.infinityforreddit.post.Post;
+
public class ImageAndGifBlockParser extends AbstractBlockParser {
private ImageAndGifBlock imageAndGifBlock;
- ImageAndGifBlockParser() {
- this.imageAndGifBlock = new ImageAndGifBlock();
+ ImageAndGifBlockParser(Post.MediaMetadata mediaMetadata) {
+ this.imageAndGifBlock = new ImageAndGifBlock(mediaMetadata);
}
@Override
@@ -33,6 +36,8 @@ public class ImageAndGifBlockParser extends AbstractBlockParser {
public static class Factory extends AbstractBlockParserFactory {
private Pattern redditPreviewPattern = Pattern.compile("!\\[img]\\(https://preview.redd.it/\\w+.(jpg|png)((\\?+[-a-zA-Z0-9()@:%_+.~#?&/=]*)|)\\)");
+ private Map<String, Post.MediaMetadata> mediaMetadataMap;
+ private int fromIndex = "![img](https://preview.redd.it/".length();
@Override
public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) {
@@ -41,10 +46,19 @@ public class ImageAndGifBlockParser extends AbstractBlockParser {
Matcher matcher = redditPreviewPattern.matcher(line);
if (matcher.find()) {
if (matcher.end() == line.length()) {
- return BlockStart.of(new ImageAndGifBlockParser());
+ int endIndex = line.indexOf('.', fromIndex);
+ if (endIndex > 0) {
+ String id = line.substring(fromIndex, endIndex);
+ Log.i("asdfasdf", "s " + id);
+ return mediaMetadataMap.containsKey(id) ? BlockStart.of(new ImageAndGifBlockParser(mediaMetadataMap.get(id))) : BlockStart.none();
+ }
}
}
return BlockStart.none();
}
+
+ public void setMediaMetadataMap(Map<String, Post.MediaMetadata> mediaMetadataMap) {
+ this.mediaMetadataMap = mediaMetadataMap;
+ }
}
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java
index e09388e4..1e5678e1 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java
@@ -41,7 +41,7 @@ public class ImageAndGifEntry extends MarkwonAdapter.Entry<ImageAndGifBlock, Ima
public void bindHolder(@NonNull Markwon markwon, @NonNull Holder holder, @NonNull ImageAndGifBlock node) {
holder.binding.progressBarMarkdownImageAndGifBlock.setVisibility(View.VISIBLE);
- RequestBuilder<Drawable> imageRequestBuilder = glide.load("https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Image_created_with_a_mobile_phone.png/1280px-Image_created_with_a_mobile_phone.png").listener(holder.requestListener);
+ RequestBuilder<Drawable> imageRequestBuilder = glide.load(node.mediaMetadata.original.url).listener(holder.requestListener);
boolean blurImage = false;
if (blurImage) {
imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10)))
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java
index 04e95b23..86209454 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java
@@ -6,18 +6,32 @@ import androidx.annotation.NonNull;
import org.commonmark.parser.Parser;
+import java.util.Map;
+
import io.noties.markwon.AbstractMarkwonPlugin;
+import ml.docilealligator.infinityforreddit.post.Post;
public class ImageAndGifPlugin extends AbstractMarkwonPlugin {
+
+ private ImageAndGifBlockParser.Factory factory;
+
+ public ImageAndGifPlugin() {
+ this.factory = new ImageAndGifBlockParser.Factory();
+ }
+
@NonNull
@Override
public String processMarkdown(@NonNull String markdown) {
- Log.i("asdfa", "imageandgifplugin " + markdown + "fuck");
+ Log.i("asdfa", "imageandgifplugin " + markdown + "ooooo");
return super.processMarkdown(markdown);
}
@Override
public void configureParser(@NonNull Parser.Builder builder) {
- builder.customBlockParserFactory(new ImageAndGifBlockParser.Factory());
+ builder.customBlockParserFactory(factory);
+ }
+
+ public void setMediaMetadataMap(Map<String, Post.MediaMetadata> mediaMetadataMap) {
+ factory.setMediaMetadataMap(mediaMetadataMap);
}
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/MarkdownUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/MarkdownUtils.java
index aaaef7c8..d3d4387d 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/MarkdownUtils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/MarkdownUtils.java
@@ -34,6 +34,7 @@ public class MarkdownUtils {
@NonNull
public static Markwon createFullRedditMarkwon(@NonNull Context context,
@NonNull MarkwonPlugin miscPlugin,
+ @NonNull ImageAndGifPlugin imageAndGifPlugin,
int markdownColor,
int spoilerBackgroundColor,
@Nullable BetterLinkMovementMethod.OnLinkLongClickListener onLinkLongClickListener) {
@@ -50,7 +51,7 @@ public class MarkdownUtils {
.usePlugin(MovementMethodPlugin.create(new SpoilerAwareMovementMethod()
.setOnLinkLongClickListener(onLinkLongClickListener)))
.usePlugin(LinkifyPlugin.create(Linkify.WEB_URLS))
- .usePlugin(new ImageAndGifPlugin())
+ .usePlugin(imageAndGifPlugin)
.usePlugin(TableEntryPlugin.create(context))
.build();
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java
index 14fc4187..08fd7023 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java
@@ -5,14 +5,19 @@ import android.os.Handler;
import android.text.Html;
import android.text.TextUtils;
+import androidx.annotation.Nullable;
+
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.Executor;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -226,6 +231,8 @@ public class ParsePost {
previews.add(new Post.Preview(thumbnailPreviewUrl, thumbnailPreviewWidth, thumbnailPreviewHeight, "", ""));
}
}
+
+ Map<String, Post.MediaMetadata> mediaMetadataMap = parseMediaMetadata(data);
if (data.has(JSONUtils.CROSSPOST_PARENT_LIST)) {
//Cross post
//data.getJSONArray(JSONUtils.CROSSPOST_PARENT_LIST).getJSONObject(0) out of bounds????????????
@@ -233,7 +240,7 @@ public class ParsePost {
Post crosspostParent = parseBasicData(data);
Post post = parseData(data, permalink, id, fullName, subredditName, subredditNamePrefixed,
author, authorFlair, authorFlairHTMLBuilder.toString(),
- postTime, title, previews,
+ postTime, title, previews, mediaMetadataMap,
score, voteType, nComments, upvoteRatio, flair, awardingsBuilder.toString(), nAwards, hidden,
spoiler, nsfw, stickied, archived, locked, saved, deleted, removed, true,
distinguished, suggestedSort);
@@ -242,21 +249,61 @@ public class ParsePost {
} else {
return parseData(data, permalink, id, fullName, subredditName, subredditNamePrefixed,
author, authorFlair, authorFlairHTMLBuilder.toString(),
- postTime, title, previews,
+ postTime, title, previews, mediaMetadataMap,
score, voteType, nComments, upvoteRatio, flair, awardingsBuilder.toString(), nAwards, hidden,
spoiler, nsfw, stickied, archived, locked, saved, deleted, removed, false,
distinguished, suggestedSort);
}
}
+ @Nullable
+ private static Map<String, Post.MediaMetadata> parseMediaMetadata(JSONObject data) {
+ try {
+ if (data.has(JSONUtils.MEDIA_METADATA_KEY)) {
+ Map<String, Post.MediaMetadata> mediaMetadataMap = new HashMap<>();
+ JSONObject mediaMetadataJSON = data.getJSONObject(JSONUtils.MEDIA_METADATA_KEY);
+ for (Iterator<String> it = mediaMetadataJSON.keys(); it.hasNext();) {
+ try {
+ String k = it.next();
+ JSONObject media = mediaMetadataJSON.getJSONObject(k);
+ JSONArray downscales = media.getJSONArray(JSONUtils.P_KEY);
+ JSONObject downscaledItemJSON;
+ if (downscales.length() <= 3) {
+ downscaledItemJSON = downscales.getJSONObject(downscales.length() - 1);
+
+ } else {
+ downscaledItemJSON = downscales.getJSONObject(3);
+ }
+ Post.MediaMetadata.MediaItem downscaledItem = new Post.MediaMetadata.MediaItem(downscaledItemJSON.getInt(JSONUtils.X_KEY),
+ downscaledItemJSON.getInt(JSONUtils.Y_KEY), downscaledItemJSON.getString(JSONUtils.U_KEY));
+ JSONObject originalItemJSON = media.getJSONObject(JSONUtils.S_KEY);
+ Post.MediaMetadata.MediaItem originalItem = new Post.MediaMetadata.MediaItem(originalItemJSON.getInt(JSONUtils.X_KEY),
+ originalItemJSON.getInt(JSONUtils.Y_KEY), originalItemJSON.getString(JSONUtils.U_KEY));
+
+ String id = media.getString(JSONUtils.ID_KEY);
+ mediaMetadataMap.put(id, new Post.MediaMetadata(id, media.getString(JSONUtils.E_KEY),
+ originalItem, downscaledItem));
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ return mediaMetadataMap;
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
private static Post parseData(JSONObject data, String permalink, String id, String fullName,
String subredditName, String subredditNamePrefixed, String author,
- String authorFlair, String authorFlairHTML,
- long postTimeMillis, String title, ArrayList<Post.Preview> previews,
+ String authorFlair, String authorFlairHTML, long postTimeMillis, String title,
+ ArrayList<Post.Preview> previews, Map<String, Post.MediaMetadata> mediaMetadataMap,
int score, int voteType, int nComments, int upvoteRatio, String flair,
- String awards, int nAwards, boolean hidden, boolean spoiler,
- boolean nsfw, boolean stickied, boolean archived, boolean locked,
- boolean saved, boolean deleted, boolean removed, boolean isCrosspost,
+ String awards, int nAwards, boolean hidden, boolean spoiler, boolean nsfw,
+ boolean stickied, boolean archived, boolean locked, boolean saved,
+ boolean deleted, boolean removed, boolean isCrosspost,
String distinguished, String suggestedSort) throws JSONException {
Post post;
@@ -750,6 +797,7 @@ public class ParsePost {
}
}
+ post.setMediaMetadataMap(mediaMetadataMap);
return post;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java
index 137c9fdc..e91062b2 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java
@@ -3,9 +3,11 @@ package ml.docilealligator.infinityforreddit.post;
import android.os.Parcel;
import android.os.Parcelable;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
+import java.util.Map;
import ml.docilealligator.infinityforreddit.utils.APIUtils;
@@ -22,17 +24,7 @@ public class Post implements Parcelable {
public static final int GIF_TYPE = 4;
public static final int NO_PREVIEW_LINK_TYPE = 5;
public static final int GALLERY_TYPE = 6;
- public static final Creator<Post> CREATOR = new Creator<Post>() {
- @Override
- public Post createFromParcel(Parcel in) {
- return new Post(in);
- }
- @Override
- public Post[] newArray(int size) {
- return new Post[size];
- }
- };
private String id;
private String fullName;
private String subredditName;
@@ -78,6 +70,8 @@ public class Post implements Parcelable {
private String distinguished;
private String suggestedSort;
private ArrayList<Preview> previews = new ArrayList<>();
+ @Nullable
+ private Map<String, MediaMetadata> mediaMetadataMap;
private ArrayList<Gallery> gallery = new ArrayList<>();
//Text and video posts
@@ -162,10 +156,9 @@ public class Post implements Parcelable {
subredditIconUrl = in.readString();
author = in.readString();
authorNamePrefixed = in.readString();
+ authorIconUrl = in.readString();
authorFlair = in.readString();
authorFlairHTML = in.readString();
- authorIconUrl = in.readString();
- postTimeMillis = in.readLong();
title = in.readString();
selfText = in.readString();
selfTextPlain = in.readString();
@@ -182,6 +175,7 @@ public class Post implements Parcelable {
loadGfyOrStreamableVideoSuccess = in.readByte() != 0;
permalink = in.readString();
flair = in.readString();
+ postTimeMillis = in.readLong();
score = in.readInt();
postType = in.readInt();
voteType = in.readInt();
@@ -199,10 +193,23 @@ public class Post implements Parcelable {
crosspostParentId = in.readString();
distinguished = in.readString();
suggestedSort = in.readString();
- in.readTypedList(previews, Preview.CREATOR);
- in.readTypedList(gallery, Gallery.CREATOR);
+ previews = in.createTypedArrayList(Preview.CREATOR);
+ mediaMetadataMap = (Map<String, MediaMetadata>) in.readValue(getClass().getClassLoader());
+ gallery = in.createTypedArrayList(Gallery.CREATOR);
}
+ public static final Creator<Post> CREATOR = new Creator<Post>() {
+ @Override
+ public Post createFromParcel(Parcel in) {
+ return new Post(in);
+ }
+
+ @Override
+ public Post[] newArray(int size) {
+ return new Post[size];
+ }
+ };
+
public String getId() {
return id;
}
@@ -469,6 +476,57 @@ public class Post implements Parcelable {
return 0;
}
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeString(id);
+ dest.writeString(fullName);
+ dest.writeString(subredditName);
+ dest.writeString(subredditNamePrefixed);
+ dest.writeString(subredditIconUrl);
+ dest.writeString(author);
+ dest.writeString(authorNamePrefixed);
+ dest.writeString(authorIconUrl);
+ dest.writeString(authorFlair);
+ dest.writeString(authorFlairHTML);
+ dest.writeString(title);
+ dest.writeString(selfText);
+ dest.writeString(selfTextPlain);
+ dest.writeString(selfTextPlainTrimmed);
+ dest.writeString(url);
+ dest.writeString(videoUrl);
+ dest.writeString(videoDownloadUrl);
+ dest.writeString(gfycatId);
+ dest.writeString(streamableShortCode);
+ dest.writeByte((byte) (isImgur ? 1 : 0));
+ dest.writeByte((byte) (isGfycat ? 1 : 0));
+ dest.writeByte((byte) (isRedgifs ? 1 : 0));
+ dest.writeByte((byte) (isStreamable ? 1 : 0));
+ dest.writeByte((byte) (loadGfyOrStreamableVideoSuccess ? 1 : 0));
+ dest.writeString(permalink);
+ dest.writeString(flair);
+ dest.writeLong(postTimeMillis);
+ dest.writeInt(score);
+ dest.writeInt(postType);
+ dest.writeInt(voteType);
+ dest.writeInt(nComments);
+ dest.writeInt(upvoteRatio);
+ dest.writeByte((byte) (hidden ? 1 : 0));
+ dest.writeByte((byte) (spoiler ? 1 : 0));
+ dest.writeByte((byte) (nsfw ? 1 : 0));
+ dest.writeByte((byte) (stickied ? 1 : 0));
+ dest.writeByte((byte) (archived ? 1 : 0));
+ dest.writeByte((byte) (locked ? 1 : 0));
+ dest.writeByte((byte) (saved ? 1 : 0));
+ dest.writeByte((byte) (isCrosspost ? 1 : 0));
+ dest.writeByte((byte) (isRead ? 1 : 0));
+ dest.writeString(crosspostParentId);
+ dest.writeString(distinguished);
+ dest.writeString(suggestedSort);
+ dest.writeTypedList(previews);
+ dest.writeValue(mediaMetadataMap);
+ dest.writeTypedList(gallery);
+ }
+
public boolean isStickied() {
return stickied;
}
@@ -517,6 +575,14 @@ public class Post implements Parcelable {
this.previews = previews;
}
+ public Map<String, MediaMetadata> getMediaMetadataMap() {
+ return mediaMetadataMap;
+ }
+
+ public void setMediaMetadataMap(Map<String, MediaMetadata> mediaMetadataMap) {
+ this.mediaMetadataMap = mediaMetadataMap;
+ }
+
public ArrayList<Gallery> getGallery() {
return gallery;
}
@@ -526,56 +592,6 @@ public class Post implements Parcelable {
}
@Override
- public void writeToParcel(Parcel parcel, int i) {
- parcel.writeString(id);
- parcel.writeString(fullName);
- parcel.writeString(subredditName);
- parcel.writeString(subredditNamePrefixed);
- parcel.writeString(subredditIconUrl);
- parcel.writeString(author);
- parcel.writeString(authorNamePrefixed);
- parcel.writeString(authorFlair);
- parcel.writeString(authorFlairHTML);
- parcel.writeString(authorIconUrl);
- parcel.writeLong(postTimeMillis);
- parcel.writeString(title);
- parcel.writeString(selfText);
- parcel.writeString(selfTextPlain);
- parcel.writeString(selfTextPlainTrimmed);
- parcel.writeString(url);
- parcel.writeString(videoUrl);
- parcel.writeString(videoDownloadUrl);
- parcel.writeString(gfycatId);
- parcel.writeString(streamableShortCode);
- parcel.writeByte((byte) (isImgur ? 1 : 0));
- parcel.writeByte((byte) (isGfycat ? 1 : 0));
- parcel.writeByte((byte) (isRedgifs ? 1 : 0));
- parcel.writeByte((byte) (isStreamable ? 1 : 0));
- parcel.writeByte((byte) (loadGfyOrStreamableVideoSuccess ? 1 : 0));
- parcel.writeString(permalink);
- parcel.writeString(flair);
- parcel.writeInt(score);
- parcel.writeInt(postType);
- parcel.writeInt(voteType);
- parcel.writeInt(nComments);
- parcel.writeInt(upvoteRatio);
- parcel.writeByte((byte) (hidden ? 1 : 0));
- parcel.writeByte((byte) (spoiler ? 1 : 0));
- parcel.writeByte((byte) (nsfw ? 1 : 0));
- parcel.writeByte((byte) (stickied ? 1 : 0));
- parcel.writeByte((byte) (archived ? 1 : 0));
- parcel.writeByte((byte) (locked ? 1 : 0));
- parcel.writeByte((byte) (saved ? 1 : 0));
- parcel.writeByte((byte) (isCrosspost ? 1 : 0));
- parcel.writeByte((byte) (isRead ? 1 : 0));
- parcel.writeString(crosspostParentId);
- parcel.writeString(distinguished);
- parcel.writeString(suggestedSort);
- parcel.writeTypedList(previews);
- parcel.writeTypedList(gallery);
- }
-
- @Override
public boolean equals(@Nullable Object obj) {
if (!(obj instanceof Post)) {
return false;
@@ -750,4 +766,93 @@ public class Post implements Parcelable {
parcel.writeString(previewCaptionUrl);
}
}
+
+ public static class MediaMetadata implements Parcelable {
+ public String id;
+ //E.g. Image
+ public String e;
+ public MediaItem original;
+ public MediaItem downscaled;
+
+ public MediaMetadata(String id, String e, MediaItem original, MediaItem downscaled) {
+ this.id = id;
+ this.e = e;
+ this.original = original;
+ this.downscaled = downscaled;
+ }
+
+ protected MediaMetadata(Parcel in) {
+ id = in.readString();
+ e = in.readString();
+ original = in.readParcelable(MediaItem.class.getClassLoader());
+ downscaled = in.readParcelable(MediaItem.class.getClassLoader());
+ }
+
+ public static final Creator<MediaMetadata> CREATOR = new Creator<MediaMetadata>() {
+ @Override
+ public MediaMetadata createFromParcel(Parcel in) {
+ return new MediaMetadata(in);
+ }
+
+ @Override
+ public MediaMetadata[] newArray(int size) {
+ return new MediaMetadata[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeString(id);
+ dest.writeString(e);
+ dest.writeParcelable(original, flags);
+ dest.writeParcelable(downscaled, flags);
+ }
+
+ public static class MediaItem implements Parcelable {
+ public int x;
+ public int y;
+ public String url;
+
+ public MediaItem(int x, int y, String url) {
+ this.x = x;
+ this.y = y;
+ this.url = url;
+ }
+
+ protected MediaItem(Parcel in) {
+ x = in.readInt();
+ y = in.readInt();
+ url = in.readString();
+ }
+
+ public static final Creator<MediaItem> CREATOR = new Creator<MediaItem>() {
+ @Override
+ public MediaItem createFromParcel(Parcel in) {
+ return new MediaItem(in);
+ }
+
+ @Override
+ public MediaItem[] newArray(int size) {
+ return new MediaItem[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(x);
+ dest.writeInt(y);
+ dest.writeString(url);
+ }
+ }
+ }
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java
index 7bd43af2..c43608be 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/JSONUtils.java
@@ -182,4 +182,5 @@ public class JSONUtils {
public static final String URLS_KEY = "urls";
public static final String HD_KEY = "hd";
public static final String SUGGESTED_SORT_KEY = "suggested_sort";
+ public static final String P_KEY = "p";
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java
index 9ddd9643..8504b621 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java
@@ -19,7 +19,6 @@ import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.TypefaceSpan;
import android.util.DisplayMetrics;
-import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -156,14 +155,10 @@ public final class Utils {
Matcher matcher = inlineRedditImagePattern.matcher(markdownStringBuilder);
int start = 0;
while (matcher.find(start)) {
- int fileNameStartIndex = "https://preview.redd.it/".length();
- String replacingText = "![" + /*markdownStringBuilder.substring(fileNameStartIndex,
- markdownStringBuilder.indexOf(".", fileNameStartIndex))*/"img"
- + "](" + markdownStringBuilder.substring(matcher.start(), matcher.end()) + ")";
+ String replacingText = "![img](" + markdownStringBuilder.substring(matcher.start(), matcher.end()) + ")";
markdownStringBuilder.replace(matcher.start(), matcher.end(), replacingText);
start = replacingText.length() + matcher.start();
matcher = inlineRedditImagePattern.matcher(markdownStringBuilder);
- Log.i("asdf", "S " + start + markdownStringBuilder.length());
}
return markdownStringBuilder.toString();