use libphonenumber for Linkify.PHONE_NUMBER
This commit replaces a regex pattern match for Linkify.PHONE_NUMBER
with a call to libphonenumber's PhoneNumberUtil.findNumbers().
Bug: 5533245
Change-Id: I0e0563b241fb62e77d7f49e4a8484c6b0685dd8f
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index 9860588..2bc1c6a 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -16,6 +16,7 @@
package android.text.util;
+import android.telephony.PhoneNumberUtils;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.text.style.URLSpan;
@@ -32,9 +33,14 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
+import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import com.android.i18n.phonenumbers.PhoneNumberMatch;
+import com.android.i18n.phonenumbers.PhoneNumberUtil;
+import com.android.i18n.phonenumbers.PhoneNumberUtil.Leniency;
+
/**
* Linkify take a piece of text and a regular expression and turns all of the
* regex matches in the text into clickable links. This is particularly
@@ -221,9 +227,7 @@
}
if ((mask & PHONE_NUMBERS) != 0) {
- gatherLinks(links, text, Patterns.PHONE,
- new String[] { "tel:" },
- sPhoneNumberMatchFilter, sPhoneNumberTransformFilter);
+ gatherTelLinks(links, text);
}
if ((mask & MAP_ADDRESSES) != 0) {
@@ -443,6 +447,19 @@
}
}
+ private static final void gatherTelLinks(ArrayList<LinkSpec> links, Spannable s) {
+ PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+ Iterable<PhoneNumberMatch> matches = phoneUtil.findNumbers(s.toString(),
+ Locale.getDefault().getCountry(), Leniency.POSSIBLE, Long.MAX_VALUE);
+ for (PhoneNumberMatch match : matches) {
+ LinkSpec spec = new LinkSpec();
+ spec.url = "tel:" + PhoneNumberUtils.normalizeNumber(match.rawString());
+ spec.start = match.start();
+ spec.end = match.end();
+ links.add(spec);
+ }
+ }
+
private static final void gatherMapLinks(ArrayList<LinkSpec> links, Spannable s) {
String string = s.toString();
String address;