17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/*
27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License.
67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at
77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and
147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License.
157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpackage com.android.inputmethod.pinyin;
187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport com.android.inputmethod.pinyin.IPinyinDecoderService;
207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.io.FileDescriptor;
227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.io.FileNotFoundException;
237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.io.IOException;
247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.util.List;
257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.util.Vector;
267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.app.Service;
287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.content.Intent;
297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.content.res.AssetFileDescriptor;
307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.os.IBinder;
317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.os.RemoteException;
327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.util.Log;
337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/**
357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * This class is used to separate the input method kernel in an individual
367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * service so that both IME and IME-syncer can use it.
377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpublic class PinyinDecoderService extends Service {
397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static boolean nativeImOpenDecoder(byte fn_sys_dict[],
407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            byte fn_usr_dict[]);
417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static boolean nativeImOpenDecoderFd(FileDescriptor fd,
437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            long startOffset, long length, byte fn_usr_dict[]);
447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static void nativeImSetMaxLens(int maxSpsLen, int maxHzsLen);
467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static boolean nativeImCloseDecoder();
487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeImSearch(byte pyBuf[], int pyLen);
507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeImDelSearch(int pos, boolean is_pos_in_splid,
527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            boolean clear_fixed_this_step);
537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static void nativeImResetSearch();
557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeImAddLetter(byte ch);
577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static String nativeImGetPyStr(boolean decoded);
597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeImGetPyStrLen(boolean decoded);
617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int[] nativeImGetSplStart();
637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static String nativeImGetChoice(int choiceId);
657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeImChoose(int choiceId);
677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeImCancelLastChoice();
697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeImGetFixedLen();
717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static boolean nativeImCancelInput();
737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static boolean nativeImFlushCache();
757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeImGetPredictsNum(String fixedStr);
777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static String nativeImGetPredictItem(int predictNo);
797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // Sync related
817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static String nativeSyncUserDict(byte[] user_dict, String tomerge);
827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static boolean nativeSyncBegin(byte[] user_dict);
847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static boolean nativeSyncFinish();
867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static String nativeSyncGetLemmas();
887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeSyncPutLemmas(String tomerge);
907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeSyncGetLastCount();
927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeSyncGetTotalCount();
947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static boolean nativeSyncClearLastGot();
967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    native static int nativeSyncGetCapacity();
987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private final static int MAX_PATH_FILE_LENGTH = 100;
1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private static boolean inited = false;
1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private String mUsr_dict_file;
1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    static {
1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        try {
1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            System.loadLibrary("jni_pinyinime");
1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } catch (UnsatisfiedLinkError ule) {
1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            Log.e("PinyinDecoderService",
1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    "WARNING: Could not load jni_pinyinime natives");
1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // Get file name of the specified dictionary
1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private boolean getUsrDictFileName(byte usr_dict[]) {
1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == usr_dict) {
1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return false;
1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int i = 0; i < mUsr_dict_file.length(); i++)
1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            usr_dict[i] = (byte) mUsr_dict_file.charAt(i);
1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        usr_dict[mUsr_dict_file.length()] = 0;
1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return true;
1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private void initPinyinEngine() {
1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        byte usr_dict[];
1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        usr_dict = new byte[MAX_PATH_FILE_LENGTH];
1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // Here is how we open a built-in dictionary for access through
1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // a file descriptor...
1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        AssetFileDescriptor afd = getResources().openRawResourceFd(
1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                R.raw.dict_pinyin);
1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (Environment.getInstance().needDebug()) {
1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            Log
1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    .i("foo", "Dict: start=" + afd.getStartOffset()
1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            + ", length=" + afd.getLength() + ", fd="
1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            + afd.getParcelFileDescriptor());
1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (getUsrDictFileName(usr_dict)) {
1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            inited = nativeImOpenDecoderFd(afd.getFileDescriptor(), afd
1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    .getStartOffset(), afd.getLength(), usr_dict);
1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        try {
1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            afd.close();
1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } catch (IOException e) {
1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void onCreate() {
1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        super.onCreate();
1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mUsr_dict_file = getFileStreamPath("usr_dict.dat").getPath();
1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // This is a hack to make sure our "files" directory has been
1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // created.
1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        try {
1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            openFileOutput("dummy", 0).close();
1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } catch (FileNotFoundException e) {
1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } catch (IOException e) {
1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        initPinyinEngine();
1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void onDestroy() {
1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        nativeImCloseDecoder();
1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        inited = false;
1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        super.onDestroy();
1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private final IPinyinDecoderService.Stub mBinder = new IPinyinDecoderService.Stub() {
1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int getInt() {
1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return 12345;
1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public void setMaxLens(int maxSpsLen, int maxHzsLen) {
1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            nativeImSetMaxLens(maxSpsLen, maxHzsLen);
1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imSearch(byte[] pyBuf, int pyLen) {
1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImSearch(pyBuf, pyLen);
1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imDelSearch(int pos, boolean is_pos_in_splid,
1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                boolean clear_fixed_this_step) {
1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImDelSearch(pos, is_pos_in_splid,
1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    clear_fixed_this_step);
1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public void imResetSearch() {
1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            nativeImResetSearch();
1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imAddLetter(byte ch) {
1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImAddLetter(ch);
1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public String imGetPyStr(boolean decoded) {
2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImGetPyStr(decoded);
2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imGetPyStrLen(boolean decoded) {
2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImGetPyStrLen(decoded);
2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int[] imGetSplStart() {
2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImGetSplStart();
2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public String imGetChoice(int choiceId) {
2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImGetChoice(choiceId);
2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public String imGetChoices(int choicesNum) {
2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            String retStr = null;
2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = 0; i < choicesNum; i++) {
2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (null == retStr)
2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    retStr = nativeImGetChoice(i);
2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                else
2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    retStr += " " + nativeImGetChoice(i);
2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return retStr;
2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public List<String> imGetChoiceList(int choicesStart, int choicesNum,
2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                int sentFixedLen) {
2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            Vector<String> choiceList = new Vector<String>();
2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = choicesStart; i < choicesStart + choicesNum; i++) {
2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                String retStr = nativeImGetChoice(i);
2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (0 == i) retStr = retStr.substring(sentFixedLen);
2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                choiceList.add(retStr);
2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return choiceList;
2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imChoose(int choiceId) {
2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImChoose(choiceId);
2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imCancelLastChoice() {
2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImCancelLastChoice();
2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imGetFixedLen() {
2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImGetFixedLen();
2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public boolean imCancelInput() {
2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImCancelInput();
2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public void imFlushCache() {
2547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            nativeImFlushCache();
2557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imGetPredictsNum(String fixedStr) {
2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImGetPredictsNum(fixedStr);
2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public String imGetPredictItem(int predictNo) {
2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeImGetPredictItem(predictNo);
2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public List<String> imGetPredictList(int predictsStart, int predictsNum) {
2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            Vector<String> predictList = new Vector<String>();
2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = predictsStart; i < predictsStart + predictsNum; i++) {
2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                predictList.add(nativeImGetPredictItem(i));
2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return predictList;
2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public String syncUserDict(String tomerge) {
2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            byte usr_dict[];
2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            usr_dict = new byte[MAX_PATH_FILE_LENGTH];
2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (getUsrDictFileName(usr_dict)) {
2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return nativeSyncUserDict(usr_dict, tomerge);
2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return null;
2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public boolean syncBegin() {
2847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            byte usr_dict[];
2857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            usr_dict = new byte[MAX_PATH_FILE_LENGTH];
2867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (getUsrDictFileName(usr_dict)) {
2887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return nativeSyncBegin(usr_dict);
2897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return false;
2917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public void syncFinish() {
2947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            nativeSyncFinish();
2957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int syncPutLemmas(String tomerge) {
2987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeSyncPutLemmas(tomerge);
2997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public String syncGetLemmas() {
3027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeSyncGetLemmas();
3037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int syncGetLastCount() {
3067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeSyncGetLastCount();
3077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int syncGetTotalCount() {
3107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeSyncGetTotalCount();
3117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public void syncClearLastGot() {
3147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            nativeSyncClearLastGot();
3157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int imSyncGetCapacity() {
3187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return nativeSyncGetCapacity();
3197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    };
3217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
3237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public IBinder onBind(Intent intent) {
3247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mBinder;
3257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
327