diff --git a/app/src/main/assets/release_notes/notes.json b/app/src/main/assets/release_notes/notes.json index 668d396b..93624b46 100644 --- a/app/src/main/assets/release_notes/notes.json +++ b/app/src/main/assets/release_notes/notes.json @@ -1,4 +1,9 @@ [ + { + "version": "3.9.7", + "code": "442", + "note": "Added:\n- Dracula theme\n\nChanged:\n- Colors for Light/Dark/Black themes\n\nFixed:\n- Animated profile pictures not displayed\n- Mentions broken in profile bio and fields\n- Tag patterns in URL break the link\n- Typo in followed tags" + }, { "version": "3.9.6", "code": "441", diff --git a/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java b/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java index 01afc9ce..c7da2d94 100644 --- a/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java @@ -25,6 +25,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.res.ColorStateList; +import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.SpannableString; @@ -262,6 +263,7 @@ public class ProfileActivity extends BaseActivity { }); boolean disableGif = sharedpreferences.getBoolean(getString(R.string.SET_DISABLE_GIF), false); String targetedUrl = disableGif ? account.avatar_static : account.avatar; + // MastodonHelper.loadPPMastodon(binding.accountPp, account); Glide.with(ProfileActivity.this) .asDrawable() .dontTransform() @@ -271,6 +273,11 @@ public class ProfileActivity extends BaseActivity { public void onResourceReady(@NonNull final Drawable resource, Transition transition) { binding.profilePicture.setImageDrawable(resource); binding.accountPp.setImageDrawable(resource); + if (resource instanceof Animatable) { + binding.profilePicture.animate(); + binding.accountPp.animate(); + ((Animatable) resource).start(); + } ActivityCompat.startPostponedEnterTransition(ProfileActivity.this); } @@ -390,7 +397,7 @@ public class ProfileActivity extends BaseActivity { TextView.BufferType.SPANNABLE); binding.accountNote.setMovementMethod(LinkMovementMethod.getInstance()); - //MastodonHelper.loadPPMastodon(binding.accountPp, account); + binding.accountPp.setOnClickListener(v -> { Intent intent = new Intent(ProfileActivity.this, MediaActivity.class); Bundle b = new Bundle(); diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Account.java b/app/src/main/java/app/fedilab/android/client/entities/api/Account.java index 9ece8182..7a2bd1f2 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Account.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Account.java @@ -85,7 +85,7 @@ public class Account implements Serializable { if (display_name == null || display_name.isEmpty()) { display_name = username; } - return SpannableHelper.convert(context, display_name, null, this, null, false, viewWeakReference); + return SpannableHelper.convert(context, display_name, null, this, null, false, false, viewWeakReference); } public synchronized Spannable getSpanDisplayName(Activity activity, WeakReference viewWeakReference) { @@ -96,11 +96,11 @@ public class Account implements Serializable { } public synchronized Spannable getSpanDisplayNameTitle(Context context, WeakReference viewWeakReference, String title) { - return SpannableHelper.convert(context, title, null, this, null, false, viewWeakReference); + return SpannableHelper.convert(context, title, null, this, null, false, false, viewWeakReference); } public synchronized Spannable getSpanNote(Context context, WeakReference viewWeakReference) { - return SpannableHelper.convert(context, note, null, this, null, true, viewWeakReference); + return SpannableHelper.convert(context, note, null, this, null, true, true, viewWeakReference); } public static class AccountParams implements Serializable { diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Announcement.java b/app/src/main/java/app/fedilab/android/client/entities/api/Announcement.java index b015313f..808ac6e5 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Announcement.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Announcement.java @@ -56,7 +56,7 @@ public class Announcement { public synchronized Spannable getSpanContent(Context context, WeakReference viewWeakReference) { - return SpannableHelper.convert(context, content, null, null, this, true, viewWeakReference); + return SpannableHelper.convert(context, content, null, null, this, true, false, viewWeakReference); } } diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Field.java b/app/src/main/java/app/fedilab/android/client/entities/api/Field.java index 0fdbb3a6..af574ee3 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Field.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Field.java @@ -47,7 +47,7 @@ public class Field implements Serializable { if (verified_at != null && value != null) { value_span = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.verified_text)); } - Spannable spannable = SpannableHelper.convert(context, value, null, account, null, true, viewWeakReference); + Spannable spannable = SpannableHelper.convert(context, value, null, account, null, true, true, viewWeakReference); if (value_span != null && spannable != null) { spannable.setSpan(value_span, 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } @@ -57,7 +57,7 @@ public class Field implements Serializable { public synchronized Spannable getLabelSpan(Context context, Account account, WeakReference viewWeakReference) { - Spannable spannable = SpannableHelper.convert(context, name, null, account, null, true, viewWeakReference); + Spannable spannable = SpannableHelper.convert(context, name, null, account, null, true, true, viewWeakReference); if (name_span != null && spannable != null) { spannable.setSpan(name_span, 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Poll.java b/app/src/main/java/app/fedilab/android/client/entities/api/Poll.java index 3bf9c479..cf0d1d8b 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Poll.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Poll.java @@ -61,7 +61,7 @@ public class Poll implements Serializable { public transient Spannable span_title; public Spannable getSpanTitle(Context context, Status status, WeakReference viewWeakReference) { - span_title = SpannableHelper.convert(context, title, status, null, null, false, viewWeakReference); + span_title = SpannableHelper.convert(context, title, status, null, null, false, false, viewWeakReference); return span_title; } } diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Status.java b/app/src/main/java/app/fedilab/android/client/entities/api/Status.java index 77302283..7c39f487 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Status.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Status.java @@ -130,21 +130,21 @@ public class Status implements Serializable, Cloneable { public synchronized Spannable getSpanContent(Context context, WeakReference viewWeakReference, Callback callback) { if (contentSpan == null) { - contentSpan = SpannableHelper.convert(context, content, this, null, null, true, viewWeakReference, callback); + contentSpan = SpannableHelper.convert(context, content, this, null, null, true, false, viewWeakReference, callback); } return contentSpan; } public synchronized Spannable getSpanSpoiler(Context context, WeakReference viewWeakReference, Callback callback) { if (contentSpoilerSpan == null) { - contentSpoilerSpan = SpannableHelper.convert(context, spoiler_text, this, null, null, true, viewWeakReference, callback); + contentSpoilerSpan = SpannableHelper.convert(context, spoiler_text, this, null, null, true, false, viewWeakReference, callback); } return contentSpoilerSpan; } public synchronized Spannable getSpanTranslate(Context context, WeakReference viewWeakReference, Callback callback) { if (contentTranslateSpan == null) { - contentTranslateSpan = SpannableHelper.convert(context, translationContent, this, null, null, true, viewWeakReference, callback); + contentTranslateSpan = SpannableHelper.convert(context, translationContent, this, null, null, true, false, viewWeakReference, callback); } return contentTranslateSpan; } diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index 6b1fe40c..66da5a5e 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -91,13 +91,14 @@ public class SpannableHelper { public static Spannable convert(Context context, String text, Status status, Account account, Announcement announcement, - boolean convertHtml, WeakReference viewWeakReference) { - return convert(context, text, status, account, announcement, convertHtml, viewWeakReference, null); + boolean convertHtml, boolean forceMentions, WeakReference viewWeakReference) { + return convert(context, text, status, account, announcement, convertHtml, forceMentions, viewWeakReference, null); } public static Spannable convert(Context context, String text, Status status, Account account, Announcement announcement, boolean convertHtml, + boolean forceMentions, WeakReference viewWeakReference, Status.Callback callback) { @@ -155,7 +156,7 @@ public class SpannableHelper { content.removeSpan(span); } //Make tags, mentions, groups - interaction(context, content, status, mentionList); + interaction(context, content, status, mentionList, forceMentions); //Make all links linkify(context, content, urlDetails); linkifyURL(context, content, urlDetails); @@ -745,15 +746,15 @@ public class SpannableHelper { } } - private static void interaction(Context context, Spannable content, Status status, List mentions) { + private static void interaction(Context context, Spannable content, Status status, List mentions, boolean forceMentions) { // --- For all patterns defined in Helper class --- for (Map.Entry entry : Helper.patternHashMap.entrySet()) { Helper.PatternType patternType = entry.getKey(); Pattern pattern = entry.getValue(); Matcher matcher = pattern.matcher(content); - if (pattern == Helper.mentionPattern && mentions == null) { + if (pattern == Helper.mentionPattern && mentions == null && !forceMentions) { continue; - } else if (pattern == Helper.mentionLongPattern && mentions == null) { + } else if (pattern == Helper.mentionLongPattern && mentions == null && !forceMentions) { continue; } diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/442.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/442.txt new file mode 100644 index 00000000..8fa5e441 --- /dev/null +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/442.txt @@ -0,0 +1,11 @@ +Added: +- Dracula theme + +Changed: +- Colors for Light/Dark/Black themes + +Fixed: +- Animated profile pictures not displayed +- Mentions broken in profile bio and fields +- Tag patterns in URL break the link +- Typo in followed tags \ No newline at end of file