From 21432be9d36604f763173385fe4bdf107bcfe155 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 7 Apr 2025 16:27:21 +0200 Subject: [PATCH] move common code to de.gultsch.common (preperation for code share with Ltt.rs) --- .../gultsch/common}/CombiningTrustManager.java | 12 ++++-------- .../gultsch/common/Linkify.java} | 13 ++++--------- .../gultsch/common}/TrustManagers.java | 14 ++++++++++++-- .../conversations/http/HttpConnectionManager.java | 9 ++------- .../services/MemorizingTrustManager.java | 10 ++-------- .../ui/ConferenceDetailsActivity.java | 6 ++++-- .../conversations/ui/ConversationFragment.java | 4 ++-- .../conversations/ui/adapter/MessageAdapter.java | 6 ++++-- .../eu/siacs/conversations/ui/util/ShareUtil.java | 3 ++- 9 files changed, 36 insertions(+), 41 deletions(-) rename src/main/java/{eu/siacs/conversations/crypto => de/gultsch/common}/CombiningTrustManager.java (88%) rename src/main/java/{eu/siacs/conversations/ui/util/MyLinkify.java => de/gultsch/common/Linkify.java} (89%) rename src/main/java/{eu/siacs/conversations/crypto => de/gultsch/common}/TrustManagers.java (79%) diff --git a/src/main/java/eu/siacs/conversations/crypto/CombiningTrustManager.java b/src/main/java/de/gultsch/common/CombiningTrustManager.java similarity index 88% rename from src/main/java/eu/siacs/conversations/crypto/CombiningTrustManager.java rename to src/main/java/de/gultsch/common/CombiningTrustManager.java index 7126004877cf49388dcf003c29cc29eea7f8b0ed..41535886f78bafc990b56416d6df488320863aca 100644 --- a/src/main/java/eu/siacs/conversations/crypto/CombiningTrustManager.java +++ b/src/main/java/de/gultsch/common/CombiningTrustManager.java @@ -1,9 +1,8 @@ -package eu.siacs.conversations.crypto; +package de.gultsch.common; import android.annotation.SuppressLint; import android.util.Log; import com.google.common.collect.ImmutableList; -import eu.siacs.conversations.Config; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; @@ -45,11 +44,8 @@ public final class CombiningTrustManager implements X509TrustManager { public void checkServerTrusted(final X509Certificate[] chain, final String authType) throws CertificateException { Log.d( - Config.LOGTAG, - CombiningTrustManager.class.getSimpleName() - + " is configured with " - + this.trustManagers.size() - + " TrustManagers"); + CombiningTrustManager.class.getSimpleName(), + "configured with " + this.trustManagers.size() + " TrustManagers"); for (final Iterator iterator = this.trustManagers.iterator(); iterator.hasNext(); ) { final X509TrustManager trustManager = iterator.next(); @@ -77,7 +73,7 @@ public final class CombiningTrustManager implements X509TrustManager { return certificates.build().toArray(new X509Certificate[0]); } - public static X509TrustManager combineWithDefault(final X509TrustManager... trustManagers) + static X509TrustManager combineWithDefault(final X509TrustManager... trustManagers) throws NoSuchAlgorithmException, KeyStoreException { final ImmutableList.Builder builder = ImmutableList.builder(); builder.addAll(Arrays.asList(trustManagers)); diff --git a/src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java b/src/main/java/de/gultsch/common/Linkify.java similarity index 89% rename from src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java rename to src/main/java/de/gultsch/common/Linkify.java index 393e2081455eb342b6890cb143f1eb2354045f54..12ad2c67b3ec36964b6455b7a704a75d46646a95 100644 --- a/src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java +++ b/src/main/java/de/gultsch/common/Linkify.java @@ -27,24 +27,20 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package eu.siacs.conversations.ui.util; +package de.gultsch.common; import android.net.Uri; import android.text.Editable; -import android.text.util.Linkify; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; -import de.gultsch.common.MiniUri; -import de.gultsch.common.Patterns; -import eu.siacs.conversations.ui.text.FixedURLSpan; import eu.siacs.conversations.utils.XmppUri; import java.util.List; import java.util.Objects; -public class MyLinkify { +public class Linkify { - private static final Linkify.MatchFilter MATCH_FILTER = + private static final android.text.util.Linkify.MatchFilter MATCH_FILTER = (s, start, end) -> isPassAdditionalValidation(s.subSequence(start, end).toString()); private static boolean isPassAdditionalValidation(final String match) { @@ -71,8 +67,7 @@ public class MyLinkify { } public static void addLinks(final Editable body) { - Linkify.addLinks(body, Patterns.URI_GENERIC, null, MATCH_FILTER, null); - FixedURLSpan.fix(body); + android.text.util.Linkify.addLinks(body, Patterns.URI_GENERIC, null, MATCH_FILTER, null); } public static List getLinks(final String body) { diff --git a/src/main/java/eu/siacs/conversations/crypto/TrustManagers.java b/src/main/java/de/gultsch/common/TrustManagers.java similarity index 79% rename from src/main/java/eu/siacs/conversations/crypto/TrustManagers.java rename to src/main/java/de/gultsch/common/TrustManagers.java index f70545fc950065c81a068d210b76e4a8eb5048fb..fe5398faf3ae0be008c735f47889d25c87052f5e 100644 --- a/src/main/java/eu/siacs/conversations/crypto/TrustManagers.java +++ b/src/main/java/de/gultsch/common/TrustManagers.java @@ -1,6 +1,7 @@ -package eu.siacs.conversations.crypto; +package de.gultsch.common; import android.content.Context; +import android.os.Build; import androidx.annotation.Nullable; import com.google.common.collect.Iterables; import eu.siacs.conversations.R; @@ -33,12 +34,21 @@ public final class TrustManagers { X509TrustManager.class)); } + public static X509TrustManager createForAndroidVersion(final Context context) + throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) { + return TrustManagers.createDefaultWithBundledLetsEncrypt(context); + } else { + return TrustManagers.createDefaultTrustManager(); + } + } + public static X509TrustManager createDefaultTrustManager() throws NoSuchAlgorithmException, KeyStoreException { return createTrustManager(null); } - public static X509TrustManager createDefaultWithBundledLetsEncrypt(final Context context) + private static X509TrustManager createDefaultWithBundledLetsEncrypt(final Context context) throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException { final var bundleTrustManager = createWithKeyStore(context.getResources().openRawResource(R.raw.letsencrypt)); diff --git a/src/main/java/eu/siacs/conversations/http/HttpConnectionManager.java b/src/main/java/eu/siacs/conversations/http/HttpConnectionManager.java index 3bc65eb8bf1b31f0c912d37e5d39de1854e33486..b1138ba1a1323787cf91ff6d92d48bdf2a0923b0 100644 --- a/src/main/java/eu/siacs/conversations/http/HttpConnectionManager.java +++ b/src/main/java/eu/siacs/conversations/http/HttpConnectionManager.java @@ -5,9 +5,9 @@ import static eu.siacs.conversations.utils.Random.SECURE_RANDOM; import android.content.Context; import android.os.Build; import android.util.Log; +import de.gultsch.common.TrustManagers; import eu.siacs.conversations.BuildConfig; import eu.siacs.conversations.Config; -import eu.siacs.conversations.crypto.TrustManagers; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.services.AbstractConnectionManager; @@ -191,12 +191,7 @@ public class HttpConnectionManager extends AbstractConnectionManager { public static OkHttpClient okHttpClient(final Context context) { final OkHttpClient.Builder builder = HttpConnectionManager.OK_HTTP_CLIENT.newBuilder(); try { - final X509TrustManager trustManager; - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) { - trustManager = TrustManagers.createDefaultWithBundledLetsEncrypt(context); - } else { - trustManager = TrustManagers.createDefaultTrustManager(); - } + final X509TrustManager trustManager = TrustManagers.createForAndroidVersion(context); final SSLSocketFactory socketFactory = new TLSSocketFactory(new X509TrustManager[] {trustManager}, SECURE_RANDOM); builder.sslSocketFactory(socketFactory, trustManager); diff --git a/src/main/java/eu/siacs/conversations/services/MemorizingTrustManager.java b/src/main/java/eu/siacs/conversations/services/MemorizingTrustManager.java index 0d036ca9badb596da8cb7eaa9e3c4537c89ab6af..de519747dabe2ee2321c969e5c92b2e405fd874b 100644 --- a/src/main/java/eu/siacs/conversations/services/MemorizingTrustManager.java +++ b/src/main/java/eu/siacs/conversations/services/MemorizingTrustManager.java @@ -33,7 +33,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; -import android.os.Build; import android.os.Handler; import android.preference.PreferenceManager; import android.util.Base64; @@ -45,9 +44,9 @@ import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.io.ByteStreams; import com.google.common.io.CharStreams; +import de.gultsch.common.TrustManagers; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; -import eu.siacs.conversations.crypto.TrustManagers; import eu.siacs.conversations.crypto.XmppDomainVerifier; import eu.siacs.conversations.entities.MTMDecision; import eu.siacs.conversations.http.HttpConnectionManager; @@ -168,12 +167,7 @@ public class MemorizingTrustManager { init(context); this.appTrustManager = getTrustManager(appKeyStore); try { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) { - this.defaultTrustManager = - TrustManagers.createDefaultWithBundledLetsEncrypt(context); - } else { - this.defaultTrustManager = TrustManagers.createDefaultTrustManager(); - } + this.defaultTrustManager = TrustManagers.createForAndroidVersion(context); } catch (final NoSuchAlgorithmException | KeyStoreException | CertificateException diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index 4d6268c7070cdf5981a084f3c6122a17eae9ce09..baa0914eca9d9cc026d574a1877aafa20155a93b 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -22,6 +22,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.databinding.DataBindingUtil; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import de.gultsch.common.Linkify; import eu.siacs.conversations.R; import eu.siacs.conversations.databinding.ActivityMucDetailsBinding; import eu.siacs.conversations.entities.Conversation; @@ -34,13 +35,13 @@ import eu.siacs.conversations.services.XmppConnectionService.OnMucRosterUpdate; import eu.siacs.conversations.ui.adapter.MediaAdapter; import eu.siacs.conversations.ui.adapter.UserPreviewAdapter; import eu.siacs.conversations.ui.interfaces.OnMediaLoaded; +import eu.siacs.conversations.ui.text.FixedURLSpan; import eu.siacs.conversations.ui.util.Attachment; import eu.siacs.conversations.ui.util.AvatarWorkerTask; import eu.siacs.conversations.ui.util.GridManager; import eu.siacs.conversations.ui.util.MenuDoubleTabUtil; import eu.siacs.conversations.ui.util.MucConfiguration; import eu.siacs.conversations.ui.util.MucDetailsContextMenuHelper; -import eu.siacs.conversations.ui.util.MyLinkify; import eu.siacs.conversations.ui.util.SoftKeyboardUtils; import eu.siacs.conversations.utils.AccountUtils; import eu.siacs.conversations.utils.Compatibility; @@ -558,7 +559,8 @@ public class ConferenceDetailsActivity extends XmppActivity if (printableValue(subject)) { SpannableStringBuilder spannable = new SpannableStringBuilder(subject); StylingHelper.format(spannable, this.binding.mucSubject.getCurrentTextColor()); - MyLinkify.addLinks(spannable); + Linkify.addLinks(spannable); + FixedURLSpan.fix(spannable); this.binding.mucSubject.setText(spannable); this.binding.mucSubject.setTextAppearance( subject.length() > (hasTitle ? 128 : 196) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 85c96e0aad375a3ae2f8f135425f24dfb879f052..d58c7a0fc524730e2297edd7865e431a099f4f5f 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -65,6 +65,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import de.gultsch.common.Linkify; import de.gultsch.common.Patterns; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; @@ -100,7 +101,6 @@ import eu.siacs.conversations.ui.util.EditMessageActionModeCallback; import eu.siacs.conversations.ui.util.ListViewUtils; import eu.siacs.conversations.ui.util.MenuDoubleTabUtil; import eu.siacs.conversations.ui.util.MucDetailsContextMenuHelper; -import eu.siacs.conversations.ui.util.MyLinkify; import eu.siacs.conversations.ui.util.PendingItem; import eu.siacs.conversations.ui.util.PresenceSelector; import eu.siacs.conversations.ui.util.ScrollState; @@ -1348,7 +1348,7 @@ public class ConversationFragment extends XmppFragment && t == null) { copyMessage.setVisible(true); quoteMessage.setVisible(!showError && !MessageUtils.prepareQuote(m).isEmpty()); - final var firstUri = Iterables.getFirst(MyLinkify.getLinks(m.getBody()), null); + final var firstUri = Iterables.getFirst(Linkify.getLinks(m.getBody()), null); if (firstUri != null) { final var scheme = firstUri.getScheme(); final @StringRes int resForScheme = diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 00bf4b17ef5e6760ddd66a294c272a688fe1ea67..bf687333a5c5e8c91f8c776e4d5ab68c6bd30f92 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -43,6 +43,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Strings; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; +import de.gultsch.common.Linkify; import eu.siacs.conversations.AppSettings; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; @@ -70,10 +71,10 @@ import eu.siacs.conversations.ui.ConversationsActivity; import eu.siacs.conversations.ui.XmppActivity; import eu.siacs.conversations.ui.service.AudioPlayer; import eu.siacs.conversations.ui.text.DividerSpan; +import eu.siacs.conversations.ui.text.FixedURLSpan; import eu.siacs.conversations.ui.text.QuoteSpan; import eu.siacs.conversations.ui.util.Attachment; import eu.siacs.conversations.ui.util.AvatarWorkerTask; -import eu.siacs.conversations.ui.util.MyLinkify; import eu.siacs.conversations.ui.util.QuoteHelper; import eu.siacs.conversations.ui.util.ViewUtil; import eu.siacs.conversations.ui.widget.ClickableMovementMethod; @@ -576,7 +577,8 @@ public class MessageAdapter extends ArrayAdapter { } StylingHelper.format(body, viewHolder.messageBody().getCurrentTextColor()); - MyLinkify.addLinks(body); + Linkify.addLinks(body); + FixedURLSpan.fix(body); if (highlightedTerm != null) { StylingHelper.highlight(viewHolder.messageBody(), body, highlightedTerm); } diff --git a/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java b/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java index 0a4707074ac88e616489d6c97719a6ab4f099b54..cebd6524bf3423382bbf9082af27f668cc7c119f 100644 --- a/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java +++ b/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java @@ -35,6 +35,7 @@ import android.os.Build; import android.widget.Toast; import androidx.annotation.StringRes; import com.google.common.collect.Iterables; +import de.gultsch.common.Linkify; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.DownloadableFile; import eu.siacs.conversations.entities.Message; @@ -126,7 +127,7 @@ public class ShareUtil { } public static void copyLinkToClipboard(final XmppActivity activity, final Message message) { - final var firstUri = Iterables.getFirst(MyLinkify.getLinks(message.getBody()), null); + final var firstUri = Iterables.getFirst(Linkify.getLinks(message.getBody()), null); if (firstUri == null) { return; }