From 4f3e3c0295d7675a57fe03f301fefe1534de3360 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 16 Apr 2025 18:16:37 +0200 Subject: [PATCH] show links in SOS message --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/java/de/gultsch/common/Linkify.java | 4 +-- .../siacs/conversations/entities/Account.java | 4 ++- .../services/XmppConnectionService.java | 1 + .../siacs/conversations/ui/AboutActivity.java | 15 ++++++++--- .../ui/ConferenceDetailsActivity.java | 5 ++-- .../conversations/ui/EditAccountActivity.java | 13 ++++++++-- .../conversations/ui/text/FixedURLSpan.java | 14 +++++------ .../conversations/utils/StylingHelper.java | 8 +++--- src/main/res/layout/activity_about.xml | 7 +++--- src/main/res/layout/activity_edit_account.xml | 25 ++++++++++--------- src/main/res/layout/activity_muc_details.xml | 1 - src/main/res/layout/item_message_content.xml | 1 - 14 files changed, 60 insertions(+), 42 deletions(-) diff --git a/build.gradle b/build.gradle index f258c0dc956f8f4232e3a971f486075f9eb5d2c7..eedd3851471b3a27cda9d78c828abf23c4acf593 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.5.2' + classpath 'com.android.tools.build:gradle:8.9.1' classpath "com.diffplug.spotless:spotless-plugin-gradle:7.0.2" } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f05d39d81870f8355ca43324f027298..37f853b1c84d2e2dd1c88441fcc755d7f6643668 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/de/gultsch/common/Linkify.java b/src/main/java/de/gultsch/common/Linkify.java index 12ad2c67b3ec36964b6455b7a704a75d46646a95..655e8dddc3a88ae4a22148d3b75edc8518e84174 100644 --- a/src/main/java/de/gultsch/common/Linkify.java +++ b/src/main/java/de/gultsch/common/Linkify.java @@ -30,7 +30,7 @@ package de.gultsch.common; import android.net.Uri; -import android.text.Editable; +import android.text.Spannable; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; @@ -66,7 +66,7 @@ public class Linkify { }; } - public static void addLinks(final Editable body) { + public static void addLinks(final Spannable body) { android.text.util.Linkify.addLinks(body, Patterns.URI_GENERIC, null, MATCH_FILTER, null); } diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index 6673f7dced1706ca795e1d19f51d1f6bc724fb6d..66ec318071198811dfcd9387c1f2acd07700ffa0 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -796,7 +796,9 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable public boolean isServiceOutage() { final var sos = this.serviceOutageStatus; - if (sos != null && ServiceOutageStatus.isPossibleOutage(this.status)) { + if (sos != null + && isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY) + && ServiceOutageStatus.isPossibleOutage(this.status)) { return sos.isNow(); } return false; diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 849831940de0fa7cb906a6f72acf9d00cc7fdead..f6cf075273ea55e1365df5b12c2d88a4f90631ab 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1160,6 +1160,7 @@ public class XmppConnectionService extends Service { public void onSuccess(final ServiceOutageStatus sos) { Log.d(Config.LOGTAG, "fetched " + sos); account.setServiceOutageStatus(sos); + updateAccountUi(); } @Override diff --git a/src/main/java/eu/siacs/conversations/ui/AboutActivity.java b/src/main/java/eu/siacs/conversations/ui/AboutActivity.java index bcbfdef00a9207107c29b6ebac2a53711d64ab09..58c597b244ac07a527e29a030273e5ff42bf2dfc 100644 --- a/src/main/java/eu/siacs/conversations/ui/AboutActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/AboutActivity.java @@ -3,20 +3,27 @@ package eu.siacs.conversations.ui; import static eu.siacs.conversations.ui.XmppActivity.configureActionBar; import android.os.Bundle; - +import android.text.SpannableString; +import android.text.method.LinkMovementMethod; import androidx.databinding.DataBindingUtil; - +import de.gultsch.common.Linkify; import eu.siacs.conversations.R; import eu.siacs.conversations.databinding.ActivityAboutBinding; +import eu.siacs.conversations.ui.text.FixedURLSpan; public class AboutActivity extends ActionBarActivity { - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final ActivityAboutBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_about); + final ActivityAboutBinding binding = + DataBindingUtil.setContentView(this, R.layout.activity_about); + final var text = new SpannableString(getString(R.string.pref_about_message)); + Linkify.addLinks(text); + FixedURLSpan.fix(text); + binding.about.setText(text); + binding.about.setMovementMethod(LinkMovementMethod.getInstance()); Activities.setStatusAndNavigationBarColors(this, binding.getRoot()); setSupportActionBar(binding.toolbar); diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index baa0914eca9d9cc026d574a1877aafa20155a93b..fe2da072e2acc8aff33559e7414ddccb3c8d45c5 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -10,7 +10,7 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.text.Editable; -import android.text.SpannableStringBuilder; +import android.text.SpannableString; import android.text.TextWatcher; import android.text.method.LinkMovementMethod; import android.view.Menu; @@ -557,7 +557,7 @@ public class ConferenceDetailsActivity extends XmppActivity this.binding.mucTitle.setVisibility(View.GONE); } if (printableValue(subject)) { - SpannableStringBuilder spannable = new SpannableStringBuilder(subject); + final var spannable = new SpannableString(subject); StylingHelper.format(spannable, this.binding.mucSubject.getCurrentTextColor()); Linkify.addLinks(spannable); FixedURLSpan.fix(spannable); @@ -568,7 +568,6 @@ public class ConferenceDetailsActivity extends XmppActivity .TextAppearance_Material3_BodyMedium : com.google.android.material.R.style .TextAppearance_Material3_BodyLarge); - this.binding.mucSubject.setAutoLinkMask(0); this.binding.mucSubject.setVisibility(View.VISIBLE); this.binding.mucSubject.setMovementMethod(LinkMovementMethod.getInstance()); } else { diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java index 2cb112170ca6e65f9f49d29deb6beb4625709fef..c5603e42c85578ff16324f25e3980a337e5f66d6 100644 --- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java @@ -16,9 +16,11 @@ import android.provider.Settings; import android.security.KeyChain; import android.security.KeyChainAliasCallback; import android.text.Editable; +import android.text.SpannableString; import android.text.TextUtils; import android.text.TextWatcher; import android.text.format.DateUtils; +import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -40,6 +42,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.textfield.TextInputLayout; import com.google.common.base.CharMatcher; import com.google.common.base.Strings; +import de.gultsch.common.Linkify; import eu.siacs.conversations.AppSettings; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; @@ -58,6 +61,7 @@ import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate; import eu.siacs.conversations.services.XmppConnectionService.OnCaptchaRequested; import eu.siacs.conversations.ui.adapter.KnownHostsAdapter; import eu.siacs.conversations.ui.adapter.PresenceTemplateAdapter; +import eu.siacs.conversations.ui.text.FixedURLSpan; import eu.siacs.conversations.ui.util.AvatarWorkerTask; import eu.siacs.conversations.ui.util.MenuDoubleTabUtil; import eu.siacs.conversations.ui.util.PendingItem; @@ -1442,8 +1446,12 @@ public class EditAccountActivity extends OmemoActivity if (Strings.isNullOrEmpty(sosMessage)) { this.binding.sosMessage.setVisibility(View.GONE); } else { - this.binding.sosMessage.setText(sosMessage); + final var sosMessageSpannable = new SpannableString(sosMessage); + Linkify.addLinks(sosMessageSpannable); + FixedURLSpan.fix(sosMessageSpannable); + this.binding.sosMessage.setText(sosMessageSpannable); this.binding.sosMessage.setVisibility(View.VISIBLE); + this.binding.sosMessage.setMovementMethod(LinkMovementMethod.getInstance()); } final var expectedEnd = sos.getExpectedEnd(); if (expectedEnd <= 0) { @@ -1457,7 +1465,8 @@ public class EditAccountActivity extends OmemoActivity this, expectedEnd, DateUtils.FORMAT_SHOW_TIME - | DateUtils.FORMAT_ABBREV_ALL + | DateUtils.FORMAT_NUMERIC_DATE + | DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE))); } } else { diff --git a/src/main/java/eu/siacs/conversations/ui/text/FixedURLSpan.java b/src/main/java/eu/siacs/conversations/ui/text/FixedURLSpan.java index c76494736fccdfd8819b92acd4456d3bfca0dc1b..7e7cecd8e0124959b6d36c55bf3a8f03c79752b3 100644 --- a/src/main/java/eu/siacs/conversations/ui/text/FixedURLSpan.java +++ b/src/main/java/eu/siacs/conversations/ui/text/FixedURLSpan.java @@ -34,7 +34,7 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.text.Editable; +import android.text.Spannable; import android.text.Spanned; import android.text.style.URLSpan; import android.util.Log; @@ -56,12 +56,12 @@ public class FixedURLSpan extends URLSpan { super(url); } - public static void fix(final Editable editable) { - for (final URLSpan urlspan : editable.getSpans(0, editable.length() - 1, URLSpan.class)) { - final int start = editable.getSpanStart(urlspan); - final int end = editable.getSpanEnd(urlspan); - editable.removeSpan(urlspan); - editable.setSpan( + public static void fix(final Spannable spannable) { + for (final URLSpan urlspan : spannable.getSpans(0, spannable.length() - 1, URLSpan.class)) { + final int start = spannable.getSpanStart(urlspan); + final int end = spannable.getSpanEnd(urlspan); + spannable.removeSpan(urlspan); + spannable.setSpan( new FixedURLSpan(urlspan.getURL()), start, end, diff --git a/src/main/java/eu/siacs/conversations/utils/StylingHelper.java b/src/main/java/eu/siacs/conversations/utils/StylingHelper.java index 5e5bafd3e9d50ca7d4ea85a9045264aa523e117a..d2e561beca1c0585c2d7f509001424f414ca9d19 100644 --- a/src/main/java/eu/siacs/conversations/utils/StylingHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/StylingHelper.java @@ -70,7 +70,7 @@ public class StylingHelper { } public static void format( - final Editable editable, int start, int end, @ColorInt int textColor) { + final Spannable editable, int start, int end, @ColorInt int textColor) { for (ImStyleParser.Style style : ImStyleParser.parse(editable, start, end)) { final int keywordLength = style.getKeyword().length(); editable.setSpan( @@ -85,7 +85,7 @@ public class StylingHelper { } } - public static void format(final Editable editable, @ColorInt final int textColor) { + public static void format(final Spannable editable, @ColorInt final int textColor) { format(editable, 0, editable.length() - 1, textColor); } @@ -121,7 +121,7 @@ public class StylingHelper { } private static void highlight( - final TextView view, final Editable editable, final String needle) { + final TextView view, final Spannable editable, final String needle) { final int length = needle.length(); String string = editable.toString(); int start = indexOfIgnoreCase(string, needle, 0); @@ -197,7 +197,7 @@ public class StylingHelper { } private static void makeKeywordOpaque( - final Editable editable, int start, int end, @ColorInt int fallbackTextColor) { + final Spannable editable, int start, int end, @ColorInt int fallbackTextColor) { QuoteSpan[] quoteSpans = editable.getSpans(start, end, QuoteSpan.class); @ColorInt int textColor = quoteSpans.length > 0 ? quoteSpans[0].getColor() : fallbackTextColor; diff --git a/src/main/res/layout/activity_about.xml b/src/main/res/layout/activity_about.xml index 81960647fbfafc11f74fd58b2e74ab0bc1afc51d..823620ffdf419755fea1690664b9a9593d769813 100644 --- a/src/main/res/layout/activity_about.xml +++ b/src/main/res/layout/activity_about.xml @@ -1,4 +1,5 @@ - + diff --git a/src/main/res/layout/activity_edit_account.xml b/src/main/res/layout/activity_edit_account.xml index 57db26b861b3883d97286452b5cfc6612770683c..98df185f4f0dfda27ace0a8b67c61d0e2ba9f598 100644 --- a/src/main/res/layout/activity_edit_account.xml +++ b/src/main/res/layout/activity_edit_account.xml @@ -147,8 +147,8 @@ + app:cardBackgroundColor="?colorErrorContainer" + tools:visibility="visible"> + android:textAppearance="?textAppearanceTitleLarge" + android:textColor="?colorOnErrorContainer" /> + android:textAppearance="?textAppearanceBodyMedium" + android:textColor="?colorOnErrorContainer" + android:textColorLink="?colorOnErrorContainer" + tools:text="Our service is currently performing server updates" /> + android:layout_marginTop="16sp" + android:textAppearance="?textAppearanceBodyLarge" + android:textColor="?colorOnErrorContainer" + tools:text="@string/sos_scheduled_return" /> diff --git a/src/main/res/layout/activity_muc_details.xml b/src/main/res/layout/activity_muc_details.xml index b7f6151e50d5c8c94dfb3c44baa59126b959b414..0af16d1bd3bb61d522be191a62c8614efd37c709 100644 --- a/src/main/res/layout/activity_muc_details.xml +++ b/src/main/res/layout/activity_muc_details.xml @@ -86,7 +86,6 @@ android:id="@+id/muc_subject" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:autoLink="web" android:textAppearance="?textAppearanceTitleMedium" /> diff --git a/src/main/res/layout/item_message_content.xml b/src/main/res/layout/item_message_content.xml index 06ace848307827b5ed05bf6121a90e925147d313..8114da6c17f377628ba6750ae0ec7c7eff72f736 100644 --- a/src/main/res/layout/item_message_content.xml +++ b/src/main/res/layout/item_message_content.xml @@ -11,7 +11,6 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="10dp" android:layout_marginTop="4dp" - android:autoLink="web" android:longClickable="false" android:textAppearance="?textAppearanceBodyMedium" />