Detailed changes
@@ -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));
@@ -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) {
@@ -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));
@@ -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);
@@ -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
@@ -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)
@@ -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 =
@@ -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);
}
@@ -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;
}