diff --git a/api/current.txt b/api/current.txt
index 65f80eeeb6adb..6f406402d9ec3 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -47339,6 +47339,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 edf778b04c194..a9be2f7cfd3ab 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -50778,6 +50778,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 6c699bb083f6a..5a423a5267891 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -47652,6 +47652,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 @@
+