Compare commits

...

4 Commits

Author SHA1 Message Date
Balazs Toldi
82414bba55
Highlight pinned posts
This commits adds a pin icon to featured posts on communities or on the instance.
2023-08-10 21:44:36 +02:00
Balazs Toldi
7a39b2341b
Small fixes related to parsing and soring
Closes #96
2023-08-10 21:12:49 +02:00
Balazs Toldi
37ab47bc34
Fix wierd issue when trying to open reddit@lemmy.world 2023-08-10 21:03:04 +02:00
Balazs Toldi
21b111cc2d
Fix crash when trying to share sack trace
Closes #80
2023-08-10 20:44:26 +02:00
8 changed files with 52 additions and 24 deletions

View File

@ -43,7 +43,7 @@ public class SortType {
TOP_TWELVE_HOURS("TopTwelveHour", "Top"), TOP_TWELVE_HOURS("TopTwelveHour", "Top"),
TOP_DAY("TopDay", "Top"), TOP_DAY("TopDay", "Top"),
TOP_WEEK("TopWeek", "Top"), TOP_WEEK("TopWeek", "Top"),
TOP_MONTH("month", "Top"), TOP_MONTH("TopMonth", "Top"),
TOP_THREE_MONTHS("TopThreeMonths", "Top"), TOP_THREE_MONTHS("TopThreeMonths", "Top"),
TOP_SIX_MONTHS("TopSixMonths", "Top"), TOP_SIX_MONTHS("TopSixMonths", "Top"),
TOP_NINE_MONTHS("TopNineMonths", "Top"), TOP_NINE_MONTHS("TopNineMonths", "Top"),

View File

@ -641,9 +641,12 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
break; break;
} }
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) { if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isFeaturedInCommunity() || post.isFeaturedOnInstance()) {
((PostBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE); ((PostBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostBaseViewHolder) holder).stickiedPostImageView); mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostBaseViewHolder) holder).stickiedPostImageView);
if (post.isFeaturedOnInstance()) {
((PostBaseViewHolder) holder).stickiedPostImageView.setColorFilter(mModeratorColor, android.graphics.PorterDuff.Mode.SRC_IN);
}
} }
if (post.isArchived()) { if (post.isArchived()) {
@ -1210,7 +1213,7 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
} }
} }
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) { if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isFeaturedInCommunity()) {
((PostCompactBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE); ((PostCompactBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostCompactBaseViewHolder) holder).stickiedPostImageView); mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostCompactBaseViewHolder) holder).stickiedPostImageView);
} }

View File

@ -99,7 +99,6 @@ import eu.toldi.infinityforlemmy.markdown.MarkdownUtils;
import eu.toldi.infinityforlemmy.post.Post; import eu.toldi.infinityforlemmy.post.Post;
import eu.toldi.infinityforlemmy.post.PostPagingSource; import eu.toldi.infinityforlemmy.post.PostPagingSource;
import eu.toldi.infinityforlemmy.utils.APIUtils; import eu.toldi.infinityforlemmy.utils.APIUtils;
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils; import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
import eu.toldi.infinityforlemmy.utils.Utils; import eu.toldi.infinityforlemmy.utils.Utils;
import eu.toldi.infinityforlemmy.videoautoplay.CacheManager; import eu.toldi.infinityforlemmy.videoautoplay.CacheManager;
@ -586,7 +585,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
((PostDetailBaseViewHolder) holder).mUserTextView.setText(mPost.getAuthor()); ((PostDetailBaseViewHolder) holder).mUserTextView.setText(mPost.getAuthor());
} }
if (mPost.isModerator()) { if (mPost.isModerator() || mPost.isAdmin()) {
((PostDetailBaseViewHolder) holder).mUserTextView.setTextColor(mModeratorColor); ((PostDetailBaseViewHolder) holder).mUserTextView.setTextColor(mModeratorColor);
Drawable moderatorDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_verified_user_14dp, mModeratorColor); Drawable moderatorDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_verified_user_14dp, mModeratorColor);
((PostDetailBaseViewHolder) holder).mUserTextView.setCompoundDrawablesWithIntrinsicBounds( ((PostDetailBaseViewHolder) holder).mUserTextView.setCompoundDrawablesWithIntrinsicBounds(

View File

@ -541,7 +541,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
((PostBaseViewHolder) holder).userTextView.setTextColor( ((PostBaseViewHolder) holder).userTextView.setTextColor(
post.isModerator() ? mModeratorColor : mUsernameColor); post.isModerator() || post.isAdmin() ? mModeratorColor : mUsernameColor);
if (mDisplaySubredditName) { if (mDisplaySubredditName) {
if (authorPrefixed.equals(post.getSubredditNamePrefixed())) { if (authorPrefixed.equals(post.getSubredditNamePrefixed())) {
@ -700,9 +700,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
((PostBaseViewHolder) holder).downvoteTextView.setTextColor(mPostIconAndInfoColor); ((PostBaseViewHolder) holder).downvoteTextView.setTextColor(mPostIconAndInfoColor);
} }
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) { if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isFeaturedInCommunity() || post.isFeaturedOnInstance()) {
((PostBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE); ((PostBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostBaseViewHolder) holder).stickiedPostImageView); mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostBaseViewHolder) holder).stickiedPostImageView);
if (post.isFeaturedOnInstance()) {
((PostBaseViewHolder) holder).stickiedPostImageView.setColorFilter(mModeratorColor, android.graphics.PorterDuff.Mode.SRC_IN);
}
} }
if (post.isArchived()) { if (post.isArchived()) {
@ -1239,7 +1242,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
((PostCompactBaseViewHolder) holder).nameTextView.setTextColor( ((PostCompactBaseViewHolder) holder).nameTextView.setTextColor(
post.isModerator() ? mModeratorColor : mUsernameColor); post.isModerator() || post.isAdmin() ? mModeratorColor : mUsernameColor);
if (mHideSubredditAndUserPrefix) { if (mHideSubredditAndUserPrefix) {
((PostCompactBaseViewHolder) holder).nameTextView.setText(post.getAuthor()); ((PostCompactBaseViewHolder) holder).nameTextView.setText(post.getAuthor());
@ -1333,7 +1336,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
} }
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) { if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isFeaturedInCommunity()) {
((PostCompactBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE); ((PostCompactBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostCompactBaseViewHolder) holder).stickiedPostImageView); mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostCompactBaseViewHolder) holder).stickiedPostImageView);
} }

View File

@ -33,7 +33,6 @@ import java.util.concurrent.Executor;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import eu.toldi.infinityforlemmy.markdown.MarkdownUtils;
import eu.toldi.infinityforlemmy.postfilter.PostFilter; import eu.toldi.infinityforlemmy.postfilter.PostFilter;
import eu.toldi.infinityforlemmy.utils.JSONUtils; import eu.toldi.infinityforlemmy.utils.JSONUtils;
import eu.toldi.infinityforlemmy.utils.LemmyUtils; import eu.toldi.infinityforlemmy.utils.LemmyUtils;
@ -187,7 +186,7 @@ public class ParsePost {
boolean nsfw = post.getBoolean("nsfw"); boolean nsfw = post.getBoolean("nsfw");
boolean locked = post.getBoolean("locked"); boolean locked = post.getBoolean("locked");
boolean saved = data.getBoolean("saved"); boolean saved = data.getBoolean("saved");
String distinguished = ""; String distinguished = (creator.getBoolean("admin") ? "admin" : "");
String suggestedSort = ""; String suggestedSort = "";
ArrayList <Post.Preview> previews = new ArrayList<>(); ArrayList <Post.Preview> previews = new ArrayList<>();
if(!post.isNull("thumbnail_url")) { if(!post.isNull("thumbnail_url")) {
@ -219,6 +218,9 @@ public class ParsePost {
String authorAvatar = (!data.getJSONObject("creator").isNull("avatar")) ? data.getJSONObject("creator").getString("avatar") : null; String authorAvatar = (!data.getJSONObject("creator").isNull("avatar")) ? data.getJSONObject("creator").getString("avatar") : null;
Uri uri = Uri.parse(url); Uri uri = Uri.parse(url);
if (uri.getAuthority() == null) {
Log.e("ParsePost", "parseData:" + uri.toString());
}
String path = uri.getPath(); String path = uri.getPath();
boolean isVideo = path.endsWith(".mp4") || path.endsWith(".webm") || path.endsWith(".gifv"); boolean isVideo = path.endsWith(".mp4") || path.endsWith(".webm") || path.endsWith(".gifv");
@ -364,7 +366,7 @@ public class ParsePost {
post.setPreviews(previews); post.setPreviews(previews);
post.setVideoUrl(url); post.setVideoUrl(url);
} else if (uri.getAuthority().contains("imgur.com") && (path.endsWith(".gifv") || path.endsWith(".mp4"))) { } else if (uri.getAuthority() != null && uri.getAuthority().contains("imgur.com") && (path.endsWith(".gifv") || path.endsWith(".mp4"))) {
// Imgur gifv/mp4 // Imgur gifv/mp4
int postType = Post.VIDEO_TYPE; int postType = Post.VIDEO_TYPE;
@ -657,7 +659,7 @@ public class ParsePost {
post.setVoteType(data.getInt("my_vote")); post.setVoteType(data.getInt("my_vote"));
if(post.getVoteType() == 1) if(post.getVoteType() == 1)
post.setUpvotes(post.getUpvotes() - 1); post.setUpvotes(post.getUpvotes() - 1);
else if(post.getVoteType() == -1) else if (post.getVoteType() == -1)
post.setDownvotes(post.getDownvotes() - 1); post.setDownvotes(post.getDownvotes() - 1);
} }
if (!data.getJSONObject("post").isNull("body")) { if (!data.getJSONObject("post").isNull("body")) {
@ -666,7 +668,13 @@ public class ParsePost {
post.setSelfTextPlain(body); post.setSelfTextPlain(body);
post.setSelfTextPlainTrimmed(body.trim()); post.setSelfTextPlainTrimmed(body.trim());
} }
if (data.getJSONObject("post").getBoolean("featured_community")) {
post.setFeaturedInCommunity(true);
}
if (data.getJSONObject("post").getBoolean("featured_local")) {
post.setFeaturedOnInstance(true);
}
post.setAuthorIconUrl(authorAvatar); post.setAuthorIconUrl(authorAvatar);
post.setSubredditIconUrl(communityURL); post.setSubredditIconUrl(communityURL);
return post; return post;

View File

@ -66,7 +66,9 @@ public class Post implements Parcelable {
private int upvoteRatio; private int upvoteRatio;
private boolean hidden; private boolean hidden;
private boolean nsfw; private boolean nsfw;
private boolean stickied; private boolean featuredInCommunity;
private boolean featuredOnInstance;
private boolean archived; private boolean archived;
private boolean locked; private boolean locked;
private boolean saved; private boolean saved;
@ -101,7 +103,6 @@ public class Post implements Parcelable {
this.upvoteRatio = upvoteRatio; this.upvoteRatio = upvoteRatio;
this.hidden = hidden; this.hidden = hidden;
this.nsfw = nsfw; this.nsfw = nsfw;
this.stickied = stickied;
this.archived = archived; this.archived = archived;
this.locked = locked; this.locked = locked;
this.saved = saved; this.saved = saved;
@ -134,7 +135,6 @@ public class Post implements Parcelable {
this.upvoteRatio = upvoteRatio; this.upvoteRatio = upvoteRatio;
this.hidden = hidden; this.hidden = hidden;
this.nsfw = nsfw; this.nsfw = nsfw;
this.stickied = stickied;
this.archived = archived; this.archived = archived;
this.locked = locked; this.locked = locked;
this.saved = saved; this.saved = saved;
@ -177,7 +177,7 @@ public class Post implements Parcelable {
upvoteRatio = in.readInt(); upvoteRatio = in.readInt();
hidden = in.readByte() != 0; hidden = in.readByte() != 0;
nsfw = in.readByte() != 0; nsfw = in.readByte() != 0;
stickied = in.readByte() != 0; featuredInCommunity = in.readByte() != 0;
archived = in.readByte() != 0; archived = in.readByte() != 0;
locked = in.readByte() != 0; locked = in.readByte() != 0;
saved = in.readByte() != 0; saved = in.readByte() != 0;
@ -444,8 +444,20 @@ public class Post implements Parcelable {
return 0; return 0;
} }
public boolean isStickied() { public boolean isFeaturedInCommunity() {
return stickied; return featuredInCommunity;
}
public void setFeaturedInCommunity(boolean featuredInCommunity) {
this.featuredInCommunity = featuredInCommunity;
}
public boolean isFeaturedOnInstance() {
return featuredOnInstance;
}
public void setFeaturedOnInstance(boolean featuredOnInstance) {
this.featuredOnInstance = featuredOnInstance;
} }
public boolean isArchived() { public boolean isArchived() {
@ -534,7 +546,7 @@ public class Post implements Parcelable {
parcel.writeInt(upvoteRatio); parcel.writeInt(upvoteRatio);
parcel.writeByte((byte) (hidden ? 1 : 0)); parcel.writeByte((byte) (hidden ? 1 : 0));
parcel.writeByte((byte) (nsfw ? 1 : 0)); parcel.writeByte((byte) (nsfw ? 1 : 0));
parcel.writeByte((byte) (stickied ? 1 : 0)); parcel.writeByte((byte) (featuredInCommunity ? 1 : 0));
parcel.writeByte((byte) (archived ? 1 : 0)); parcel.writeByte((byte) (archived ? 1 : 0));
parcel.writeByte((byte) (locked ? 1 : 0)); parcel.writeByte((byte) (locked ? 1 : 0));
parcel.writeByte((byte) (saved ? 1 : 0)); parcel.writeByte((byte) (saved ? 1 : 0));

View File

@ -105,7 +105,7 @@ public class CrashReportsFragment extends Fragment {
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
return false; return false;
} }
Uri githubIssueUri = Uri.parse(String.format("https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues/new?template=.gitea%2fissue_template%2fbug_report.md", model, appVersion, androidVersion, logs)); Uri githubIssueUri = Uri.parse(String.format("https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues/new?template=.gitea/issue_template/bug_report.md&body=%s", logs));
intent.setData(githubIssueUri); intent.setData(githubIssueUri);
startActivity(intent); startActivity(intent);
return true; return true;

View File

@ -6,7 +6,10 @@ import android.text.SpannableStringBuilder
import android.text.style.URLSpan import android.text.style.URLSpan
import android.text.util.Linkify import android.text.util.Linkify
import eu.toldi.infinityforlemmy.utils.LemmyUtils import eu.toldi.infinityforlemmy.utils.LemmyUtils
import io.noties.markwon.* import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.MarkwonPlugin
import io.noties.markwon.MarkwonVisitor
import io.noties.markwon.SpannableBuilder
import io.noties.markwon.core.CorePlugin import io.noties.markwon.core.CorePlugin
import io.noties.markwon.core.CoreProps import io.noties.markwon.core.CoreProps
import org.commonmark.node.Link import org.commonmark.node.Link
@ -36,13 +39,13 @@ class MarkwonLemmyLinkPlugin : AbstractMarkwonPlugin() {
* Pattern to match lemmy's unique community pattern, e.g. !commmunity[@instance] * Pattern to match lemmy's unique community pattern, e.g. !commmunity[@instance]
*/ */
val lemmyCommunityPattern: Pattern = val lemmyCommunityPattern: Pattern =
Pattern.compile("(?<!\\S)!($communityPatternFragment)(?:@($instancePatternFragment))?\\b") Pattern.compile("(?<!\\S)!($communityPatternFragment)(?:@($instancePatternFragment))\\b")
/** /**
* Pattern to match lemmy's unique user pattern, e.g. @user[@instance] * Pattern to match lemmy's unique user pattern, e.g. @user[@instance]
*/ */
val lemmyUserPattern: Pattern = val lemmyUserPattern: Pattern =
Pattern.compile("(?<!\\S)@($userPatternFragment)(?:@($instancePatternFragment))?\\b") Pattern.compile("(?<!\\S)@($userPatternFragment)(?:@($instancePatternFragment))\\b")
} }
override fun configure(registry: MarkwonPlugin.Registry) { override fun configure(registry: MarkwonPlugin.Registry) {