move common code to de.gultsch.common

Daniel Gultsch created

(preperation for code share with Ltt.rs)

Change summary

src/main/java/de/gultsch/common/CombiningTrustManager.java                | 12 
src/main/java/de/gultsch/common/Linkify.java                              | 13 
src/main/java/de/gultsch/common/TrustManagers.java                        | 14 
src/main/java/eu/siacs/conversations/http/HttpConnectionManager.java      |  9 
src/main/java/eu/siacs/conversations/services/MemorizingTrustManager.java | 10 
src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java    |  6 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java         |  4 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java       |  6 
src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java               |  3 
9 files changed, 36 insertions(+), 41 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/CombiningTrustManager.java → 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<X509TrustManager> 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<X509TrustManager> builder = ImmutableList.builder();
         builder.addAll(Arrays.asList(trustManagers));

src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java → 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<MiniUri> getLinks(final String body) {

src/main/java/eu/siacs/conversations/crypto/TrustManagers.java → 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));

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);

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

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)

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 =

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<Message> {
         }
 
         StylingHelper.format(body, viewHolder.messageBody().getCurrentTextColor());
-        MyLinkify.addLinks(body);
+        Linkify.addLinks(body);
+        FixedURLSpan.fix(body);
         if (highlightedTerm != null) {
             StylingHelper.highlight(viewHolder.messageBody(), body, highlightedTerm);
         }

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;
         }