diff options
9 files changed, 100 insertions, 10 deletions
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 6ac84cac9..f53c1172a 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -41,6 +41,7 @@ import android.text.style.URLSpan; import android.util.Patterns; import android.view.LayoutInflater; import android.view.View; +import android.webkit.URLUtil; import android.widget.Toast; import androidx.annotation.NonNull; @@ -286,19 +287,25 @@ public class SpannableHelper { private static void makeLinks(Context context, SpannableStringBuilder content, String url, int start, int end) { String newUrl = url; - String newURL = Helper.transformURL(context, url); + boolean validUrl = URLUtil.isValidUrl(url) && url.length() == (end - start); + if (validUrl) { + newUrl = Helper.transformURL(context, url); + } + + //If URL has been transformed - if (newURL.compareTo(url) != 0) { - content.replace(start, end, newURL); - end = start + newURL.length(); - url = newURL; + if (validUrl && newUrl.compareTo(url) != 0) { + content.replace(start, end, newUrl); + end = start + newUrl.length(); + url = newUrl; } - if (url.length() > 30 && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("gimini://"))) { + if (url.length() > 30 && (validUrl || url.startsWith("gimini://"))) { newUrl = url.substring(0, 30); newUrl += "…"; content.replace(start, end, newUrl); } - int matchEnd = start + newUrl.length(); + int matchEnd = validUrl ? start + newUrl.length() : end; + String finalUrl = url; if (content.length() < matchEnd) { matchEnd = content.length(); @@ -439,6 +446,8 @@ public class SpannableHelper { textView.setTag(CLICKABLE_SPAN); Pattern link = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(@[\\w._-]*[0-9]*)(/[0-9]+)?$"); Matcher matcherLink = link.matcher(finalUrl); + Pattern linkLong = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(@[\\w_.-]+@[a-zA-Z0-9][a-zA-Z0-9.-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+)(/[0-9]+)?$"); + Matcher matcherLinkLong = linkLong.matcher(finalUrl); if (matcherLink.find() && !finalUrl.contains("medium.com")) { if (matcherLink.group(3) != null && Objects.requireNonNull(matcherLink.group(3)).length() > 0) { //It's a toot CrossActionHelper.fetchRemoteStatus(context, currentAccount, finalUrl, new CrossActionHelper.Callback() { @@ -471,6 +480,38 @@ public class SpannableHelper { } }); } + } else if (matcherLinkLong.find() && !finalUrl.contains("medium.com")) { + if (matcherLinkLong.group(3) != null && Objects.requireNonNull(matcherLinkLong.group(3)).length() > 0) { //It's a toot + CrossActionHelper.fetchRemoteStatus(context, currentAccount, finalUrl, new CrossActionHelper.Callback() { + @Override + public void federatedStatus(Status status) { + Intent intent = new Intent(context, ContextActivity.class); + intent.putExtra(Helper.ARG_STATUS, status); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + @Override + public void federatedAccount(Account account) { + } + }); + } else if (matcherLinkLong.group(2) != null) {//It's an account + CrossActionHelper.fetchRemoteAccount(context, currentAccount, matcherLinkLong.group(2), new CrossActionHelper.Callback() { + @Override + public void federatedStatus(Status status) { + } + + @Override + public void federatedAccount(Account account) { + Intent intent = new Intent(context, ProfileActivity.class); + Bundle b = new Bundle(); + b.putSerializable(Helper.ARG_ACCOUNT, account); + intent.putExtras(b); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + }); + } } else { Helper.openBrowser(context, finalUrl); } diff --git a/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java b/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java index f66b8ca3b..3e9f97be6 100644 --- a/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java +++ b/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java @@ -272,7 +272,7 @@ public class ComposeWorker extends Worker { b.putSerializable(Helper.ARG_STATUS_DRAFT, dataPost.statusDraft); String err = statusResponse.errorBody().string(); if (err.contains("{\"error\":\"")) { - err = err.replaceAll("\\{\"error\":\"(.*)\"}", "$1"); + err = err.replaceAll("\\{\"error\":\"(.*)\"\\}", "$1"); } b.putSerializable(Helper.RECEIVE_ERROR_MESSAGE, err); intentBD.putExtras(b); diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java index 45bf4949b..a3bda4bb7 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java @@ -71,6 +71,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.LinearLayoutCompat; import androidx.appcompat.widget.PopupMenu; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; import androidx.core.app.ActivityOptionsCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; @@ -413,6 +414,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> boolean extraFeatures = sharedpreferences.getBoolean(context.getString(R.string.SET_EXTAND_EXTRA_FEATURES) + MainActivity.currentUserID + MainActivity.currentInstance, false); boolean displayQuote = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_QUOTES) + MainActivity.currentUserID + MainActivity.currentInstance, true); boolean displayReactions = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_REACTIONS) + MainActivity.currentUserID + MainActivity.currentInstance, true); + boolean compactButtons = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_COMPACT_ACTION_BUTTON), false); + + if (compactButtons) { + ConstraintSet set = new ConstraintSet(); + set.clone(holder.binding.actionButtons); + set.clear(R.id.status_emoji, ConstraintSet.END); + set.applyTo(holder.binding.actionButtons); + } if (removeLeftMargin) { LinearLayoutCompat.MarginLayoutParams p = (LinearLayoutCompat.MarginLayoutParams) holder.binding.spoiler.getLayoutParams(); @@ -1734,6 +1743,9 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> statusDraft.statusReplyList = new ArrayList<>(); statusToDeal.text = statusSource.text; statusToDeal.spoiler_text = statusSource.spoiler_text; + if (statusToDeal.spoiler_text != null && statusToDeal.spoiler_text.length() > 0) { + statusToDeal.spoilerChecked = true; + } statusDraft.statusDraftList.add(statusToDeal); intent.putExtra(Helper.ARG_STATUS_DRAFT, statusDraft); intent.putExtra(Helper.ARG_EDIT_STATUS_ID, statusToDeal.id); diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java index 560809216..b3e2e6b42 100644 --- a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java +++ b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java @@ -366,6 +366,11 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. if (acctArray.length > 1) { remoteInstance = acctArray[1]; } + if (remoteInstance != null && remoteInstance.equalsIgnoreCase(currentInstance)) { + checkRemotely = false; + } else if (remoteInstance == null) { + checkRemotely = false; + } } if (tagTimeline != null) { ident = "@T@" + tagTimeline.name; diff --git a/app/src/main/res/values-w1240dp/dimens.xml b/app/src/main/res/values-w1240dp/dimens.xml index d73f4a359..22d7f0043 100644 --- a/app/src/main/res/values-w1240dp/dimens.xml +++ b/app/src/main/res/values-w1240dp/dimens.xml @@ -1,3 +1,3 @@ <resources> - <dimen name="fab_margin">200dp</dimen> + <dimen name="fab_margin">48dp</dimen> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-w600dp/dimens.xml b/app/src/main/res/values-w600dp/dimens.xml index 22d7f0043..2a235a023 100644 --- a/app/src/main/res/values-w600dp/dimens.xml +++ b/app/src/main/res/values-w600dp/dimens.xml @@ -1,3 +1,3 @@ <resources> - <dimen name="fab_margin">48dp</dimen> + <dimen name="fab_margin">32dp</dimen> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9068bf22c..e83cc5cc7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1371,6 +1371,8 @@ <string name="SET_UNFOLLOW_VALIDATION" translatable="false">SET_UNFOLLOW_VALIDATION</string> <string name="SET_USE_SINGLE_TOPBAR" translatable="false">SET_USE_SINGLE_TOPBAR</string> <string name="SET_DISPLAY_COUNTERS" translatable="false">SET_DISPLAY_COUNTERS</string> + <string name="SET_DISPLAY_COMPACT_ACTION_BUTTON" translatable="false">SET_DISPLAY_COMPACT_ACTION_BUTTON</string> + <string name="SET_TIMELINES_IN_A_LIST" translatable="false">SET_TIMELINES_IN_A_LIST</string> <string name="SET_LED_COLOUR_VAL_N" translatable="false">SET_LED_COLOUR_VAL_N</string> <string name="SET_SHOW_BOOSTS" translatable="false">SET_SHOW_BOOSTS</string> @@ -2201,4 +2203,6 @@ <string name="local_only">Local only</string> <string name="set_display_local_only">Display \"Local only\" button</string> <string name="set_pixelfed_presentation">Pixelfed presentation for media</string> + <string name="set_display_compact_buttons">Compact action buttons</string> + <string name="set_display_compact_buttons_description">Buttons at the bottom of messages will not take the whole width</string> </resources>
\ No newline at end of file diff --git a/app/src/main/res/xml/pref_interface.xml b/app/src/main/res/xml/pref_interface.xml index ef3387c38..da7f64c32 100644 --- a/app/src/main/res/xml/pref_interface.xml +++ b/app/src/main/res/xml/pref_interface.xml @@ -54,6 +54,14 @@ app:title="@string/set_display_counters" /> <SwitchPreferenceCompat + app:defaultValue="false" + app:iconSpaceReserved="false" + app:key="@string/SET_DISPLAY_COMPACT_ACTION_BUTTON" + app:singleLineTitle="false" + app:summary="@string/set_display_compact_buttons_description" + app:title="@string/set_display_compact_buttons" /> + + <SwitchPreferenceCompat app:defaultValue="true" app:iconSpaceReserved="false" app:key="@string/SET_USE_CACHE" diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/462.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/462.txt new file mode 100644 index 000000000..ed7710059 --- /dev/null +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/462.txt @@ -0,0 +1,20 @@ +Added: + +- Add Bubble timeline support in extra-features with filters +- Allow to display public profiles by default to get all messages (Settings > Interface) +- Glitch: Allow to post messages locally (Can be turned off in Settings) +- Pixelfed: Custom layout to display Media fully (Also works for other software when there are media) +- Allow to align left action buttons in messages + +Changed: +- Full rework on links in messages (also mentions and tags) +- Add pinned tag in "any" to avoid to lose it when renaming timeline + +Fixed: +- Links to messages not handled by the app +- CW when editing a message +- Fix push notifications with several accounts +- Fix quotes with tags/mentions +- Fix notifications +- Fix sending multiple media +- Fix crashes
\ No newline at end of file |