1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License.
6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at
7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and
14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License.
15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpackage jp.co.omronsoft.openwnn.EN;
18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
19053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport java.util.HashMap;
20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport java.util.ArrayList;
21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
227b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport jp.co.omronsoft.openwnn.*;
23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.SharedPreferences;
24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
263feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The OpenWnn engine class for English IME.
27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
283feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpublic class OpenWnnEngineEN implements WnnEngine {
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Normal dictionary */
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int DICT_DEFAULT              = 0;
33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary for mistype correction */
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int DICT_FOR_CORRECT_MISTYPE  = 1;
357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Score(frequency value) of word in the learning dictionary */
367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    public static final int FREQ_LEARN = 600;
377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Score(frequency value) of word in the user dictionary */
387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    public static final int FREQ_USER = 500;
394ea4d400da5130039b3dd11ad0adfdd4e8cab0ffDaisuke Miyakawa    /** Limitation of predicted candidates */
404ea4d400da5130039b3dd11ad0adfdd4e8cab0ffDaisuke Miyakawa    public static final int PREDICT_LIMIT = 300;
41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** OpenWnn dictionary */
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	private   WnnDictionary mDictionary;
44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Word list */
457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private ArrayList<WnnWord> mConvResult;
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** HashMap for checking duplicate word */
477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private HashMap<String, WnnWord> mCandTable;
48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Input string */
49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private String        mInputString;
50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Searching string */
51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private String        mSearchKey;
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Number of output candidates */
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int           mOutputNum;
547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** The candidate filter */
557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private CandidateFilter mFilter = null;
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Candidate's case
59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * <br>
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * CASE_LOWER: all letters are lower.<br>
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * CASE_HEAD_UPPER: the first letter is upper; others are lower.<br>
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * CASE_UPPER: all letters are upper.<br>
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int           mCandidateCase;
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int CASE_LOWER = 0;
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int CASE_UPPER = 1;
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int CASE_HEAD_UPPER = 3;
68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
713feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     *
723feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param writableDictionaryName		Writable dictionary file name(null if not use)
73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public OpenWnnEngineEN(String writableDictionaryName) {
757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mConvResult = new ArrayList<WnnWord>();
767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mCandTable = new HashMap<String, WnnWord>();
77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mSearchKey = null;
78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mOutputNum = 0;
79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
80053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionary = new OpenWnnDictionaryImpl(
813feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        		"/data/data/jp.co.omronsoft.openwnn/lib/libWnnEngDic.so",
823feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        		writableDictionaryName);
833feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        if (!mDictionary.isActive()) {
843feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        	mDictionary = new OpenWnnDictionaryImpl(
853feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        			"/system/lib/libWnnEngDic.so",
863feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        			writableDictionaryName);
873feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        }
88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionary.clearDictionary( );
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mDictionary.setDictionary(0, 400, 550);
917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mDictionary.setDictionary(1, 400, 550);
927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mDictionary.setDictionary(2, 400, 550);
937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mDictionary.setDictionary(WnnDictionary.INDEX_USER_DICTIONARY, FREQ_USER, FREQ_USER);
947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mDictionary.setDictionary(WnnDictionary.INDEX_LEARN_DICTIONARY, FREQ_LEARN, FREQ_LEARN);
95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionary.setApproxPattern(WnnDictionary.APPROX_PATTERN_EN_QWERTY_NEAR);
97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionary.setInUseState( false );
99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Get a candidate.
103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
1043feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param index		Index of candidate
1053feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @return			A candidate; {@code null} if no candidate for the index.
106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private WnnWord getCandidate(int index) {
108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnWord word;
109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* search the candidate from the dictionaries */
1104ea4d400da5130039b3dd11ad0adfdd4e8cab0ffDaisuke Miyakawa        while (mConvResult.size() < PREDICT_LIMIT && index >= mConvResult.size()) {
111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            while ((word = mDictionary.getNextWord()) != null) {
112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* adjust the case of letter */
113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                char c = word.candidate.charAt(0);
114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mCandidateCase == CASE_LOWER) {
115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (Character.isLowerCase(c)) {
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        break;
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else if (mCandidateCase == CASE_HEAD_UPPER) {
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (Character.isLowerCase(c)) {
120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        word.candidate = Character.toString(Character.toUpperCase(c)) + word.candidate.substring(1);
121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    word.candidate = word.candidate.toUpperCase();
125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (word == null) {
129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* check duplication */
132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            addCandidate(word);
133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* get the default candidates */
136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (index >= mConvResult.size()) {
137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* input string itself */
138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            addCandidate(new WnnWord(mInputString, mSearchKey));
139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* Capitalize the head of input */
141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mSearchKey.length() > 1) {
142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                addCandidate(new WnnWord(mSearchKey.substring(0,1).toUpperCase() + mSearchKey.substring(1),
143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                         mSearchKey));
144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* Capitalize all */
147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            addCandidate(new WnnWord(mSearchKey.toUpperCase(), mSearchKey));
148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (index >= mConvResult.size()) {
151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return null;
152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        return mConvResult.get(index);
154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Add a word to the candidates list if there is no duplication.
1583feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     *
1593feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param word		A word
1603feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @return			{@code true} if the word is added to the list; {@code false} if not.
161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean addCandidate(WnnWord word) {
163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (word.candidate == null || mCandTable.containsKey(word.candidate)) {
164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return false;
165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (mFilter != null && !mFilter.isAllowed(word)) {
1677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        	return false;
1687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCandTable.put(word.candidate, word);
170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConvResult.add(word);
171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return true;
172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void clearCandidates() {
175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConvResult.clear();
176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCandTable.clear();
177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mOutputNum = 0;
178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mSearchKey = null;
179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set dictionary.
183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
1843feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param type		Type of dictionary (DIC_DEFAULT or DIC_FOR_CORRECT_MISTYPE)
1853feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @return			{@code true} if the dictionary is changed; {@code false} if not.
186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean setDictionary(int type) {
188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (type == DICT_FOR_CORRECT_MISTYPE) {
189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionary.clearApproxPattern();
190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionary.setApproxPattern(WnnDictionary.APPROX_PATTERN_EN_QWERTY_NEAR);
191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionary.clearApproxPattern();
193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return true;
195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set search key for the dictionary.
199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * <br>
200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * To search the dictionary, this method set the lower case of
201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * input string to the search key. And hold the input string's
202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * capitalization information to adjust the candidates
203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * capitalization later.
204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
2053feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param input		Input string
2063feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @return			{@code true} if the search key is set; {@code false} if not.
207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean setSearchKey(String input) {
209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (input.length() == 0) {
210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return false;
211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* set mInputString */
214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputString = input;
215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* set mSearchKey */
217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mSearchKey = input.toLowerCase();
218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* set mCandidateCase */
220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (Character.isUpperCase(input.charAt(0))) {
221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (input.length() > 1 && Character.isUpperCase(input.charAt(1))) {
222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mCandidateCase = CASE_UPPER;
223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mCandidateCase = CASE_HEAD_UPPER;
225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mCandidateCase = CASE_LOWER;
228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return true;
231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2327b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
2337b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /**
2347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Set the candidate filter
2353feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     *
2363feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param filter	The candidate filter
2377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     */
2387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    public void setFilter(CandidateFilter filter) {
2397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    	mFilter = filter;
2407b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
2417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /***********************************************************************
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * WnnEngine's interface
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     **********************************************************************/
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#init */
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void init() {}
247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#close */
249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void close() {}
250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#predict */
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int predict(ComposingText text, int minLen, int maxLen) {
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearCandidates();
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (text == null) { return 0; }
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        String input = text.toString(2);
258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (!setSearchKey(input)) {
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* set dictionaries by the length of input */
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnDictionary dict = mDictionary;
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.setInUseState( true );
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.clearDictionary();
267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.setDictionary(0, 400, 550);
268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (input.length() > 1) {
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.setDictionary(1, 400, 550);
270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (input.length() > 2) {
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.setDictionary(2, 400, 550);
273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        dict.setDictionary(WnnDictionary.INDEX_USER_DICTIONARY, FREQ_USER, FREQ_USER);
2757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        dict.setDictionary(WnnDictionary.INDEX_LEARN_DICTIONARY, FREQ_LEARN, FREQ_LEARN);
276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* search dictionaries */
278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.searchWord(WnnDictionary.SEARCH_PREFIX, WnnDictionary.ORDER_BY_FREQUENCY, mSearchKey);
279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 1;
280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#convert */
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int convert(ComposingText text) {
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearCandidates();
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#searchWords */
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int searchWords(String key) {
290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearCandidates();
291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#searchWords */
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int searchWords(WnnWord word) {
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearCandidates();
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#getNextCandidate */
301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public WnnWord getNextCandidate() {
302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mSearchKey == null) {
303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return null;
304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnWord word = getCandidate(mOutputNum);
306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (word != null) {
307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mOutputNum++;
308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return word;
310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#learn */
313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean learn(WnnWord word) {
314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ( mDictionary.learnWord(word) == 0 );
315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#addWord */
318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int addWord(WnnWord word) {
319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnDictionary dict = mDictionary;
320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.setInUseState( true );
321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.addWordToUserDictionary(word);
322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.setInUseState( false );
323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#deleteWord */
327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean deleteWord(WnnWord word) {
328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnDictionary dict = mDictionary;
329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.setInUseState( true );
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.removeWordFromUserDictionary(word);
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.setInUseState( false );
332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#setPreferences */
336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setPreferences(SharedPreferences pref) {}
337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#breakSequence */
339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void breakSequence()  {}
340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#makeCandidateListOf */
342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int makeCandidateListOf(int clausePosition)  {return 0;}
343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#initializeDictionary */
345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean initializeDictionary(int dictionary)  {
346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnDictionary dict = mDictionary;
347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch( dictionary ) {
349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case WnnEngine.DICTIONARY_TYPE_LEARN:
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.setInUseState( true );
351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.clearLearnDictionary();
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.setInUseState( false );
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case WnnEngine.DICTIONARY_TYPE_USER:
356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.setInUseState( true );
357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.clearUserDictionary();
358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.setInUseState( false );
359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
3637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
3647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see jp.co.omronsoft.openwnn.WnnEngine#initializeDictionary */
3657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    public boolean initializeDictionary(int dictionary, int type) {
3667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    	return initializeDictionary(dictionary);
3677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#getUserDictionaryWords */
370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public WnnWord[] getUserDictionaryWords( ) {
371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnDictionary dict = mDictionary;
372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.setInUseState( true );
373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnWord[] result = dict.getUserDictionaryWords( );
374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.setInUseState( false );
375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return result;
376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
379