summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/app/fedilab/android/helper/SpannableHelper.java55
-rw-r--r--app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java2
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java12
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java5
-rw-r--r--app/src/main/res/values-w1240dp/dimens.xml2
-rw-r--r--app/src/main/res/values-w600dp/dimens.xml2
-rw-r--r--app/src/main/res/values/strings.xml4
-rw-r--r--app/src/main/res/xml/pref_interface.xml8
-rw-r--r--src/fdroid/fastlane/metadata/android/en/changelogs/462.txt20
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