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 98605888c..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;