mirror of
https://codeberg.org/gitnex/GitNex
synced 2025-02-02 20:37:01 +01:00
update libs, switch to io.notis for md. refactor all the markdown code
This commit is contained in:
parent
c31cf53023
commit
7f417da6b3
@ -23,8 +23,8 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
def lifecycle_version = "2.2.0-alpha04"
|
def lifecycle_version = "2.2.0-alpha05"
|
||||||
final def markwon_version = "3.0.0"
|
final def markwon_version = "4.1.1"
|
||||||
|
|
||||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||||
implementation 'androidx.appcompat:appcompat:1.1.0'
|
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||||
@ -47,17 +47,21 @@ dependencies {
|
|||||||
implementation "com.vdurmont:emoji-java:4.0.0"
|
implementation "com.vdurmont:emoji-java:4.0.0"
|
||||||
implementation "com.pes.materialcolorpicker:library:1.2.5"
|
implementation "com.pes.materialcolorpicker:library:1.2.5"
|
||||||
|
|
||||||
implementation "ru.noties.markwon:core:$markwon_version"
|
implementation "io.noties.markwon:core:$markwon_version"
|
||||||
implementation "ru.noties.markwon:ext-strikethrough:$markwon_version"
|
implementation "io.noties.markwon:ext-latex:$markwon_version"
|
||||||
implementation "ru.noties.markwon:ext-tables:$markwon_version"
|
implementation "io.noties.markwon:ext-strikethrough:$markwon_version"
|
||||||
implementation "ru.noties.markwon:ext-tasklist:$markwon_version"
|
implementation "io.noties.markwon:ext-tables:$markwon_version"
|
||||||
implementation "ru.noties.markwon:syntax-highlight:$markwon_version"
|
implementation "io.noties.markwon:ext-tasklist:$markwon_version"
|
||||||
implementation "ru.noties.markwon:image-okhttp:$markwon_version"
|
implementation "io.noties.markwon:html:$markwon_version"
|
||||||
implementation "ru.noties.markwon:html:$markwon_version"
|
implementation "io.noties.markwon:image:$markwon_version"
|
||||||
implementation "ru.noties.markwon:recycler:$markwon_version"
|
implementation "io.noties.markwon:image-picasso:$markwon_version"
|
||||||
implementation "ru.noties.markwon:recycler-table:$markwon_version"
|
implementation "io.noties.markwon:linkify:$markwon_version"
|
||||||
implementation "ru.noties.markwon:image-gif:$markwon_version"
|
implementation "io.noties.markwon:recycler:$markwon_version"
|
||||||
implementation "ru.noties.markwon:image-svg:$markwon_version"
|
implementation "io.noties.markwon:recycler-table:$markwon_version"
|
||||||
|
implementation "io.noties.markwon:simple-ext:$markwon_version"
|
||||||
|
implementation "io.noties.markwon:syntax-highlight:$markwon_version"
|
||||||
|
implementation "com.caverock:androidsvg:1.4"
|
||||||
|
implementation "pl.droidsonroids.gif:android-gif-drawable:1.2.14"
|
||||||
|
|
||||||
implementation "com.hendraanggrian.appcompat:socialview:0.2"
|
implementation "com.hendraanggrian.appcompat:socialview:0.2"
|
||||||
implementation "com.hendraanggrian.appcompat:socialview-commons:0.2"
|
implementation "com.hendraanggrian.appcompat:socialview-commons:0.2"
|
||||||
|
@ -10,26 +10,33 @@ import androidx.recyclerview.widget.DividerItemDecoration;
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
import okhttp3.OkHttpClient;
|
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||||
|
import io.noties.markwon.Markwon;
|
||||||
|
import io.noties.markwon.core.CorePlugin;
|
||||||
|
import io.noties.markwon.core.MarkwonTheme;
|
||||||
|
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||||
|
import io.noties.markwon.ext.tables.TablePlugin;
|
||||||
|
import io.noties.markwon.ext.tasklist.TaskListPlugin;
|
||||||
|
import io.noties.markwon.html.HtmlPlugin;
|
||||||
|
import io.noties.markwon.image.AsyncDrawable;
|
||||||
|
import io.noties.markwon.image.DefaultMediaDecoder;
|
||||||
|
import io.noties.markwon.image.ImageItem;
|
||||||
|
import io.noties.markwon.image.ImagesPlugin;
|
||||||
|
import io.noties.markwon.image.SchemeHandler;
|
||||||
|
import io.noties.markwon.image.gif.GifMediaDecoder;
|
||||||
|
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
||||||
|
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
import retrofit2.Response;
|
import retrofit2.Response;
|
||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
|
||||||
import ru.noties.markwon.Markwon;
|
|
||||||
import ru.noties.markwon.core.CorePlugin;
|
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
|
||||||
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
|
||||||
import ru.noties.markwon.ext.tables.TablePlugin;
|
|
||||||
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
|
|
||||||
import ru.noties.markwon.html.HtmlPlugin;
|
|
||||||
import ru.noties.markwon.image.ImagesPlugin;
|
|
||||||
import ru.noties.markwon.image.gif.GifPlugin;
|
|
||||||
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
@ -63,6 +70,8 @@ import org.mian.gitnex.viewmodels.IssueCommentsViewModel;
|
|||||||
import org.ocpsoft.prettytime.PrettyTime;
|
import org.ocpsoft.prettytime.PrettyTime;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -286,22 +295,64 @@ public class IssueDetailActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(getApplicationContext()))
|
final Markwon markwon = Markwon.builder(Objects.requireNonNull(getApplicationContext()))
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
.usePlugin(ImagesPlugin.createWithAssets(getApplicationContext()))
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.addSchemeHandler(new SchemeHandler() {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
||||||
|
|
||||||
|
final int resourceId = getApplicationContext().getResources().getIdentifier(
|
||||||
|
raw.substring("drawable://".length()),
|
||||||
|
"drawable",
|
||||||
|
getApplicationContext().getPackageName());
|
||||||
|
|
||||||
|
final Drawable drawable = getApplicationContext().getDrawable(resourceId);
|
||||||
|
|
||||||
|
assert drawable != null;
|
||||||
|
return ImageItem.withResult(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Collection<String> supportedSchemes() {
|
||||||
|
return Collections.singleton("drawable");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create(getApplicationContext().getResources()));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(getApplicationContext().getResources()));
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||||
builder
|
builder
|
||||||
.codeTextColor(tinyDb.getInt("codeBlockColor"))
|
.codeTextColor(tinyDb.getInt("codeBlockColor"))
|
||||||
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
|
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
|
||||||
.linkColor(getApplicationContext().getResources().getColor(R.color.lightBlue));
|
.linkColor(getResources().getColor(R.color.lightBlue));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(TablePlugin.create(getApplicationContext()))
|
.usePlugin(TablePlugin.create(getApplicationContext()))
|
||||||
.usePlugin(TaskListPlugin.create(getApplicationContext()))
|
.usePlugin(TaskListPlugin.create(getApplicationContext()))
|
||||||
.usePlugin(HtmlPlugin.create())
|
.usePlugin(HtmlPlugin.create())
|
||||||
.usePlugin(GifPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
|
.usePlugin(LinkifyPlugin.create())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(getApplicationContext());
|
TinyDB tinyDb = new TinyDB(getApplicationContext());
|
||||||
@ -313,8 +364,8 @@ public class IssueDetailActivity extends AppCompatActivity {
|
|||||||
Picasso.get().load(singleIssue.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(assigneeAvatar);
|
Picasso.get().load(singleIssue.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(assigneeAvatar);
|
||||||
issueTitle.setText(getString(R.string.issueTitleWithId, singleIssue.getNumber(), singleIssue.getTitle()));
|
issueTitle.setText(getString(R.string.issueTitleWithId, singleIssue.getNumber(), singleIssue.getTitle()));
|
||||||
String cleanIssueDescription = singleIssue.getBody().trim();
|
String cleanIssueDescription = singleIssue.getBody().trim();
|
||||||
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
|
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
|
||||||
issueDescription.setText(UserMentions.UserMentionsFunc(getApplicationContext(), bodyWithMD, cleanIssueDescription));
|
markwon.setParsedMarkdown(issueDescription, UserMentions.UserMentionsFunc(getApplicationContext(), bodyWithMD, cleanIssueDescription));
|
||||||
|
|
||||||
RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams)issueDescription.getLayoutParams();
|
RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams)issueDescription.getLayoutParams();
|
||||||
|
|
||||||
|
@ -3,7 +3,9 @@ package org.mian.gitnex.adapters;
|
|||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Color;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@ -25,24 +27,30 @@ import org.ocpsoft.prettytime.PrettyTime;
|
|||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import okhttp3.OkHttpClient;
|
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
import io.noties.markwon.Markwon;
|
||||||
import ru.noties.markwon.Markwon;
|
import io.noties.markwon.core.CorePlugin;
|
||||||
import ru.noties.markwon.core.CorePlugin;
|
import io.noties.markwon.core.MarkwonTheme;
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||||
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
import io.noties.markwon.ext.tables.TablePlugin;
|
||||||
import ru.noties.markwon.ext.tables.TablePlugin;
|
import io.noties.markwon.ext.tasklist.TaskListPlugin;
|
||||||
import ru.noties.markwon.ext.tables.TableTheme;
|
import io.noties.markwon.html.HtmlPlugin;
|
||||||
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
|
import io.noties.markwon.image.AsyncDrawable;
|
||||||
import ru.noties.markwon.html.HtmlPlugin;
|
import io.noties.markwon.image.DefaultMediaDecoder;
|
||||||
import ru.noties.markwon.image.ImagesPlugin;
|
import io.noties.markwon.image.ImageItem;
|
||||||
import ru.noties.markwon.image.gif.GifPlugin;
|
import io.noties.markwon.image.ImagesPlugin;
|
||||||
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
|
import io.noties.markwon.image.SchemeHandler;
|
||||||
|
import io.noties.markwon.image.gif.GifMediaDecoder;
|
||||||
|
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
||||||
|
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -185,8 +193,38 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(context))
|
final Markwon markwon = Markwon.builder(Objects.requireNonNull(context))
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
.usePlugin(ImagesPlugin.createWithAssets(context))
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.addSchemeHandler(new SchemeHandler() {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
||||||
|
|
||||||
|
final int resourceId = context.getResources().getIdentifier(
|
||||||
|
raw.substring("drawable://".length()),
|
||||||
|
"drawable",
|
||||||
|
context.getPackageName());
|
||||||
|
|
||||||
|
final Drawable drawable = context.getDrawable(resourceId);
|
||||||
|
|
||||||
|
assert drawable != null;
|
||||||
|
return ImageItem.withResult(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Collection<String> supportedSchemes() {
|
||||||
|
return Collections.singleton("drawable");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create(context.getResources()));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(context.getResources()));
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||||
@ -196,11 +234,23 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
.linkColor(context.getResources().getColor(R.color.lightBlue));
|
.linkColor(context.getResources().getColor(R.color.lightBlue));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(TablePlugin.create(context))
|
.usePlugin(TablePlugin.create(context))
|
||||||
.usePlugin(TaskListPlugin.create(context))
|
.usePlugin(TaskListPlugin.create(context))
|
||||||
.usePlugin(HtmlPlugin.create())
|
.usePlugin(HtmlPlugin.create())
|
||||||
.usePlugin(GifPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
|
.usePlugin(LinkifyPlugin.create())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
if (!issuesModel.getUser().getFull_name().equals("")) {
|
if (!issuesModel.getUser().getFull_name().equals("")) {
|
||||||
@ -230,8 +280,8 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
if (!issuesModel.getBody().equals("")) {
|
if (!issuesModel.getBody().equals("")) {
|
||||||
String cleanIssueDescription = issuesModel.getBody().trim();
|
String cleanIssueDescription = issuesModel.getBody().trim();
|
||||||
issueDescription.setVisibility(View.VISIBLE);
|
issueDescription.setVisibility(View.VISIBLE);
|
||||||
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
|
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
|
||||||
issueDescription.setText(UserMentions.UserMentionsFunc(context, bodyWithMD, cleanIssueDescription));
|
markwon.setParsedMarkdown(issueDescription, UserMentions.UserMentionsFunc(context, bodyWithMD, cleanIssueDescription));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
issueDescription.setText("");
|
issueDescription.setText("");
|
||||||
|
@ -3,7 +3,9 @@ package org.mian.gitnex.adapters;
|
|||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Color;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -14,7 +16,6 @@ import com.squareup.picasso.Picasso;
|
|||||||
import com.vdurmont.emoji.EmojiParser;
|
import com.vdurmont.emoji.EmojiParser;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.activities.ReplyToIssueActivity;
|
import org.mian.gitnex.activities.ReplyToIssueActivity;
|
||||||
import org.mian.gitnex.helpers.UserMentions;
|
|
||||||
import org.mian.gitnex.helpers.TimeHelper;
|
import org.mian.gitnex.helpers.TimeHelper;
|
||||||
import org.mian.gitnex.models.IssueComments;
|
import org.mian.gitnex.models.IssueComments;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -24,26 +25,32 @@ import org.ocpsoft.prettytime.PrettyTime;
|
|||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
import androidx.appcompat.view.ContextThemeWrapper;
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
import androidx.appcompat.widget.PopupMenu;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import okhttp3.OkHttpClient;
|
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
import io.noties.markwon.Markwon;
|
||||||
import ru.noties.markwon.Markwon;
|
import io.noties.markwon.core.CorePlugin;
|
||||||
import ru.noties.markwon.core.CorePlugin;
|
import io.noties.markwon.core.MarkwonTheme;
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||||
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
import io.noties.markwon.ext.tables.TablePlugin;
|
||||||
import ru.noties.markwon.ext.tables.TablePlugin;
|
import io.noties.markwon.ext.tasklist.TaskListPlugin;
|
||||||
import ru.noties.markwon.ext.tables.TableTheme;
|
import io.noties.markwon.html.HtmlPlugin;
|
||||||
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
|
import io.noties.markwon.image.AsyncDrawable;
|
||||||
import ru.noties.markwon.html.HtmlPlugin;
|
import io.noties.markwon.image.DefaultMediaDecoder;
|
||||||
import ru.noties.markwon.image.ImagesPlugin;
|
import io.noties.markwon.image.ImageItem;
|
||||||
import ru.noties.markwon.image.gif.GifPlugin;
|
import io.noties.markwon.image.ImagesPlugin;
|
||||||
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
|
import io.noties.markwon.image.SchemeHandler;
|
||||||
|
import io.noties.markwon.image.gif.GifMediaDecoder;
|
||||||
|
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
||||||
|
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -180,25 +187,68 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
|
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
.usePlugin(ImagesPlugin.create(mCtx))
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.addSchemeHandler(new SchemeHandler() {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
||||||
|
|
||||||
|
final int resourceId = mCtx.getResources().getIdentifier(
|
||||||
|
raw.substring("drawable://".length()),
|
||||||
|
"drawable",
|
||||||
|
mCtx.getPackageName());
|
||||||
|
|
||||||
|
final Drawable drawable = mCtx.getDrawable(resourceId);
|
||||||
|
|
||||||
|
assert drawable != null;
|
||||||
|
return ImageItem.withResult(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Collection<String> supportedSchemes() {
|
||||||
|
return Collections.singleton("drawable");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources()));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources()));
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||||
builder
|
builder
|
||||||
.codeTextColor(tinyDb.getInt("codeBlockColor"))
|
.codeTextColor(tinyDb.getInt("codeBlockColor"))
|
||||||
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"));
|
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
|
||||||
|
.linkColor(mCtx.getResources().getColor(R.color.lightBlue));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(TablePlugin.create(mCtx))
|
.usePlugin(TablePlugin.create(mCtx))
|
||||||
.usePlugin(TaskListPlugin.create(mCtx))
|
.usePlugin(TaskListPlugin.create(mCtx))
|
||||||
.usePlugin(HtmlPlugin.create())
|
.usePlugin(HtmlPlugin.create())
|
||||||
.usePlugin(GifPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
|
.usePlugin(LinkifyPlugin.create())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueComments));
|
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueComments));
|
||||||
holder.issueComment.setText(UserMentions.UserMentionsFunc(mCtx, bodyWithMD, cleanIssueComments));
|
markwon.setParsedMarkdown(holder.issueComment, bodyWithMD);
|
||||||
|
|
||||||
String edited;
|
String edited;
|
||||||
|
|
||||||
|
@ -3,7 +3,9 @@ package org.mian.gitnex.adapters;
|
|||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Color;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@ -25,24 +27,30 @@ import org.ocpsoft.prettytime.PrettyTime;
|
|||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import okhttp3.OkHttpClient;
|
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
import io.noties.markwon.Markwon;
|
||||||
import ru.noties.markwon.Markwon;
|
import io.noties.markwon.core.CorePlugin;
|
||||||
import ru.noties.markwon.core.CorePlugin;
|
import io.noties.markwon.core.MarkwonTheme;
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||||
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
import io.noties.markwon.ext.tables.TablePlugin;
|
||||||
import ru.noties.markwon.ext.tables.TablePlugin;
|
import io.noties.markwon.ext.tasklist.TaskListPlugin;
|
||||||
import ru.noties.markwon.ext.tables.TableTheme;
|
import io.noties.markwon.html.HtmlPlugin;
|
||||||
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
|
import io.noties.markwon.image.AsyncDrawable;
|
||||||
import ru.noties.markwon.html.HtmlPlugin;
|
import io.noties.markwon.image.DefaultMediaDecoder;
|
||||||
import ru.noties.markwon.image.ImagesPlugin;
|
import io.noties.markwon.image.ImageItem;
|
||||||
import ru.noties.markwon.image.gif.GifPlugin;
|
import io.noties.markwon.image.ImagesPlugin;
|
||||||
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
|
import io.noties.markwon.image.SchemeHandler;
|
||||||
|
import io.noties.markwon.image.gif.GifMediaDecoder;
|
||||||
|
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
||||||
|
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -185,8 +193,38 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
|||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(context))
|
final Markwon markwon = Markwon.builder(Objects.requireNonNull(context))
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
.usePlugin(ImagesPlugin.createWithAssets(context))
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.addSchemeHandler(new SchemeHandler() {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
||||||
|
|
||||||
|
final int resourceId = context.getResources().getIdentifier(
|
||||||
|
raw.substring("drawable://".length()),
|
||||||
|
"drawable",
|
||||||
|
context.getPackageName());
|
||||||
|
|
||||||
|
final Drawable drawable = context.getDrawable(resourceId);
|
||||||
|
|
||||||
|
assert drawable != null;
|
||||||
|
return ImageItem.withResult(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Collection<String> supportedSchemes() {
|
||||||
|
return Collections.singleton("drawable");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create(context.getResources()));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(context.getResources()));
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||||
@ -196,11 +234,23 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
|||||||
.linkColor(context.getResources().getColor(R.color.lightBlue));
|
.linkColor(context.getResources().getColor(R.color.lightBlue));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(TablePlugin.create(context))
|
.usePlugin(TablePlugin.create(context))
|
||||||
.usePlugin(TaskListPlugin.create(context))
|
.usePlugin(TaskListPlugin.create(context))
|
||||||
.usePlugin(HtmlPlugin.create())
|
.usePlugin(HtmlPlugin.create())
|
||||||
.usePlugin(GifPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
|
.usePlugin(LinkifyPlugin.create())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
if (!issuesModel.getUser().getFull_name().equals("")) {
|
if (!issuesModel.getUser().getFull_name().equals("")) {
|
||||||
@ -230,8 +280,8 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
|||||||
if (!issuesModel.getBody().equals("")) {
|
if (!issuesModel.getBody().equals("")) {
|
||||||
String cleanIssueDescription = issuesModel.getBody().trim();
|
String cleanIssueDescription = issuesModel.getBody().trim();
|
||||||
issueDescription.setVisibility(View.VISIBLE);
|
issueDescription.setVisibility(View.VISIBLE);
|
||||||
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
|
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
|
||||||
issueDescription.setText(UserMentions.UserMentionsFunc(context, bodyWithMD, cleanIssueDescription));
|
markwon.setParsedMarkdown(issueDescription, UserMentions.UserMentionsFunc(context, bodyWithMD, cleanIssueDescription));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
issueDescription.setText("");
|
issueDescription.setText("");
|
||||||
|
@ -3,6 +3,9 @@ package org.mian.gitnex.adapters;
|
|||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@ -22,25 +25,31 @@ import java.text.DateFormat;
|
|||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import okhttp3.OkHttpClient;
|
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
import io.noties.markwon.Markwon;
|
||||||
import ru.noties.markwon.Markwon;
|
import io.noties.markwon.core.CorePlugin;
|
||||||
import ru.noties.markwon.core.CorePlugin;
|
import io.noties.markwon.core.MarkwonTheme;
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||||
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
import io.noties.markwon.ext.tables.TablePlugin;
|
||||||
import ru.noties.markwon.ext.tables.TablePlugin;
|
import io.noties.markwon.ext.tasklist.TaskListPlugin;
|
||||||
import ru.noties.markwon.ext.tables.TableTheme;
|
import io.noties.markwon.html.HtmlPlugin;
|
||||||
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
|
import io.noties.markwon.image.AsyncDrawable;
|
||||||
import ru.noties.markwon.html.HtmlPlugin;
|
import io.noties.markwon.image.DefaultMediaDecoder;
|
||||||
import ru.noties.markwon.image.ImagesPlugin;
|
import io.noties.markwon.image.ImageItem;
|
||||||
import ru.noties.markwon.image.gif.GifPlugin;
|
import io.noties.markwon.image.ImagesPlugin;
|
||||||
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
|
import io.noties.markwon.image.SchemeHandler;
|
||||||
|
import io.noties.markwon.image.gif.GifMediaDecoder;
|
||||||
|
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
||||||
|
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -116,8 +125,38 @@ public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.Mi
|
|||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
|
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
.usePlugin(ImagesPlugin.createWithAssets(mCtx))
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.addSchemeHandler(new SchemeHandler() {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
||||||
|
|
||||||
|
final int resourceId = mCtx.getResources().getIdentifier(
|
||||||
|
raw.substring("drawable://".length()),
|
||||||
|
"drawable",
|
||||||
|
mCtx.getPackageName());
|
||||||
|
|
||||||
|
final Drawable drawable = mCtx.getDrawable(resourceId);
|
||||||
|
|
||||||
|
assert drawable != null;
|
||||||
|
return ImageItem.withResult(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Collection<String> supportedSchemes() {
|
||||||
|
return Collections.singleton("drawable");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources()));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources()));
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||||
@ -127,14 +166,27 @@ public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.Mi
|
|||||||
.linkColor(mCtx.getResources().getColor(R.color.lightBlue));
|
.linkColor(mCtx.getResources().getColor(R.color.lightBlue));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(TablePlugin.create(mCtx))
|
.usePlugin(TablePlugin.create(mCtx))
|
||||||
.usePlugin(TaskListPlugin.create(mCtx))
|
.usePlugin(TaskListPlugin.create(mCtx))
|
||||||
.usePlugin(HtmlPlugin.create())
|
.usePlugin(HtmlPlugin.create())
|
||||||
.usePlugin(GifPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
|
.usePlugin(LinkifyPlugin.create())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
holder.msTitle.setText(currentItem.getTitle());
|
Spanned msTitle = markwon.toMarkdown(currentItem.getTitle());
|
||||||
|
markwon.setParsedMarkdown(holder.msTitle, msTitle);
|
||||||
//holder.msStatus.setText(currentItem.getState());
|
//holder.msStatus.setText(currentItem.getState());
|
||||||
|
|
||||||
if(currentItem.getState().equals("open")) {
|
if(currentItem.getState().equals("open")) {
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package org.mian.gitnex.adapters;
|
package org.mian.gitnex.adapters;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Color;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.net.Uri;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.text.method.LinkMovementMethod;
|
import android.text.method.LinkMovementMethod;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -13,22 +15,30 @@ import com.amulyakhare.textdrawable.TextDrawable;
|
|||||||
import com.vdurmont.emoji.EmojiParser;
|
import com.vdurmont.emoji.EmojiParser;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.models.Releases;
|
import org.mian.gitnex.models.Releases;
|
||||||
|
import org.mian.gitnex.util.TinyDB;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import okhttp3.OkHttpClient;
|
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
import io.noties.markwon.Markwon;
|
||||||
import ru.noties.markwon.Markwon;
|
import io.noties.markwon.core.CorePlugin;
|
||||||
import ru.noties.markwon.core.CorePlugin;
|
import io.noties.markwon.core.MarkwonTheme;
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||||
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
import io.noties.markwon.ext.tables.TablePlugin;
|
||||||
import ru.noties.markwon.ext.tables.TablePlugin;
|
import io.noties.markwon.ext.tasklist.TaskListPlugin;
|
||||||
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
|
import io.noties.markwon.html.HtmlPlugin;
|
||||||
import ru.noties.markwon.html.HtmlPlugin;
|
import io.noties.markwon.image.AsyncDrawable;
|
||||||
import ru.noties.markwon.image.ImagesPlugin;
|
import io.noties.markwon.image.DefaultMediaDecoder;
|
||||||
import ru.noties.markwon.image.gif.GifPlugin;
|
import io.noties.markwon.image.ImageItem;
|
||||||
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
|
import io.noties.markwon.image.ImagesPlugin;
|
||||||
|
import io.noties.markwon.image.SchemeHandler;
|
||||||
|
import io.noties.markwon.image.gif.GifMediaDecoder;
|
||||||
|
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
||||||
|
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -77,6 +87,8 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
|
|||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) {
|
||||||
|
|
||||||
|
final TinyDB tinyDb = new TinyDB(mCtx);
|
||||||
|
|
||||||
Releases currentItem = releasesList.get(position);
|
Releases currentItem = releasesList.get(position);
|
||||||
|
|
||||||
holder.releaseTitle.setText(currentItem.getName());
|
holder.releaseTitle.setText(currentItem.getName());
|
||||||
@ -115,28 +127,70 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
|
|||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
|
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
.usePlugin(ImagesPlugin.createWithAssets(mCtx))
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.addSchemeHandler(new SchemeHandler() {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
||||||
|
|
||||||
|
final int resourceId = mCtx.getResources().getIdentifier(
|
||||||
|
raw.substring("drawable://".length()),
|
||||||
|
"drawable",
|
||||||
|
mCtx.getPackageName());
|
||||||
|
|
||||||
|
final Drawable drawable = mCtx.getDrawable(resourceId);
|
||||||
|
|
||||||
|
assert drawable != null;
|
||||||
|
return ImageItem.withResult(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Collection<String> supportedSchemes() {
|
||||||
|
return Collections.singleton("drawable");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources()));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources()));
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||||
builder
|
builder
|
||||||
.codeTextColor(Color.GREEN)
|
.codeTextColor(tinyDb.getInt("codeBlockColor"))
|
||||||
.codeBackgroundColor(Color.BLACK)
|
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
|
||||||
.linkColor(mCtx.getResources().getColor(R.color.lightBlue));
|
.linkColor(mCtx.getResources().getColor(R.color.lightBlue));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(TablePlugin.create(mCtx))
|
.usePlugin(TablePlugin.create(mCtx))
|
||||||
.usePlugin(TaskListPlugin.create(mCtx))
|
.usePlugin(TaskListPlugin.create(mCtx))
|
||||||
.usePlugin(HtmlPlugin.create())
|
.usePlugin(HtmlPlugin.create())
|
||||||
.usePlugin(GifPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
|
.usePlugin(LinkifyPlugin.create())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(currentItem.getBody()));
|
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(currentItem.getBody()));
|
||||||
|
|
||||||
if(!currentItem.getBody().equals("")) {
|
if(!currentItem.getBody().equals("")) {
|
||||||
holder.releaseDescription.setText(bodyWithMD);
|
markwon.setParsedMarkdown(holder.releaseDescription, bodyWithMD);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
holder.releaseDescription.setVisibility(View.GONE);
|
holder.releaseDescription.setVisibility(View.GONE);
|
||||||
|
@ -1,24 +1,31 @@
|
|||||||
package org.mian.gitnex.fragments;
|
package org.mian.gitnex.fragments;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import okhttp3.OkHttpClient;
|
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||||
|
import io.noties.markwon.Markwon;
|
||||||
|
import io.noties.markwon.core.CorePlugin;
|
||||||
|
import io.noties.markwon.core.MarkwonTheme;
|
||||||
|
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||||
|
import io.noties.markwon.ext.tables.TablePlugin;
|
||||||
|
import io.noties.markwon.ext.tasklist.TaskListPlugin;
|
||||||
|
import io.noties.markwon.html.HtmlPlugin;
|
||||||
|
import io.noties.markwon.image.AsyncDrawable;
|
||||||
|
import io.noties.markwon.image.DefaultMediaDecoder;
|
||||||
|
import io.noties.markwon.image.ImageItem;
|
||||||
|
import io.noties.markwon.image.ImagesPlugin;
|
||||||
|
import io.noties.markwon.image.SchemeHandler;
|
||||||
|
import io.noties.markwon.image.gif.GifMediaDecoder;
|
||||||
|
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
||||||
|
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
import android.text.Spanned;
|
||||||
import ru.noties.markwon.Markwon;
|
|
||||||
import ru.noties.markwon.core.CorePlugin;
|
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
|
||||||
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
|
||||||
import ru.noties.markwon.ext.tables.TablePlugin;
|
|
||||||
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
|
|
||||||
import ru.noties.markwon.html.HtmlPlugin;
|
|
||||||
import ru.noties.markwon.image.ImagesPlugin;
|
|
||||||
import ru.noties.markwon.image.gif.GifPlugin;
|
|
||||||
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -40,6 +47,8 @@ import org.mian.gitnex.util.TinyDB;
|
|||||||
import org.ocpsoft.prettytime.PrettyTime;
|
import org.ocpsoft.prettytime.PrettyTime;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@ -300,8 +309,38 @@ public class RepoInfoFragment extends Fragment {
|
|||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(getContext()))
|
final Markwon markwon = Markwon.builder(Objects.requireNonNull(getContext()))
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
.usePlugin(ImagesPlugin.createWithAssets(getContext()))
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.addSchemeHandler(new SchemeHandler() {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
||||||
|
|
||||||
|
final int resourceId = getContext().getResources().getIdentifier(
|
||||||
|
raw.substring("drawable://".length()),
|
||||||
|
"drawable",
|
||||||
|
getContext().getPackageName());
|
||||||
|
|
||||||
|
final Drawable drawable = getContext().getDrawable(resourceId);
|
||||||
|
|
||||||
|
assert drawable != null;
|
||||||
|
return ImageItem.withResult(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Collection<String> supportedSchemes() {
|
||||||
|
return Collections.singleton("drawable");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create(getContext().getResources()));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(getContext().getResources()));
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||||
@ -311,18 +350,31 @@ public class RepoInfoFragment extends Fragment {
|
|||||||
.linkColor(getResources().getColor(R.color.lightBlue));
|
.linkColor(getResources().getColor(R.color.lightBlue));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
|
||||||
|
@Override
|
||||||
|
public void configureImages(@NonNull ImagesPlugin plugin) {
|
||||||
|
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}))
|
||||||
.usePlugin(TablePlugin.create(getContext()))
|
.usePlugin(TablePlugin.create(getContext()))
|
||||||
.usePlugin(TaskListPlugin.create(getContext()))
|
.usePlugin(TaskListPlugin.create(getContext()))
|
||||||
.usePlugin(HtmlPlugin.create())
|
.usePlugin(HtmlPlugin.create())
|
||||||
.usePlugin(GifPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
|
.usePlugin(LinkifyPlugin.create())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
CharSequence bodyWithMD = null;
|
Spanned bodyWithMD = null;
|
||||||
if (response.body() != null) {
|
if (response.body() != null) {
|
||||||
bodyWithMD = markwon.toMarkdown(response.body());
|
bodyWithMD = markwon.toMarkdown(response.body());
|
||||||
}
|
}
|
||||||
repoFileContents.setText(bodyWithMD);
|
assert bodyWithMD != null;
|
||||||
|
markwon.setParsedMarkdown(repoFileContents, bodyWithMD);
|
||||||
|
|
||||||
|
|
||||||
} else if (response.code() == 401) {
|
} else if (response.code() == 401) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user