aboutsummaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java8
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/FullMarkdownActivity.java3
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/WikiActivity.java2
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java2
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java4
-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.java6
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java50
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java198
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java23
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/MarkdownUtils.java7
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java8
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java27
-rw-r--r--app/src/main/res/layout/markdown_image_and_gif_block.xml31
14 files changed, 355 insertions, 18 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 8a50549f..2a03a058 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java
@@ -1,7 +1,6 @@
package ml.docilealligator.infinityforreddit.activities;
import android.content.ActivityNotFoundException;
-import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
@@ -15,7 +14,6 @@ import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import android.widget.Toast;
@@ -153,6 +151,8 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
addOnOffsetChangedListener(binding.commentAppbarLayout);
}
+ mGlide = Glide.with(this);
+
mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
if (mAccessToken == null) {
finish();
@@ -209,7 +209,7 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
};
Markwon postBodyMarkwon = MarkdownUtils.createFullRedditMarkwon(this,
miscPlugin, parentTextColor, parentSpoilerBackgroundColor, null);
- MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter();
+ MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter(this, mGlide);
binding.commentContentMarkdownView.setLayoutManager(new LinearLayoutManagerBugFixed(this));
binding.commentContentMarkdownView.setAdapter(markwonAdapter);
markwonAdapter.setMarkdown(postBodyMarkwon, parentBodyMarkdown);
@@ -225,8 +225,6 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
setSupportActionBar(binding.commentToolbar);
- mGlide = Glide.with(this);
-
if (savedInstanceState != null) {
selectedAccount = savedInstanceState.getParcelable(SELECTED_ACCOUNT_STATE);
uploadedImages = savedInstanceState.getParcelableArrayList(UPLOADED_IMAGES_STATE);
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 380ef30a..aac1cc82 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/FullMarkdownActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/FullMarkdownActivity.java
@@ -18,6 +18,7 @@ import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.recyclerview.widget.RecyclerView;
+import com.bumptech.glide.Glide;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
@@ -141,7 +142,7 @@ public class FullMarkdownActivity extends BaseActivity {
Markwon markwon = MarkdownUtils.createFullRedditMarkwon(this,
miscPlugin, markdownColor, spoilerBackgroundColor, null);
- MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter();
+ MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter(this, Glide.with(this));
LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(this, new SwipeLockInterface() {
@Override
public void lockSwipe() {
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 d7dd20da..78b957d3 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/WikiActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/WikiActivity.java
@@ -178,7 +178,7 @@ public class WikiActivity extends BaseActivity {
markwon = MarkdownUtils.createFullRedditMarkwon(this,
miscPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener);
- markwonAdapter = MarkdownUtils.createTablesAdapter();
+ markwonAdapter = MarkdownUtils.createTablesAdapter(this, mGlide);
LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(this, new SwipeLockInterface() {
@Override
public void lockSwipe() {
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 9137aece..0b90112e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java
@@ -289,7 +289,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
};
mPostDetailMarkwon = MarkdownUtils.createFullRedditMarkwon(mActivity,
miscPlugin, markdownColor, postSpoilerBackgroundColor, onLinkLongClickListener);
- mMarkwonAdapter = MarkdownUtils.createTablesAdapter();
+ mMarkwonAdapter = MarkdownUtils.createTablesAdapter(activity, mGlide);
mSeparatePostAndComments = separatePostAndComments;
mLegacyAutoplayVideoControllerUI = sharedPreferences.getBoolean(SharedPreferencesUtils.LEGACY_AUTOPLAY_VIDEO_CONTROLLER_UI, false);
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 af46b80e..9218dd34 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java
@@ -12,6 +12,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
+import com.bumptech.glide.Glide;
+
import java.util.ArrayList;
import butterknife.BindView;
@@ -136,7 +138,7 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler
if (activity.typeface != null) {
shortNameTextView.setTypeface(activity.typeface);
}
- markwonAdapter = MarkdownUtils.createTablesAdapter();
+ markwonAdapter = MarkdownUtils.createTablesAdapter(activity, Glide.with(activity));
SwipeLockLinearLayoutManager swipeLockLinearLayoutManager = new SwipeLockLinearLayoutManager(activity,
new SwipeLockInterface() {
@Override
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 462c556d..b55f12ce 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SidebarFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SidebarFragment.java
@@ -18,6 +18,8 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+import com.bumptech.glide.Glide;
+
import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -144,7 +146,7 @@ public class SidebarFragment extends Fragment {
};
Markwon markwon = MarkdownUtils.createFullRedditMarkwon(activity,
miscPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener);
- MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter();
+ MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter(activity, Glide.with(this));
linearLayoutManager = new LinearLayoutManagerBugFixed(activity);
recyclerView.setLayoutManager(linearLayoutManager);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlock.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlock.java
new file mode 100644
index 00000000..deea10c3
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlock.java
@@ -0,0 +1,6 @@
+package ml.docilealligator.infinityforreddit.markdown;
+
+import org.commonmark.node.CustomBlock;
+
+public class ImageAndGifBlock extends CustomBlock {
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java
new file mode 100644
index 00000000..aa312eb1
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java
@@ -0,0 +1,50 @@
+package ml.docilealligator.infinityforreddit.markdown;
+
+import android.util.Log;
+
+import org.commonmark.node.Block;
+import org.commonmark.parser.block.AbstractBlockParser;
+import org.commonmark.parser.block.AbstractBlockParserFactory;
+import org.commonmark.parser.block.BlockContinue;
+import org.commonmark.parser.block.BlockStart;
+import org.commonmark.parser.block.MatchedBlockParser;
+import org.commonmark.parser.block.ParserState;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ImageAndGifBlockParser extends AbstractBlockParser {
+
+ private ImageAndGifBlock imageAndGifBlock;
+
+ ImageAndGifBlockParser() {
+ this.imageAndGifBlock = new ImageAndGifBlock();
+ }
+
+ @Override
+ public Block getBlock() {
+ return imageAndGifBlock;
+ }
+
+ @Override
+ public BlockContinue tryContinue(ParserState parserState) {
+ return null;
+ }
+
+ public static class Factory extends AbstractBlockParserFactory {
+ private Pattern redditPreviewPattern = Pattern.compile("!\\[img]\\(https://preview.redd.it/\\w+.(jpg|png)((\\?+[-a-zA-Z0-9()@:%_+.~#?&/=]*)|)\\)");
+
+ @Override
+ public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) {
+ String line = state.getLine().toString();
+ Log.i("asdfa", "s " + line + "fuck");
+ Matcher matcher = redditPreviewPattern.matcher(line);
+ if (matcher.find()) {
+ if (matcher.end() == line.length()) {
+ return BlockStart.of(new ImageAndGifBlockParser());
+ }
+ }
+ return BlockStart.none();
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java
new file mode 100644
index 00000000..e09388e4
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifEntry.java
@@ -0,0 +1,198 @@
+package ml.docilealligator.infinityforreddit.markdown;
+
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.bumptech.glide.RequestBuilder;
+import com.bumptech.glide.RequestManager;
+import com.bumptech.glide.load.DataSource;
+import com.bumptech.glide.load.engine.GlideException;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.RequestOptions;
+import com.bumptech.glide.request.target.Target;
+
+import io.noties.markwon.Markwon;
+import io.noties.markwon.recycler.MarkwonAdapter;
+import jp.wasabeef.glide.transformations.BlurTransformation;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.databinding.MarkdownImageAndGifBlockBinding;
+
+public class ImageAndGifEntry extends MarkwonAdapter.Entry<ImageAndGifBlock, ImageAndGifEntry.Holder> {
+ private BaseActivity baseActivity;
+ private RequestManager glide;
+
+ public ImageAndGifEntry(BaseActivity baseActivity, RequestManager glide) {
+ this.baseActivity = baseActivity;
+ this.glide = glide;
+ }
+
+ @NonNull
+ @Override
+ public Holder createHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
+ return new Holder(MarkdownImageAndGifBlockBinding.inflate(inflater, parent, false));
+ }
+
+ @Override
+ 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);
+ boolean blurImage = false;
+ if (blurImage) {
+ imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10)))
+ .into(holder.binding.imageViewMarkdownImageAndGifBlock);
+ } else {
+ imageRequestBuilder.centerInside().into(holder.binding.imageViewMarkdownImageAndGifBlock);
+ }
+ }
+
+ @Override
+ public void onViewRecycled(@NonNull Holder holder) {
+ super.onViewRecycled(holder);
+ glide.clear(holder.binding.imageViewMarkdownImageAndGifBlock);
+ holder.binding.progressBarMarkdownImageAndGifBlock.setVisibility(View.GONE);
+ holder.binding.loadImageErrorTextViewMarkdownImageAndGifBlock.setVisibility(View.GONE);
+ }
+
+ public class Holder extends MarkwonAdapter.Holder {
+ MarkdownImageAndGifBlockBinding binding;
+ RequestListener<Drawable> requestListener;
+
+ public Holder(@NonNull MarkdownImageAndGifBlockBinding binding) {
+ super(binding.getRoot());
+ this.binding = binding;
+
+ requestListener = new RequestListener<>() {
+ @Override
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
+ binding.progressBarMarkdownImageAndGifBlock.setVisibility(View.GONE);
+ binding.loadImageErrorTextViewMarkdownImageAndGifBlock.setVisibility(View.VISIBLE);
+ return false;
+ }
+
+ @Override
+ public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
+ binding.progressBarMarkdownImageAndGifBlock.setVisibility(View.GONE);
+ return false;
+ }
+ };
+ }
+
+ /*private final RequestListener<Drawable> requestListener = new RequestListener<Drawable>() {
+ @Override
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
+ binding.progressBar.setVisibility(View.GONE);
+ return false;
+ }
+
+ @Override
+ public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
+ binding.progressBar.setVisibility(View.GONE);
+ return false;
+ }
+ };*/
+
+ /*public Holder(@NonNull AdapterGifEntryBinding binding) {
+ super(binding.getRoot());
+ this.binding = binding;
+
+ binding.progressBar.setIndeterminateTintList(ColorStateList.valueOf(customThemeWrapper.getColorAccent()));
+ binding.giphyWatermark.setTextColor(customThemeWrapper.getCommentColor());
+
+ binding.gifLink.setTextColor(customThemeWrapper.getLinkColor());
+
+ }*/
+
+ /*void bindImage(ImageMetadata image) {
+ binding.gifLink.setVisibility(View.GONE);
+ binding.iv.setVisibility(View.VISIBLE);
+ binding.progressBar.setVisibility(View.VISIBLE);
+ binding.giphyWatermark.setVisibility(View.GONE);
+
+ ViewGroup.LayoutParams params = binding.iv.getLayoutParams();
+ if (image.x > image.y) {
+ params.height = dpToPx(160);
+ params.width = params.height * image.x / image.y;
+ } else {
+ params.width = dpToPx(160);
+ params.height = params.width * image.y / image.x;
+ }
+ binding.iv.setLayoutParams(params);
+
+ // todo: check if waitForLayout is necessary here since we explicitly set width/height in LP
+ Target<Drawable> target = new DrawableImageViewTarget(binding.iv)
+ .waitForLayout();
+ glide.load(image.getUrl())
+ .addListener(requestListener)
+ .error(R.drawable.ic_error_outline_black_24dp)
+ .into(target);
+ }
+
+ void bindGif(GiphyGifMetadata gif) {
+ if (!canLoadGif()) {
+ // video autoplay is disabled, don't load gif
+ binding.gifLink.setVisibility(View.VISIBLE);
+ binding.iv.setVisibility(View.GONE);
+ binding.progressBar.setVisibility(View.GONE);
+ binding.giphyWatermark.setVisibility(View.GONE);
+
+ binding.gifLink.setOnClickListener(v -> {
+ onClickListener.accept(Uri.parse(gif.getGifUrl()));
+ });
+ return;
+ }
+ binding.gifLink.setVisibility(View.GONE);
+ binding.iv.setVisibility(View.VISIBLE);
+ binding.progressBar.setVisibility(View.VISIBLE);
+ binding.giphyWatermark.setVisibility(View.VISIBLE);
+
+ ViewGroup.LayoutParams params = binding.iv.getLayoutParams();
+ if (gif.x > gif.y) {
+ params.height = dpToPx(160);
+ params.width = params.height * gif.x / gif.y;
+ } else {
+ params.width = dpToPx(160);
+ params.height = params.width * gif.y / gif.x;
+ }
+ binding.iv.setLayoutParams(params);
+
+ // todo: check if waitForLayout is necessary here since we explicitly set width/height in LP
+ Target<Drawable> target = new DrawableImageViewTarget(binding.iv)
+ .waitForLayout();
+ glide.load(gif.getGifUrl())
+ .addListener(requestListener)
+ .error(R.drawable.ic_error_outline_black_24dp)
+ .into(target);
+ }
+
+ void recycle() {
+ glide.clear(binding.iv);
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private int dpToPx(int dp) {
+ float density = itemView.getContext().getResources().getDisplayMetrics().density;
+ return (int) (dp * density);
+ }
+
+ private boolean canLoadGif() {
+ // ideally this would be injected, but it is a bit unpleasant to do
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(itemView.getContext());
+ String dataSavingMode = sharedPreferences.getString(SharedPreferencesUtils.DATA_SAVING_MODE, SharedPreferencesUtils.DATA_SAVING_MODE_OFF);
+ Log.i("GifEntry", "datasaving=" + dataSavingMode);
+ if (dataSavingMode.equals(SharedPreferencesUtils.DATA_SAVING_MODE_ALWAYS)) {
+ return false;
+ } else if (dataSavingMode.equals(SharedPreferencesUtils.DATA_SAVING_MODE_ONLY_ON_CELLULAR_DATA)) {
+ int networkType = Utils.getConnectedNetwork(itemView.getContext());
+ return networkType != Utils.NETWORK_TYPE_CELLULAR;
+ } else {
+ return true;
+ }
+ }*/
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java
new file mode 100644
index 00000000..04e95b23
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifPlugin.java
@@ -0,0 +1,23 @@
+package ml.docilealligator.infinityforreddit.markdown;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import org.commonmark.parser.Parser;
+
+import io.noties.markwon.AbstractMarkwonPlugin;
+
+public class ImageAndGifPlugin extends AbstractMarkwonPlugin {
+ @NonNull
+ @Override
+ public String processMarkdown(@NonNull String markdown) {
+ Log.i("asdfa", "imageandgifplugin " + markdown + "fuck");
+ return super.processMarkdown(markdown);
+ }
+
+ @Override
+ public void configureParser(@NonNull Parser.Builder builder) {
+ builder.customBlockParserFactory(new ImageAndGifBlockParser.Factory());
+ }
+}
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 2c56fc9c..aaaef7c8 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/MarkdownUtils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/MarkdownUtils.java
@@ -6,6 +6,8 @@ import android.text.util.Linkify;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.bumptech.glide.RequestManager;
+
import org.commonmark.ext.gfm.tables.TableBlock;
import io.noties.markwon.Markwon;
@@ -21,6 +23,7 @@ import io.noties.markwon.recycler.table.TableEntry;
import io.noties.markwon.recycler.table.TableEntryPlugin;
import me.saket.bettermovementmethod.BetterLinkMovementMethod;
import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
import ml.docilealligator.infinityforreddit.customviews.CustomMarkwonAdapter;
public class MarkdownUtils {
@@ -47,6 +50,7 @@ public class MarkdownUtils {
.usePlugin(MovementMethodPlugin.create(new SpoilerAwareMovementMethod()
.setOnLinkLongClickListener(onLinkLongClickListener)))
.usePlugin(LinkifyPlugin.create(Linkify.WEB_URLS))
+ .usePlugin(new ImageAndGifPlugin())
.usePlugin(TableEntryPlugin.create(context))
.build();
}
@@ -93,11 +97,12 @@ public class MarkdownUtils {
* Creates a MarkwonAdapter configured with support for tables.
*/
@NonNull
- public static MarkwonAdapter createTablesAdapter() {
+ public static MarkwonAdapter createTablesAdapter(BaseActivity baseActivity, RequestManager glide) {
return MarkwonAdapter.builder(R.layout.adapter_default_entry, R.id.text)
.include(TableBlock.class, TableEntry.create(builder -> builder
.tableLayout(R.layout.adapter_table_block, R.id.table_layout)
.textLayoutIsRoot(R.layout.view_table_entry_cell)))
+ .include(ImageAndGifBlock.class, new ImageAndGifEntry(baseActivity, glide))
.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 ffdc4328..14fc4187 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java
@@ -319,7 +319,7 @@ public class ParsePost {
if (data.isNull(JSONUtils.SELFTEXT_KEY)) {
post.setSelfText("");
} else {
- post.setSelfText(Utils.modifyMarkdown(Utils.trimTrailingWhitespace(data.getString(JSONUtils.SELFTEXT_KEY))));
+ post.setSelfText(Utils.modifyMarkdown(Utils.parseInlineRedditImages(Utils.trimTrailingWhitespace(data.getString(JSONUtils.SELFTEXT_KEY)))));
}
String authority = uri.getAuthority();
@@ -505,7 +505,7 @@ public class ParsePost {
if (data.isNull(JSONUtils.SELFTEXT_KEY)) {
post.setSelfText("");
} else {
- post.setSelfText(Utils.modifyMarkdown(Utils.trimTrailingWhitespace(data.getString(JSONUtils.SELFTEXT_KEY))));
+ post.setSelfText(Utils.modifyMarkdown(Utils.parseInlineRedditImages(Utils.trimTrailingWhitespace(data.getString(JSONUtils.SELFTEXT_KEY)))));
}
post.setPreviews(previews);
@@ -580,7 +580,7 @@ public class ParsePost {
if (data.isNull(JSONUtils.SELFTEXT_KEY)) {
post.setSelfText("");
} else {
- post.setSelfText(Utils.modifyMarkdown(Utils.trimTrailingWhitespace(data.getString(JSONUtils.SELFTEXT_KEY))));
+ post.setSelfText(Utils.modifyMarkdown(Utils.parseInlineRedditImages(Utils.trimTrailingWhitespace(data.getString(JSONUtils.SELFTEXT_KEY)))));
}
String authority = uri.getAuthority();
@@ -724,7 +724,7 @@ public class ParsePost {
if (data.isNull(JSONUtils.SELFTEXT_KEY)) {
post.setSelfText("");
} else {
- String selfText = Utils.modifyMarkdown(Utils.trimTrailingWhitespace(data.getString(JSONUtils.SELFTEXT_KEY)));
+ String selfText = Utils.modifyMarkdown(Utils.parseInlineRedditImages(Utils.trimTrailingWhitespace(data.getString(JSONUtils.SELFTEXT_KEY))));
post.setSelfText(selfText);
if (data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) {
post.setSelfTextPlainTrimmed("");
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 40bc8cd1..9ddd9643 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java
@@ -19,6 +19,7 @@ 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;
@@ -76,6 +77,7 @@ public final class Utils {
Pattern.compile("!\\[gif]\\(giphy\\|\\w+\\)"),
Pattern.compile("!\\[gif]\\(giphy\\|\\w+\\|downsized\\)"),
Pattern.compile("!\\[gif]\\(emote\\|\\w+\\|\\w+\\)"),
+ Pattern.compile("https://preview.redd.it/\\w+.(jpg|png)((\\?+[-a-zA-Z0-9()@:%_+.~#?&/=]*)|)")
};
public static String modifyMarkdown(String markdown) {
@@ -91,14 +93,14 @@ public final class Utils {
Pattern inlineGifPattern = REGEX_PATTERNS[3];
Matcher matcher = inlineGifPattern.matcher(markdownStringBuilder);
while (matcher.find()) {
- markdownStringBuilder.replace(matcher.start(), matcher.end(), "[gif](https://i.giphy.com/media/" + markdownStringBuilder.substring(matcher.start() + "![gif](giphy|".length(), matcher.end() - 1) + "/giphy.mp4)");
+ markdownStringBuilder.replace(matcher.start(), matcher.end(), "![gif](https://i.giphy.com/media/" + markdownStringBuilder.substring(matcher.start() + "![gif](giphy|".length(), matcher.end() - 1) + "/giphy.mp4)");
matcher = inlineGifPattern.matcher(markdownStringBuilder);
}
Pattern inlineGifPattern2 = REGEX_PATTERNS[4];
Matcher matcher2 = inlineGifPattern2.matcher(markdownStringBuilder);
while (matcher2.find()) {
- markdownStringBuilder.replace(matcher2.start(), matcher2.end(), "[gif](https://i.giphy.com/media/" + markdownStringBuilder.substring(matcher2.start() + "![gif](giphy|".length(), matcher2.end() - "|downsized\\)".length() + 1) + "/giphy.mp4)");
+ markdownStringBuilder.replace(matcher2.start(), matcher2.end(), "![gif](https://i.giphy.com/media/" + markdownStringBuilder.substring(matcher2.start() + "![gif](giphy|".length(), matcher2.end() - "|downsized\\)".length() + 1) + "/giphy.mp4)");
matcher2 = inlineGifPattern2.matcher(markdownStringBuilder);
}
@@ -106,7 +108,7 @@ public final class Utils {
Matcher matcher3 = inlineGifPattern3.matcher(markdownStringBuilder);
while (matcher3.find()) {
markdownStringBuilder.replace(matcher3.start(), matcher3.end(),
- "[gif](https://reddit-meta-production.s3.amazonaws.com/public/fortnitebr/emotes/snoomoji_emotes/"
+ "![gif](https://reddit-meta-production.s3.amazonaws.com/public/fortnitebr/emotes/snoomoji_emotes/"
+ markdownStringBuilder.substring(
matcher3.start() + "![gif](emote|".length(), matcher3.end() - 1).replace('|', '/') + ".gif)");
matcher3 = inlineGifPattern3.matcher(markdownStringBuilder);
@@ -148,6 +150,25 @@ public final class Utils {
return markdown;
}
+ public static String parseInlineRedditImages(String markdown) {
+ StringBuilder markdownStringBuilder = new StringBuilder(markdown);
+ Pattern inlineRedditImagePattern = REGEX_PATTERNS[6];
+ 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()) + ")";
+ 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();
+ }
+
public static String trimTrailingWhitespace(String source) {
if (source == null) {
diff --git a/app/src/main/res/layout/markdown_image_and_gif_block.xml b/app/src/main/res/layout/markdown_image_and_gif_block.xml
new file mode 100644
index 00000000..95746933
--- /dev/null
+++ b/app/src/main/res/layout/markdown_image_and_gif_block.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/image_wrapper_relative_layout_markdown_image_and_gif_block"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <ml.docilealligator.infinityforreddit.customviews.AspectRatioGifImageView
+ android:id="@+id/image_view_markdown_image_and_gif_block"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:adjustViewBounds="true" />
+
+ <ProgressBar
+ android:id="@+id/progress_bar_markdown_image_and_gif_block"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center" />
+
+ <TextView
+ android:id="@+id/load_image_error_text_view_markdown_image_and_gif_block"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:drawableTop="@drawable/ic_error_outline_black_24dp"
+ android:fontFamily="?attr/font_family"
+ android:gravity="center"
+ android:text="@string/error_loading_image_tap_to_retry"
+ android:textSize="?attr/font_default"
+ android:visibility="gone" />
+
+</FrameLayout> \ No newline at end of file