summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt14
-rw-r--r--api/system-current.txt14
-rw-r--r--api/test-current.txt14
-rw-r--r--core/java/android/app/Activity.java3
-rw-r--r--core/java/android/app/SystemServiceRegistry.java8
-rw-r--r--core/java/android/content/Context.java9
-rw-r--r--core/java/android/text/TextClassificationManager.java62
-rw-r--r--core/java/android/text/TextLanguage.java85
-rw-r--r--core/java/android/widget/TextView.java5
9 files changed, 211 insertions, 3 deletions
diff --git a/api/current.txt b/api/current.txt
index 85aa5df723c9..20cc4d657f93 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -8385,6 +8385,7 @@ package android.content {
field public static final java.lang.String TELECOM_SERVICE = "telecom";
field public static final java.lang.String TELEPHONY_SERVICE = "phone";
field public static final java.lang.String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
+ field public static final java.lang.String TEXT_CLASSIFICATION_SERVICE = "textclassification";
field public static final java.lang.String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
field public static final java.lang.String TV_INPUT_SERVICE = "tv_input";
field public static final java.lang.String UI_MODE_SERVICE = "uimode";
@@ -39244,6 +39245,12 @@ package android.text {
method public java.util.Map<java.lang.String, java.lang.Float> getTypeConfidence();
}
+ public final class TextClassificationManager implements android.text.TextAssistant {
+ method public void addLinks(android.text.Spannable, int);
+ method public java.util.List<android.text.TextLanguage> detectLanguages(java.lang.CharSequence);
+ method public android.text.TextSelection suggestSelection(java.lang.CharSequence, int, int);
+ }
+
public abstract interface TextDirectionHeuristic {
method public abstract boolean isRtl(char[], int, int);
method public abstract boolean isRtl(java.lang.CharSequence, int, int);
@@ -39259,6 +39266,13 @@ package android.text {
field public static final android.text.TextDirectionHeuristic RTL;
}
+ public final class TextLanguage {
+ ctor public TextLanguage(int, int, java.util.Map<java.lang.String, java.lang.Float>);
+ method public int getEndIndex();
+ method public java.util.Map<java.lang.String, java.lang.Float> getLanguageConfidence();
+ method public int getStartIndex();
+ }
+
public class TextPaint extends android.graphics.Paint {
ctor public TextPaint();
ctor public TextPaint(int);
diff --git a/api/system-current.txt b/api/system-current.txt
index 41fd0d442542..94fc1bf5d28e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -8731,6 +8731,7 @@ package android.content {
field public static final java.lang.String TELECOM_SERVICE = "telecom";
field public static final java.lang.String TELEPHONY_SERVICE = "phone";
field public static final java.lang.String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
+ field public static final java.lang.String TEXT_CLASSIFICATION_SERVICE = "textclassification";
field public static final java.lang.String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
field public static final java.lang.String TV_INPUT_SERVICE = "tv_input";
field public static final java.lang.String UI_MODE_SERVICE = "uimode";
@@ -42432,6 +42433,12 @@ package android.text {
method public java.util.Map<java.lang.String, java.lang.Float> getTypeConfidence();
}
+ public final class TextClassificationManager implements android.text.TextAssistant {
+ method public void addLinks(android.text.Spannable, int);
+ method public java.util.List<android.text.TextLanguage> detectLanguages(java.lang.CharSequence);
+ method public android.text.TextSelection suggestSelection(java.lang.CharSequence, int, int);
+ }
+
public abstract interface TextDirectionHeuristic {
method public abstract boolean isRtl(char[], int, int);
method public abstract boolean isRtl(java.lang.CharSequence, int, int);
@@ -42447,6 +42454,13 @@ package android.text {
field public static final android.text.TextDirectionHeuristic RTL;
}
+ public final class TextLanguage {
+ ctor public TextLanguage(int, int, java.util.Map<java.lang.String, java.lang.Float>);
+ method public int getEndIndex();
+ method public java.util.Map<java.lang.String, java.lang.Float> getLanguageConfidence();
+ method public int getStartIndex();
+ }
+
public class TextPaint extends android.graphics.Paint {
ctor public TextPaint();
ctor public TextPaint(int);
diff --git a/api/test-current.txt b/api/test-current.txt
index 2a347d717da4..2c37f632ecd1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -8409,6 +8409,7 @@ package android.content {
field public static final java.lang.String TELECOM_SERVICE = "telecom";
field public static final java.lang.String TELEPHONY_SERVICE = "phone";
field public static final java.lang.String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
+ field public static final java.lang.String TEXT_CLASSIFICATION_SERVICE = "textclassification";
field public static final java.lang.String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
field public static final java.lang.String TV_INPUT_SERVICE = "tv_input";
field public static final java.lang.String UI_MODE_SERVICE = "uimode";
@@ -39343,6 +39344,12 @@ package android.text {
method public java.util.Map<java.lang.String, java.lang.Float> getTypeConfidence();
}
+ public final class TextClassificationManager implements android.text.TextAssistant {
+ method public void addLinks(android.text.Spannable, int);
+ method public java.util.List<android.text.TextLanguage> detectLanguages(java.lang.CharSequence);
+ method public android.text.TextSelection suggestSelection(java.lang.CharSequence, int, int);
+ }
+
public abstract interface TextDirectionHeuristic {
method public abstract boolean isRtl(char[], int, int);
method public abstract boolean isRtl(java.lang.CharSequence, int, int);
@@ -39358,6 +39365,13 @@ package android.text {
field public static final android.text.TextDirectionHeuristic RTL;
}
+ public final class TextLanguage {
+ ctor public TextLanguage(int, int, java.util.Map<java.lang.String, java.lang.Float>);
+ method public int getEndIndex();
+ method public java.util.Map<java.lang.String, java.lang.Float> getLanguageConfidence();
+ method public int getStartIndex();
+ }
+
public class TextPaint extends android.graphics.Paint {
ctor public TextPaint();
ctor public TextPaint(int);
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 6dd488f351ed..752eb14e24f6 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -75,6 +75,7 @@ import android.service.autofill.IAutoFillCallback;
import android.text.Selection;
import android.text.SpannableStringBuilder;
import android.text.TextAssistant;
+import android.text.TextClassificationManager;
import android.text.TextUtils;
import android.text.method.TextKeyListener;
import android.transition.Scene;
@@ -1402,7 +1403,7 @@ public class Activity extends ContextThemeWrapper
if (mTextAssistant != null) {
return mTextAssistant;
}
- return TextAssistant.NO_OP;
+ return getSystemService(TextClassificationManager.class);
}
/**
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 67ce3425feea..e1bd93eb3a4c 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -115,6 +115,7 @@ import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.text.TextClassificationManager;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
@@ -221,6 +222,13 @@ final class SystemServiceRegistry {
return new HdmiControlManager(IHdmiControlService.Stub.asInterface(b));
}});
+ registerService(Context.TEXT_CLASSIFICATION_SERVICE, TextClassificationManager.class,
+ new StaticServiceFetcher<TextClassificationManager>() {
+ @Override
+ public TextClassificationManager createService() {
+ return new TextClassificationManager();
+ }});
+
registerService(Context.CLIPBOARD_SERVICE, ClipboardManager.class,
new CachedServiceFetcher<ClipboardManager>() {
@Override
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 5fa427514ebe..b9783aa1600a 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3309,6 +3309,15 @@ public abstract class Context {
/**
* Use with {@link #getSystemService} to retrieve a
+ * {@link android.text.TextClassificationManager} for text classification services.
+ *
+ * @see #getSystemService
+ * @see android.text.TextClassificationManager
+ */
+ public static final String TEXT_CLASSIFICATION_SERVICE = "textclassification";
+
+ /**
+ * Use with {@link #getSystemService} to retrieve a
* {@link android.view.inputmethod.InputMethodManager} for accessing input
* methods.
*
diff --git a/core/java/android/text/TextClassificationManager.java b/core/java/android/text/TextClassificationManager.java
new file mode 100644
index 000000000000..d4548f04e0a0
--- /dev/null
+++ b/core/java/android/text/TextClassificationManager.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text;
+
+import android.annotation.NonNull;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Interface to the text classification service.
+ * This class uses machine learning techniques to infer things about text.
+ * Unless otherwise stated, methods of this class are blocking operations and should most likely not
+ * be called on the UI thread.
+ *
+ * <p> You do not instantiate this class directly; instead, retrieve it through
+ * {@link android.content.Context#getSystemService}.
+ *
+ * The TextClassificationManager serves as the default TextAssistant if none has been set.
+ * @see android.app.Activity#setTextAssistant(TextAssistant).
+ */
+public final class TextClassificationManager implements TextAssistant {
+ // TODO: Consider not making this class implement TextAssistant.
+
+ /** @hide */
+ public TextClassificationManager() {}
+
+ /**
+ * Returns information containing languages that were detected in the provided text.
+ * This is a blocking operation and should most likely not be called on the UI thread.
+ */
+ public List<TextLanguage> detectLanguages(@NonNull CharSequence text) {
+ // TODO: Implement this using the cld3 library.
+ return Collections.emptyList();
+ }
+
+ @Override
+ public TextSelection suggestSelection(
+ @NonNull CharSequence text, int selectionStartIndex, int selectionEndIndex) {
+ // TODO: Implement.
+ return TextAssistant.NO_OP.suggestSelection(text, selectionStartIndex, selectionEndIndex);
+ }
+
+ @Override
+ public void addLinks(@NonNull Spannable text, int linkMask) {
+ // TODO: Implement.
+ }
+}
diff --git a/core/java/android/text/TextLanguage.java b/core/java/android/text/TextLanguage.java
new file mode 100644
index 000000000000..eb834f120dee
--- /dev/null
+++ b/core/java/android/text/TextLanguage.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text;
+
+import android.annotation.NonNull;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Specifies detected languages for a section of text indicated by a start and end index.
+ */
+public final class TextLanguage {
+
+ private final int mStartIndex;
+ private final int mEndIndex;
+ private final Map<String, Float> mLanguageConfidence;
+
+ /**
+ * Initializes a TextLanguage object.
+ *
+ * @param startIndex the start index of the detected languages in the text provided to generate
+ * this object.
+ * @param endIndex the end index of the detected languages in the text provided to generate this
+ * object.
+ * @param languageConfidence a map of detected language to confidence score. The language string
+ * is a BCP-47 language tag.
+ * @throws NullPointerException if languageConfidence is null or contains a null key or value.
+ */
+ public TextLanguage(int startIndex, int endIndex,
+ @NonNull Map<String, Float> languageConfidence) {
+ mStartIndex = startIndex;
+ mEndIndex = endIndex;
+
+ Map<String, Float> map = new LinkedHashMap<>();
+ Preconditions.checkNotNull(languageConfidence).entrySet().stream()
+ .sorted(Map.Entry.comparingByValue())
+ .forEach(entry -> map.put(
+ Preconditions.checkNotNull(entry.getKey()),
+ Preconditions.checkNotNull(entry.getValue())));
+ mLanguageConfidence = Collections.unmodifiableMap(map);
+ }
+
+ /**
+ * Returns the start index of the detected languages in the text provided to generate this
+ * object.
+ */
+ public int getStartIndex() {
+ return mStartIndex;
+ }
+
+ /**
+ * Returns the end index of the detected languages in the text provided to generate this object.
+ */
+ public int getEndIndex() {
+ return mEndIndex;
+ }
+
+ /**
+ * Returns an unmodifiable map of detected language to confidence score. The map entries are
+ * ordered from high confidence score (1) to low confidence score (0). The language string is a
+ * BCP-47 language tag.
+ */
+ @NonNull
+ public Map<String, Float> getLanguageConfidence() {
+ return mLanguageConfidence;
+ }
+}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 44655f18f3eb..c7e4abe46bde 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -77,6 +77,7 @@ import android.text.Spanned;
import android.text.SpannedString;
import android.text.StaticLayout;
import android.text.TextAssistant;
+import android.text.TextClassificationManager;
import android.text.TextDirectionHeuristic;
import android.text.TextDirectionHeuristics;
import android.text.TextPaint;
@@ -10027,8 +10028,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mTextAssistant = ((Activity) mContext).getTextAssistant();
} else {
// The context of this TextView should be an Activity. If it is not and no
- // text assistant has been set, return a NO_OP TextAssistant.
- mTextAssistant = TextAssistant.NO_OP;
+ // text assistant has been set, return the TextClassificationManager.
+ mTextAssistant = mContext.getSystemService(TextClassificationManager.class);
}
return mTextAssistant;
}