diff options
| -rw-r--r-- | api/current.txt | 14 | ||||
| -rw-r--r-- | api/system-current.txt | 14 | ||||
| -rw-r--r-- | api/test-current.txt | 14 | ||||
| -rw-r--r-- | core/java/android/app/Activity.java | 3 | ||||
| -rw-r--r-- | core/java/android/app/SystemServiceRegistry.java | 8 | ||||
| -rw-r--r-- | core/java/android/content/Context.java | 9 | ||||
| -rw-r--r-- | core/java/android/text/TextClassificationManager.java | 62 | ||||
| -rw-r--r-- | core/java/android/text/TextLanguage.java | 85 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 5 |
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; } |