317 lines
13 KiB
Java
317 lines
13 KiB
Java
package androidx.core.text.util;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.os.Build;
|
|
import android.text.Spannable;
|
|
import android.text.SpannableString;
|
|
import android.text.method.LinkMovementMethod;
|
|
import android.text.style.URLSpan;
|
|
import android.text.util.Linkify;
|
|
import android.webkit.WebView;
|
|
import android.widget.TextView;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.core.util.PatternsCompat;
|
|
import c.d.b.a.a;
|
|
import com.adjust.sdk.Constants;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.lang.annotation.Retention;
|
|
import java.lang.annotation.RetentionPolicy;
|
|
import java.net.URLEncoder;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.Comparator;
|
|
import java.util.Iterator;
|
|
import java.util.Locale;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
public final class LinkifyCompat {
|
|
private static final Comparator<LinkSpec> COMPARATOR = new AnonymousClass1();
|
|
private static final String[] EMPTY_STRING = new String[0];
|
|
|
|
/* renamed from: androidx.core.text.util.LinkifyCompat$1 reason: invalid class name */
|
|
public class AnonymousClass1 implements Comparator<LinkSpec> {
|
|
public int compare(LinkSpec linkSpec, LinkSpec linkSpec2) {
|
|
int i;
|
|
int i2;
|
|
int i3 = linkSpec.start;
|
|
int i4 = linkSpec2.start;
|
|
if (i3 < i4) {
|
|
return -1;
|
|
}
|
|
if (i3 <= i4 && (i = linkSpec.end) >= (i2 = linkSpec2.end)) {
|
|
return i > i2 ? -1 : 0;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
public static class LinkSpec {
|
|
public int end;
|
|
public URLSpan frameworkAddedSpan;
|
|
public int start;
|
|
public String url;
|
|
}
|
|
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX})
|
|
public @interface LinkifyMask {
|
|
}
|
|
|
|
private LinkifyCompat() {
|
|
}
|
|
|
|
private static void addLinkMovementMethod(@NonNull TextView textView) {
|
|
if (!(textView.getMovementMethod() instanceof LinkMovementMethod) && textView.getLinksClickable()) {
|
|
textView.setMovementMethod(LinkMovementMethod.getInstance());
|
|
}
|
|
}
|
|
|
|
public static void addLinks(@NonNull TextView textView, @NonNull Pattern pattern, @Nullable String str) {
|
|
if (shouldAddLinksFallbackToFramework()) {
|
|
Linkify.addLinks(textView, pattern, str);
|
|
} else {
|
|
addLinks(textView, pattern, str, (String[]) null, (Linkify.MatchFilter) null, (Linkify.TransformFilter) null);
|
|
}
|
|
}
|
|
|
|
public static void addLinks(@NonNull TextView textView, @NonNull Pattern pattern, @Nullable String str, @Nullable Linkify.MatchFilter matchFilter, @Nullable Linkify.TransformFilter transformFilter) {
|
|
if (shouldAddLinksFallbackToFramework()) {
|
|
Linkify.addLinks(textView, pattern, str, matchFilter, transformFilter);
|
|
} else {
|
|
addLinks(textView, pattern, str, (String[]) null, matchFilter, transformFilter);
|
|
}
|
|
}
|
|
|
|
@SuppressLint({"NewApi"})
|
|
public static void addLinks(@NonNull TextView textView, @NonNull Pattern pattern, @Nullable String str, @Nullable String[] strArr, @Nullable Linkify.MatchFilter matchFilter, @Nullable Linkify.TransformFilter transformFilter) {
|
|
if (shouldAddLinksFallbackToFramework()) {
|
|
Linkify.addLinks(textView, pattern, str, strArr, matchFilter, transformFilter);
|
|
return;
|
|
}
|
|
SpannableString valueOf = SpannableString.valueOf(textView.getText());
|
|
if (addLinks(valueOf, pattern, str, strArr, matchFilter, transformFilter)) {
|
|
textView.setText(valueOf);
|
|
addLinkMovementMethod(textView);
|
|
}
|
|
}
|
|
|
|
public static boolean addLinks(@NonNull Spannable spannable, int i) {
|
|
if (shouldAddLinksFallbackToFramework()) {
|
|
return Linkify.addLinks(spannable, i);
|
|
}
|
|
if (i == 0) {
|
|
return false;
|
|
}
|
|
URLSpan[] uRLSpanArr = (URLSpan[]) spannable.getSpans(0, spannable.length(), URLSpan.class);
|
|
for (int length = uRLSpanArr.length - 1; length >= 0; length--) {
|
|
spannable.removeSpan(uRLSpanArr[length]);
|
|
}
|
|
if ((i & 4) != 0) {
|
|
Linkify.addLinks(spannable, 4);
|
|
}
|
|
ArrayList arrayList = new ArrayList();
|
|
if ((i & 1) != 0) {
|
|
gatherLinks(arrayList, spannable, PatternsCompat.AUTOLINK_WEB_URL, new String[]{"http://", "https://", "rtsp://"}, Linkify.sUrlMatchFilter, null);
|
|
}
|
|
if ((i & 2) != 0) {
|
|
gatherLinks(arrayList, spannable, PatternsCompat.AUTOLINK_EMAIL_ADDRESS, new String[]{"mailto:"}, null, null);
|
|
}
|
|
if ((i & 8) != 0) {
|
|
gatherMapLinks(arrayList, spannable);
|
|
}
|
|
pruneOverlaps(arrayList, spannable);
|
|
if (arrayList.size() == 0) {
|
|
return false;
|
|
}
|
|
Iterator it = arrayList.iterator();
|
|
while (it.hasNext()) {
|
|
LinkSpec linkSpec = (LinkSpec) it.next();
|
|
if (linkSpec.frameworkAddedSpan == null) {
|
|
applyLink(linkSpec.url, linkSpec.start, linkSpec.end, spannable);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern, @Nullable String str) {
|
|
return shouldAddLinksFallbackToFramework() ? Linkify.addLinks(spannable, pattern, str) : addLinks(spannable, pattern, str, (String[]) null, (Linkify.MatchFilter) null, (Linkify.TransformFilter) null);
|
|
}
|
|
|
|
public static boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern, @Nullable String str, @Nullable Linkify.MatchFilter matchFilter, @Nullable Linkify.TransformFilter transformFilter) {
|
|
return shouldAddLinksFallbackToFramework() ? Linkify.addLinks(spannable, pattern, str, matchFilter, transformFilter) : addLinks(spannable, pattern, str, (String[]) null, matchFilter, transformFilter);
|
|
}
|
|
|
|
@SuppressLint({"NewApi"})
|
|
public static boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern, @Nullable String str, @Nullable String[] strArr, @Nullable Linkify.MatchFilter matchFilter, @Nullable Linkify.TransformFilter transformFilter) {
|
|
if (shouldAddLinksFallbackToFramework()) {
|
|
return Linkify.addLinks(spannable, pattern, str, strArr, matchFilter, transformFilter);
|
|
}
|
|
if (str == null) {
|
|
str = "";
|
|
}
|
|
if (strArr == null || strArr.length < 1) {
|
|
strArr = EMPTY_STRING;
|
|
}
|
|
String[] strArr2 = new String[(strArr.length + 1)];
|
|
strArr2[0] = str.toLowerCase(Locale.ROOT);
|
|
int i = 0;
|
|
while (i < strArr.length) {
|
|
String str2 = strArr[i];
|
|
i++;
|
|
strArr2[i] = str2 == null ? "" : str2.toLowerCase(Locale.ROOT);
|
|
}
|
|
Matcher matcher = pattern.matcher(spannable);
|
|
boolean z2 = false;
|
|
while (matcher.find()) {
|
|
int start = matcher.start();
|
|
int end = matcher.end();
|
|
if (matchFilter != null ? matchFilter.acceptMatch(spannable, start, end) : true) {
|
|
applyLink(makeUrl(matcher.group(0), strArr2, matcher, transformFilter), start, end, spannable);
|
|
z2 = true;
|
|
}
|
|
}
|
|
return z2;
|
|
}
|
|
|
|
public static boolean addLinks(@NonNull TextView textView, int i) {
|
|
if (shouldAddLinksFallbackToFramework()) {
|
|
return Linkify.addLinks(textView, i);
|
|
}
|
|
if (i == 0) {
|
|
return false;
|
|
}
|
|
CharSequence text = textView.getText();
|
|
if (!(text instanceof Spannable)) {
|
|
SpannableString valueOf = SpannableString.valueOf(text);
|
|
if (!addLinks(valueOf, i)) {
|
|
return false;
|
|
}
|
|
addLinkMovementMethod(textView);
|
|
textView.setText(valueOf);
|
|
return true;
|
|
} else if (!addLinks((Spannable) text, i)) {
|
|
return false;
|
|
} else {
|
|
addLinkMovementMethod(textView);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
private static void applyLink(String str, int i, int i2, Spannable spannable) {
|
|
spannable.setSpan(new URLSpan(str), i, i2, 33);
|
|
}
|
|
|
|
private static String findAddress(String str) {
|
|
return Build.VERSION.SDK_INT >= 28 ? WebView.findAddress(str) : FindAddress.findAddress(str);
|
|
}
|
|
|
|
private static void gatherLinks(ArrayList<LinkSpec> arrayList, Spannable spannable, Pattern pattern, String[] strArr, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter) {
|
|
Matcher matcher = pattern.matcher(spannable);
|
|
while (matcher.find()) {
|
|
int start = matcher.start();
|
|
int end = matcher.end();
|
|
if (matchFilter == null || matchFilter.acceptMatch(spannable, start, end)) {
|
|
LinkSpec linkSpec = new LinkSpec();
|
|
linkSpec.url = makeUrl(matcher.group(0), strArr, matcher, transformFilter);
|
|
linkSpec.start = start;
|
|
linkSpec.end = end;
|
|
arrayList.add(linkSpec);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void gatherMapLinks(ArrayList<LinkSpec> arrayList, Spannable spannable) {
|
|
String obj = spannable.toString();
|
|
int i = 0;
|
|
while (true) {
|
|
try {
|
|
String findAddress = findAddress(obj);
|
|
if (findAddress != null) {
|
|
int indexOf = obj.indexOf(findAddress);
|
|
if (indexOf >= 0) {
|
|
LinkSpec linkSpec = new LinkSpec();
|
|
int length = findAddress.length() + indexOf;
|
|
linkSpec.start = indexOf + i;
|
|
i += length;
|
|
linkSpec.end = i;
|
|
obj = obj.substring(length);
|
|
try {
|
|
String encode = URLEncoder.encode(findAddress, Constants.ENCODING);
|
|
linkSpec.url = "geo:0,0?q=" + encode;
|
|
arrayList.add(linkSpec);
|
|
} catch (UnsupportedEncodingException unused) {
|
|
}
|
|
} else {
|
|
return;
|
|
}
|
|
} else {
|
|
return;
|
|
}
|
|
} catch (UnsupportedOperationException unused2) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static String makeUrl(@NonNull String str, @NonNull String[] strArr, Matcher matcher, @Nullable Linkify.TransformFilter transformFilter) {
|
|
boolean z2;
|
|
if (transformFilter != null) {
|
|
str = transformFilter.transformUrl(matcher, str);
|
|
}
|
|
int i = 0;
|
|
while (true) {
|
|
z2 = true;
|
|
if (i >= strArr.length) {
|
|
z2 = false;
|
|
break;
|
|
} else if (!str.regionMatches(true, 0, strArr[i], 0, strArr[i].length())) {
|
|
i++;
|
|
} else if (!str.regionMatches(false, 0, strArr[i], 0, strArr[i].length())) {
|
|
str = strArr[i] + str.substring(strArr[i].length());
|
|
}
|
|
}
|
|
return (z2 || strArr.length <= 0) ? str : a.D(new StringBuilder(), strArr[0], str);
|
|
}
|
|
|
|
private static void pruneOverlaps(ArrayList<LinkSpec> arrayList, Spannable spannable) {
|
|
int i;
|
|
int i2 = 0;
|
|
Object[] objArr = (URLSpan[]) spannable.getSpans(0, spannable.length(), URLSpan.class);
|
|
for (int i3 = 0; i3 < objArr.length; i3++) {
|
|
LinkSpec linkSpec = new LinkSpec();
|
|
linkSpec.frameworkAddedSpan = objArr[i3];
|
|
linkSpec.start = spannable.getSpanStart(objArr[i3]);
|
|
linkSpec.end = spannable.getSpanEnd(objArr[i3]);
|
|
arrayList.add(linkSpec);
|
|
}
|
|
Collections.sort(arrayList, COMPARATOR);
|
|
int size = arrayList.size();
|
|
while (i2 < size - 1) {
|
|
LinkSpec linkSpec2 = arrayList.get(i2);
|
|
int i4 = i2 + 1;
|
|
LinkSpec linkSpec3 = arrayList.get(i4);
|
|
int i5 = linkSpec2.start;
|
|
int i6 = linkSpec3.start;
|
|
if (i5 <= i6 && (i = linkSpec2.end) > i6) {
|
|
int i7 = linkSpec3.end;
|
|
int i8 = (i7 > i && i - i5 <= i7 - i6) ? i - i5 < i7 - i6 ? i2 : -1 : i4;
|
|
if (i8 != -1) {
|
|
Object obj = arrayList.get(i8).frameworkAddedSpan;
|
|
if (obj != null) {
|
|
spannable.removeSpan(obj);
|
|
}
|
|
arrayList.remove(i8);
|
|
size--;
|
|
}
|
|
}
|
|
i2 = i4;
|
|
}
|
|
}
|
|
|
|
private static boolean shouldAddLinksFallbackToFramework() {
|
|
return Build.VERSION.SDK_INT >= 28;
|
|
}
|
|
}
|