From 9b4c82a83cc3c1aafac2325d7a601ba3e090b90b Mon Sep 17 00:00:00 2001 From: Abodunrinwa Toki Date: Mon, 6 Feb 2017 20:29:36 +0000 Subject: [PATCH] TextClassifierImpl: Handle urls. This cl also updates label strings, renames an internal method, and fixes some bugs in TextClassifierImpl caught by tests. Test: See: I31ee94177e58c986e61e9b24c6c5816fa4b022e1 Bug: 34778263 Bug: 34922928 Change-Id: Ibf60d345d462dfc8a13dead6f01053f1ae50f35a --- api/current.txt | 1 + api/system-current.txt | 1 + api/test-current.txt | 1 + .../TextClassificationResult.java | 2 +- .../view/textclassifier/TextClassifier.java | 1 + .../textclassifier/TextClassifierImpl.java | 45 ++++++++++++------- core/java/android/widget/Editor.java | 2 +- core/res/res/values/strings.xml | 5 ++- core/res/res/values/symbols.xml | 1 + 9 files changed, 41 insertions(+), 18 deletions(-) diff --git a/api/current.txt b/api/current.txt index 1a56525ab1531..2e56c5dedcc40 100644 --- a/api/current.txt +++ b/api/current.txt @@ -47332,6 +47332,7 @@ package android.view.textclassifier { field public static final java.lang.String TYPE_EMAIL = "email"; field public static final java.lang.String TYPE_OTHER = "other"; field public static final java.lang.String TYPE_PHONE = "phone"; + field public static final java.lang.String TYPE_URL = "url"; } public static abstract class TextClassifier.EntityType implements java.lang.annotation.Annotation { diff --git a/api/system-current.txt b/api/system-current.txt index 06411d08dccd1..75f336307fe0b 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -50771,6 +50771,7 @@ package android.view.textclassifier { field public static final java.lang.String TYPE_EMAIL = "email"; field public static final java.lang.String TYPE_OTHER = "other"; field public static final java.lang.String TYPE_PHONE = "phone"; + field public static final java.lang.String TYPE_URL = "url"; } public static abstract class TextClassifier.EntityType implements java.lang.annotation.Annotation { diff --git a/api/test-current.txt b/api/test-current.txt index cde9bdc63faa2..43a64b9e008a7 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -47645,6 +47645,7 @@ package android.view.textclassifier { field public static final java.lang.String TYPE_EMAIL = "email"; field public static final java.lang.String TYPE_OTHER = "other"; field public static final java.lang.String TYPE_PHONE = "phone"; + field public static final java.lang.String TYPE_URL = "url"; } public static abstract class TextClassifier.EntityType implements java.lang.annotation.Annotation { diff --git a/core/java/android/view/textclassifier/TextClassificationResult.java b/core/java/android/view/textclassifier/TextClassificationResult.java index 6af0efb5fd087..8912ef3e8f43f 100644 --- a/core/java/android/view/textclassifier/TextClassificationResult.java +++ b/core/java/android/view/textclassifier/TextClassificationResult.java @@ -148,7 +148,7 @@ public final class TextClassificationResult { * @hide */ @NonNull - public static OnClickListener createStartActivityOnClick( + public static OnClickListener createStartActivityOnClickListener( @NonNull final Context context, @NonNull final Intent intent) { Preconditions.checkArgument(context != null); Preconditions.checkArgument(intent != null); diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java index b84e2ae5e4fd6..791543ed5f846 100644 --- a/core/java/android/view/textclassifier/TextClassifier.java +++ b/core/java/android/view/textclassifier/TextClassifier.java @@ -35,6 +35,7 @@ public interface TextClassifier { String TYPE_EMAIL = "email"; String TYPE_PHONE = "phone"; String TYPE_ADDRESS = "address"; + String TYPE_URL = "url"; @Retention(RetentionPolicy.SOURCE) @StringDef({ diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 8b39775bd0f76..97a36fd71c0f9 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -27,6 +27,7 @@ import android.graphics.drawable.Drawable; import android.icu.text.BreakIterator; import android.net.Uri; import android.os.ParcelFileDescriptor; +import android.provider.Browser; import android.text.Spannable; import android.text.TextUtils; import android.text.method.WordIterator; @@ -44,6 +45,7 @@ import java.util.Comparator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map; /** @@ -112,7 +114,7 @@ final class TextClassifierImpl implements TextClassifier { String type = getSmartSelection() .classifyText(text.toString(), startIndex, endIndex); if (!TextUtils.isEmpty(type)) { - type = type.toLowerCase().trim(); + type = type.toLowerCase(Locale.ENGLISH).trim(); // TODO: Added this log for debug only. Remove before release. Log.d(LOG_TAG, String.format("Classification type: %s", type)); return createClassificationResult(type, classified); @@ -126,7 +128,6 @@ final class TextClassifierImpl implements TextClassifier { return TextClassifier.NO_OP.getTextClassificationResult(text, startIndex, endIndex); } - @Override public LinksInfo getLinks(CharSequence text, int linkMask) { Preconditions.checkArgument(text != null); @@ -151,20 +152,25 @@ final class TextClassifierImpl implements TextClassifier { } private TextClassificationResult createClassificationResult(String type, CharSequence text) { - final Intent intent = IntentFactory.create(type, text.toString()); - if (intent == null) { - return TextClassificationResult.EMPTY; - } - final TextClassificationResult.Builder builder = new TextClassificationResult.Builder() .setText(text.toString()) - .setEntityType(type, 1.0f /* confidence */) - .setIntent(intent) - .setOnClickListener(TextClassificationResult.createStartActivityOnClick( - mContext, intent)); - final PackageManager pm = mContext.getPackageManager(); - final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0); + .setEntityType(type, 1.0f /* confidence */); + + final Intent intent = IntentFactory.create(mContext, type, text.toString()); + final PackageManager pm; + final ResolveInfo resolveInfo; + if (intent != null) { + pm = mContext.getPackageManager(); + resolveInfo = pm.resolveActivity(intent, 0); + } else { + pm = null; + resolveInfo = null; + } if (resolveInfo != null && resolveInfo.activityInfo != null) { + builder.setIntent(intent) + .setOnClickListener(TextClassificationResult.createStartActivityOnClickListener( + mContext, intent)); + final String packageName = resolveInfo.activityInfo.packageName; if ("android".equals(packageName)) { // Requires the chooser to find an activity to handle the intent. @@ -227,7 +233,7 @@ final class TextClassifierImpl implements TextClassifier { smartSelection.classifyText(text, selectionStart, selectionEnd); if (matches(type, linkMask)) { final Intent intent = IntentFactory.create( - type, text.substring(selectionStart, selectionEnd)); + context, type, text.substring(selectionStart, selectionEnd)); if (hasActivityHandler(context, intent)) { final ClickableSpan span = createSpan(context, intent); spans.add(new SpanSpec(selectionStart, selectionEnd, span)); @@ -255,6 +261,10 @@ final class TextClassifierImpl implements TextClassifier { && TextClassifier.TYPE_ADDRESS.equals(type)) { return true; } + if ((linkMask & Linkify.WEB_URLS) != 0 + && TextClassifier.TYPE_URL.equals(type)) { + return true; + } return false; } @@ -369,7 +379,7 @@ final class TextClassifierImpl implements TextClassifier { private IntentFactory() {} @Nullable - public static Intent create(String type, String text) { + public static Intent create(Context context, String type, String text) { switch (type) { case TextClassifier.TYPE_EMAIL: return new Intent(Intent.ACTION_SENDTO) @@ -380,6 +390,9 @@ final class TextClassifierImpl implements TextClassifier { case TextClassifier.TYPE_ADDRESS: return new Intent(Intent.ACTION_VIEW) .setData(Uri.parse(String.format("geo:0,0?q=%s", text))); + case TextClassifier.TYPE_URL: + return new Intent(Intent.ACTION_VIEW, Uri.parse(text)) + .putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); default: return null; // TODO: Add other classification types. @@ -395,6 +408,8 @@ final class TextClassifierImpl implements TextClassifier { return context.getString(com.android.internal.R.string.dial); case TextClassifier.TYPE_ADDRESS: return context.getString(com.android.internal.R.string.map); + case TextClassifier.TYPE_URL: + return context.getString(com.android.internal.R.string.browse); default: return null; // TODO: Add other classification types. diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 45b55707f4fc7..dd3b0549f1756 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -3902,7 +3902,7 @@ public class Editor { } else { final Intent intent = textClassificationResult.getIntent(); if (intent != null) { - TextClassificationResult.createStartActivityOnClick( + TextClassificationResult.createStartActivityOnClickListener( mTextView.getContext(), intent) .onClick(mTextView); } diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 19c5643cdaf8e..23098668c0829 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2602,11 +2602,14 @@ Email - Dial + Phone Map + + Browse + Storage space running out diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 89269aad8277e..f72906d25bc9a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -482,6 +482,7 @@ +