• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 
17 package com.android.inputmethod.latin;
18 
19 import android.content.Context;
20 import android.text.TextUtils;
21 
22 import com.android.inputmethod.keyboard.Key;
23 import com.android.inputmethod.keyboard.KeyDetector;
24 import com.android.inputmethod.keyboard.KeyboardId;
25 import com.android.inputmethod.keyboard.LatinKeyboard;
26 
27 import java.io.File;
28 import java.util.Locale;
29 
30 public class SuggestHelper {
31     protected final Suggest mSuggest;
32     protected final LatinKeyboard mKeyboard;
33     private final KeyDetector mKeyDetector;
34 
SuggestHelper(Context context, int dictionaryId, KeyboardId keyboardId)35     public SuggestHelper(Context context, int dictionaryId, KeyboardId keyboardId) {
36         // Use null as the locale for Suggest so as to force it to use the internal dictionary
37         // (and not try to find a dictionary provider for a specified locale)
38         mSuggest = new Suggest(context, dictionaryId, null);
39         mKeyboard = new LatinKeyboard.Builder(context).load(keyboardId).build();
40         mKeyDetector = new KeyDetector(0);
41         init();
42     }
43 
SuggestHelper(final Context context, final File dictionaryPath, final long startOffset, final long length, final KeyboardId keyboardId, final Locale locale)44     protected SuggestHelper(final Context context, final File dictionaryPath,
45             final long startOffset, final long length, final KeyboardId keyboardId,
46             final Locale locale) {
47         mSuggest = new Suggest(context, dictionaryPath, startOffset, length, null, locale);
48         mKeyboard = new LatinKeyboard.Builder(context).load(keyboardId).build();
49         mKeyDetector = new KeyDetector(0);
50         init();
51     }
52 
init()53     private void init() {
54         mSuggest.setCorrectionMode(Suggest.CORRECTION_FULL);
55         mKeyDetector.setKeyboard(mKeyboard, 0, 0);
56         mKeyDetector.setProximityCorrectionEnabled(true);
57         mKeyDetector.setProximityThreshold(mKeyboard.mMostCommonKeyWidth);
58     }
59 
setCorrectionMode(int correctionMode)60     public void setCorrectionMode(int correctionMode) {
61         mSuggest.setCorrectionMode(correctionMode);
62     }
63 
hasMainDictionary()64     public boolean hasMainDictionary() {
65         return mSuggest.hasMainDictionary();
66     }
67 
addKeyInfo(WordComposer word, char c)68     private void addKeyInfo(WordComposer word, char c) {
69         for (final Key key : mKeyboard.mKeys) {
70             if (key.mCode == c) {
71                 final int x = key.mX + key.mWidth / 2;
72                 final int y = key.mY + key.mHeight / 2;
73                 final int[] codes = mKeyDetector.newCodeArray();
74                 mKeyDetector.getKeyIndexAndNearbyCodes(x, y, codes);
75                 word.add(c, codes, x, y);
76                 return;
77             }
78         }
79         word.add(c, new int[] { c }, WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
80     }
81 
createWordComposer(CharSequence s)82     protected WordComposer createWordComposer(CharSequence s) {
83         WordComposer word = new WordComposer();
84         for (int i = 0; i < s.length(); i++) {
85             final char c = s.charAt(i);
86             addKeyInfo(word, c);
87         }
88         return word;
89     }
90 
isValidWord(CharSequence typed)91     public boolean isValidWord(CharSequence typed) {
92         return AutoCorrection.isValidWord(mSuggest.getUnigramDictionaries(),
93                 typed, false);
94     }
95 
96     // TODO: This may be slow, but is OK for test so far.
getSuggestions(CharSequence typed)97     public SuggestedWords getSuggestions(CharSequence typed) {
98         return mSuggest.getSuggestions(createWordComposer(typed), null,
99                 mKeyboard.getProximityInfo());
100     }
101 
getFirstSuggestion(CharSequence typed)102     public CharSequence getFirstSuggestion(CharSequence typed) {
103         WordComposer word = createWordComposer(typed);
104         SuggestedWords suggestions = mSuggest.getSuggestions(word, null,
105                 mKeyboard.getProximityInfo());
106         // Note that suggestions.getWord(0) is the word user typed.
107         return suggestions.size() > 1 ? suggestions.getWord(1) : null;
108     }
109 
getAutoCorrection(CharSequence typed)110     public CharSequence getAutoCorrection(CharSequence typed) {
111         WordComposer word = createWordComposer(typed);
112         SuggestedWords suggestions = mSuggest.getSuggestions(word, null,
113                 mKeyboard.getProximityInfo());
114         // Note that suggestions.getWord(0) is the word user typed.
115         return (suggestions.size() > 1 && mSuggest.hasAutoCorrection())
116                 ? suggestions.getWord(1) : null;
117     }
118 
getSuggestIndex(CharSequence typed, CharSequence expected)119     public int getSuggestIndex(CharSequence typed, CharSequence expected) {
120         WordComposer word = createWordComposer(typed);
121         SuggestedWords suggestions = mSuggest.getSuggestions(word, null,
122                 mKeyboard.getProximityInfo());
123         // Note that suggestions.getWord(0) is the word user typed.
124         for (int i = 1; i < suggestions.size(); i++) {
125             if (TextUtils.equals(suggestions.getWord(i), expected))
126                 return i;
127         }
128         return -1;
129     }
130 
getBigramSuggestions(CharSequence previous, CharSequence typed)131     private void getBigramSuggestions(CharSequence previous, CharSequence typed) {
132         if (!TextUtils.isEmpty(previous) && (typed.length() > 1)) {
133             WordComposer firstChar = createWordComposer(Character.toString(typed.charAt(0)));
134             mSuggest.getSuggestions(firstChar, previous, mKeyboard.getProximityInfo());
135         }
136     }
137 
getBigramFirstSuggestion(CharSequence previous, CharSequence typed)138     public CharSequence getBigramFirstSuggestion(CharSequence previous, CharSequence typed) {
139         WordComposer word = createWordComposer(typed);
140         getBigramSuggestions(previous, typed);
141         SuggestedWords suggestions = mSuggest.getSuggestions(word, previous,
142                 mKeyboard.getProximityInfo());
143         return suggestions.size() > 1 ? suggestions.getWord(1) : null;
144     }
145 
getBigramAutoCorrection(CharSequence previous, CharSequence typed)146     public CharSequence getBigramAutoCorrection(CharSequence previous, CharSequence typed) {
147         WordComposer word = createWordComposer(typed);
148         getBigramSuggestions(previous, typed);
149         SuggestedWords suggestions = mSuggest.getSuggestions(word, previous,
150                 mKeyboard.getProximityInfo());
151         return (suggestions.size() > 1 && mSuggest.hasAutoCorrection())
152                 ? suggestions.getWord(1) : null;
153     }
154 
searchBigramSuggestion(CharSequence previous, CharSequence typed, CharSequence expected)155     public int searchBigramSuggestion(CharSequence previous, CharSequence typed,
156             CharSequence expected) {
157         WordComposer word = createWordComposer(typed);
158         getBigramSuggestions(previous, typed);
159         SuggestedWords suggestions = mSuggest.getSuggestions(word, previous,
160                 mKeyboard.getProximityInfo());
161         for (int i = 1; i < suggestions.size(); i++) {
162             if (TextUtils.equals(suggestions.getWord(i), expected))
163                 return i;
164         }
165         return -1;
166     }
167 }
168