diff options
Diffstat (limited to 'android/view/textclassifier/TextClassifierImplNative.java')
-rw-r--r-- | android/view/textclassifier/TextClassifierImplNative.java | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/android/view/textclassifier/TextClassifierImplNative.java b/android/view/textclassifier/TextClassifierImplNative.java new file mode 100644 index 00000000..3d4c8f28 --- /dev/null +++ b/android/view/textclassifier/TextClassifierImplNative.java @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2017 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.view.textclassifier; + +import android.content.res.AssetFileDescriptor; + +/** + * Java wrapper for TextClassifier native library interface. This library is used for detecting + * entities in text. + */ +final class TextClassifierImplNative { + + static { + System.loadLibrary("textclassifier"); + } + + private final long mModelPtr; + + /** + * Creates a new instance of TextClassifierImplNative, using the provided model image, given as + * a file descriptor. + */ + TextClassifierImplNative(int fd) { + mModelPtr = nativeNew(fd); + if (mModelPtr == 0L) { + throw new IllegalArgumentException("Couldn't initialize TC from file descriptor."); + } + } + + /** + * Creates a new instance of TextClassifierImplNative, using the provided model image, given as + * a file path. + */ + TextClassifierImplNative(String path) { + mModelPtr = nativeNewFromPath(path); + if (mModelPtr == 0L) { + throw new IllegalArgumentException("Couldn't initialize TC from given file."); + } + } + + /** + * Creates a new instance of TextClassifierImplNative, using the provided model image, given as + * an AssetFileDescriptor. + */ + TextClassifierImplNative(AssetFileDescriptor afd) { + mModelPtr = nativeNewFromAssetFileDescriptor(afd, afd.getStartOffset(), afd.getLength()); + if (mModelPtr == 0L) { + throw new IllegalArgumentException( + "Couldn't initialize TC from given AssetFileDescriptor"); + } + } + + /** + * Given a string context and current selection, computes the SmartSelection suggestion. + * + * <p>The begin and end are character indices into the context UTF8 string. selectionBegin is + * the character index where the selection begins, and selectionEnd is the index of one + * character past the selection span. + * + * <p>The return value is an array of two ints: suggested selection beginning and end, with the + * same semantics as the input selectionBeginning and selectionEnd. + */ + public int[] suggestSelection( + String context, int selectionBegin, int selectionEnd, SelectionOptions options) { + return nativeSuggestSelection(mModelPtr, context, selectionBegin, selectionEnd, options); + } + + /** + * Given a string context and current selection, classifies the type of the selected text. + * + * <p>The begin and end params are character indices in the context string. + * + * <p>Returns an array of ClassificationResult objects with the probability scores for different + * collections. + */ + public ClassificationResult[] classifyText( + String context, int selectionBegin, int selectionEnd, ClassificationOptions options) { + return nativeClassifyText(mModelPtr, context, selectionBegin, selectionEnd, options); + } + + /** + * Annotates given input text. The annotations should cover the whole input context except for + * whitespaces, and are sorted by their position in the context string. + */ + public AnnotatedSpan[] annotate(String text, AnnotationOptions options) { + return nativeAnnotate(mModelPtr, text, options); + } + + /** Frees up the allocated memory. */ + public void close() { + nativeClose(mModelPtr); + } + + /** Returns a comma separated list of locales supported by the model as BCP 47 tags. */ + public static String getLocales(int fd) { + return nativeGetLocales(fd); + } + + /** Returns the version of the model. */ + public static int getVersion(int fd) { + return nativeGetVersion(fd); + } + + /** Represents a datetime parsing result from classifyText calls. */ + public static final class DatetimeResult { + static final int GRANULARITY_YEAR = 0; + static final int GRANULARITY_MONTH = 1; + static final int GRANULARITY_WEEK = 2; + static final int GRANULARITY_DAY = 3; + static final int GRANULARITY_HOUR = 4; + static final int GRANULARITY_MINUTE = 5; + static final int GRANULARITY_SECOND = 6; + + private final long mTimeMsUtc; + private final int mGranularity; + + DatetimeResult(long timeMsUtc, int granularity) { + mGranularity = granularity; + mTimeMsUtc = timeMsUtc; + } + + public long getTimeMsUtc() { + return mTimeMsUtc; + } + + public int getGranularity() { + return mGranularity; + } + } + + /** Represents a result of classifyText method call. */ + public static final class ClassificationResult { + private final String mCollection; + private final float mScore; + private final DatetimeResult mDatetimeResult; + + ClassificationResult( + String collection, float score, DatetimeResult datetimeResult) { + mCollection = collection; + mScore = score; + mDatetimeResult = datetimeResult; + } + + public String getCollection() { + if (mCollection.equals(TextClassifier.TYPE_DATE) && mDatetimeResult != null) { + switch (mDatetimeResult.getGranularity()) { + case DatetimeResult.GRANULARITY_HOUR: + // fall through + case DatetimeResult.GRANULARITY_MINUTE: + // fall through + case DatetimeResult.GRANULARITY_SECOND: + return TextClassifier.TYPE_DATE_TIME; + default: + return TextClassifier.TYPE_DATE; + } + } + return mCollection; + } + + public float getScore() { + return mScore; + } + + public DatetimeResult getDatetimeResult() { + return mDatetimeResult; + } + } + + /** Represents a result of Annotate call. */ + public static final class AnnotatedSpan { + private final int mStartIndex; + private final int mEndIndex; + private final ClassificationResult[] mClassification; + + AnnotatedSpan( + int startIndex, int endIndex, ClassificationResult[] classification) { + mStartIndex = startIndex; + mEndIndex = endIndex; + mClassification = classification; + } + + public int getStartIndex() { + return mStartIndex; + } + + public int getEndIndex() { + return mEndIndex; + } + + public ClassificationResult[] getClassification() { + return mClassification; + } + } + + /** Represents options for the suggestSelection call. */ + public static final class SelectionOptions { + private final String mLocales; + + SelectionOptions(String locales) { + mLocales = locales; + } + + public String getLocales() { + return mLocales; + } + } + + /** Represents options for the classifyText call. */ + public static final class ClassificationOptions { + private final long mReferenceTimeMsUtc; + private final String mReferenceTimezone; + private final String mLocales; + + ClassificationOptions(long referenceTimeMsUtc, String referenceTimezone, String locale) { + mReferenceTimeMsUtc = referenceTimeMsUtc; + mReferenceTimezone = referenceTimezone; + mLocales = locale; + } + + public long getReferenceTimeMsUtc() { + return mReferenceTimeMsUtc; + } + + public String getReferenceTimezone() { + return mReferenceTimezone; + } + + public String getLocale() { + return mLocales; + } + } + + /** Represents options for the Annotate call. */ + public static final class AnnotationOptions { + private final long mReferenceTimeMsUtc; + private final String mReferenceTimezone; + private final String mLocales; + + AnnotationOptions(long referenceTimeMsUtc, String referenceTimezone, String locale) { + mReferenceTimeMsUtc = referenceTimeMsUtc; + mReferenceTimezone = referenceTimezone; + mLocales = locale; + } + + public long getReferenceTimeMsUtc() { + return mReferenceTimeMsUtc; + } + + public String getReferenceTimezone() { + return mReferenceTimezone; + } + + public String getLocale() { + return mLocales; + } + } + + private static native long nativeNew(int fd); + + private static native long nativeNewFromPath(String path); + + private static native long nativeNewFromAssetFileDescriptor( + AssetFileDescriptor afd, long offset, long size); + + private static native int[] nativeSuggestSelection( + long context, + String text, + int selectionBegin, + int selectionEnd, + SelectionOptions options); + + private static native ClassificationResult[] nativeClassifyText( + long context, + String text, + int selectionBegin, + int selectionEnd, + ClassificationOptions options); + + private static native AnnotatedSpan[] nativeAnnotate( + long context, String text, AnnotationOptions options); + + private static native void nativeClose(long context); + + private static native String nativeGetLocales(int fd); + + private static native int nativeGetVersion(int fd); +} |