143e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki/*
243e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * Copyright (C) 2017 The Android Open Source Project
343e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki *
443e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * Licensed under the Apache License, Version 2.0 (the "License");
543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * you may not use this file except in compliance with the License.
643e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * You may obtain a copy of the License at
743e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki *
843e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki *      http://www.apache.org/licenses/LICENSE-2.0
943e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki *
1043e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * Unless required by applicable law or agreed to in writing, software
1143e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * distributed under the License is distributed on an "AS IS" BASIS,
1243e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * See the License for the specific language governing permissions and
1443e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki * limitations under the License.
1543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki */
1643e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
17f67f0a584e6dad90a3c6dabff208c3a01fcd51e6Abodunrinwa Tokipackage android.view.textclassifier;
1843e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
1943e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki/**
2043e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki *  Java wrapper for SmartSelection native library interface.
2143e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki *  This library is used for detecting entities in text.
2243e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki */
23f67f0a584e6dad90a3c6dabff208c3a01fcd51e6Abodunrinwa Tokifinal class SmartSelection {
2443e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
2543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    static {
26099ff1123b94c363055a9f6779db09e848b8051aAbodunrinwa Toki        System.loadLibrary("textclassifier");
2743e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    }
2843e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
29d2d1399a62087b4e9e36aca5d53f628b4c06e1d7Abodunrinwa Toki    /** Hints the classifier that this may be a url. */
30d2d1399a62087b4e9e36aca5d53f628b4c06e1d7Abodunrinwa Toki    static final int HINT_FLAG_URL = 0x01;
31d2d1399a62087b4e9e36aca5d53f628b4c06e1d7Abodunrinwa Toki    /** Hints the classifier that this may be an email. */
32d2d1399a62087b4e9e36aca5d53f628b4c06e1d7Abodunrinwa Toki    static final int HINT_FLAG_EMAIL = 0x02;
33d2d1399a62087b4e9e36aca5d53f628b4c06e1d7Abodunrinwa Toki
3443e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    private final long mCtx;
3543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
3643e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    /**
3743e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * Creates a new instance of SmartSelect predictor, using the provided model image,
3843e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * given as a file descriptor.
3943e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     */
40f67f0a584e6dad90a3c6dabff208c3a01fcd51e6Abodunrinwa Toki    SmartSelection(int fd) {
4143e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki        mCtx = nativeNew(fd);
4243e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    }
4343e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
4443e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    /**
4543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * Given a string context and current selection, computes the SmartSelection suggestion.
4643e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     *
4743e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * The begin and end are character indices into the context UTF8 string. selectionBegin is the
4843e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * character index where the selection begins, and selectionEnd is the index of one character
4943e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * past the selection span.
5043e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     *
5143e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * The return value is an array of two ints: suggested selection beginning and end, with the
5243e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * same semantics as the input selectionBeginning and selectionEnd.
5343e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     */
5443e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    public int[] suggest(String context, int selectionBegin, int selectionEnd) {
5543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki        return nativeSuggest(mCtx, context, selectionBegin, selectionEnd);
5643e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    }
5743e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
5843e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    /**
5943e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * Given a string context and current selection, classifies the type of the selected text.
6043e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     *
6143e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * The begin and end params are character indices in the context string.
6243e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     *
63a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki     * Returns an array of ClassificationResult objects with the probability
64a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki     * scores for different collections.
6543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     */
66a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki    public ClassificationResult[] classifyText(
67d2d1399a62087b4e9e36aca5d53f628b4c06e1d7Abodunrinwa Toki            String context, int selectionBegin, int selectionEnd, int hintFlags) {
68b5ab25948bc1b667f079c1563791f93e7b2f84d8Abodunrinwa Toki        return nativeClassifyText(mCtx, context, selectionBegin, selectionEnd, hintFlags);
6943e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    }
7043e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
7143e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    /**
7243e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     * Frees up the allocated memory.
7343e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki     */
7443e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    public void close() {
7543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki        nativeClose(mCtx);
7643e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    }
7743e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
78146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki    /**
79146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki     * Returns the language of the model.
80146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki     */
81146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki    public static String getLanguage(int fd) {
82146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki        return nativeGetLanguage(fd);
83146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki    }
84146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki
85146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki    /**
86146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki     * Returns the version of the model.
87146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki     */
88146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki    public static int getVersion(int fd) {
89146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki        return nativeGetVersion(fd);
90146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki    }
91146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki
9243e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    private static native long nativeNew(int fd);
9343e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
9443e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    private static native int[] nativeSuggest(
9543e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki            long context, String text, int selectionBegin, int selectionEnd);
9643e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
97a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki    private static native ClassificationResult[] nativeClassifyText(
98b5ab25948bc1b667f079c1563791f93e7b2f84d8Abodunrinwa Toki            long context, String text, int selectionBegin, int selectionEnd, int hintFlags);
9943e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki
10043e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki    private static native void nativeClose(long context);
101a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki
102146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki    private static native String nativeGetLanguage(int fd);
103146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki
104146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki    private static native int nativeGetVersion(int fd);
105146d0d4f6dbab461d1c8e53a65ccddca5041b767Abodunrinwa Toki
106a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki    /** Classification result for classifyText method. */
107a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki    static final class ClassificationResult {
108a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki        final String mCollection;
109a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki        /** float range: 0 - 1 */
110a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki        final float mScore;
111a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki
112a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki        ClassificationResult(String collection, float score) {
113a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki            mCollection = collection;
114a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki            mScore = score;
115a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki        }
116a6096f6c4c56c4937b52efb593d4333db301d6adAbodunrinwa Toki    }
11743e0350922556e86b641da084a2c9dc2b07fc662Abodunrinwa Toki}
118