1a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka/* 2a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * Copyright (C) 2014 The Android Open Source Project 3a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * 4a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 5a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * you may not use this file except in compliance with the License. 6a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * You may obtain a copy of the License at 7a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * 8a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 9a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * 10a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 11a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 12a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * See the License for the specific language governing permissions and 14a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * limitations under the License. 15a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka */ 16a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 17a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaokapackage com.android.inputmethod.latin; 18a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 19a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaokaimport com.android.inputmethod.keyboard.internal.KeySpecParser; 209342484e8d573a40f470b6a593df31c602fa4076Ken Wakasaimport com.android.inputmethod.latin.common.Constants; 214beeb9253a06482299e0c67467531d30436a02fcJean Chalardimport com.android.inputmethod.latin.common.StringUtils; 22a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 23a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaokaimport java.util.ArrayList; 24a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaokaimport java.util.Arrays; 25a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 26303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovicimport javax.annotation.Nullable; 27303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic 28a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka/** 29a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * The extended {@link SuggestedWords} class to represent punctuation suggestions. 30a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * 31a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * Each punctuation specification string is the key specification that can be parsed by 32a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * {@link KeySpecParser}. 33a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka */ 34a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaokapublic final class PunctuationSuggestions extends SuggestedWords { 35a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka private PunctuationSuggestions(final ArrayList<SuggestedWordInfo> punctuationsList) { 36a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka super(punctuationsList, 37a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka null /* rawSuggestions */, 3883f9524b8796d94fad56280f6b26c9045fea313fJean Chalard null /* typedWord */, 39a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka false /* typedWordValid */, 40a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka false /* hasAutoCorrectionCandidate */, 41a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka false /* isObsoleteSuggestions */, 4283f9524b8796d94fad56280f6b26c9045fea313fJean Chalard INPUT_STYLE_NONE /* inputStyle */, 4383f9524b8796d94fad56280f6b26c9045fea313fJean Chalard SuggestedWords.NOT_A_SEQUENCE_NUMBER); 44a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 45a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 46a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka /** 47a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * Create new instance of {@link PunctuationSuggestions} from the array of punctuation key 48a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * specifications. 49a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * 50a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * @param punctuationSpecs The array of punctuation key specifications. 51a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * @return The {@link PunctuationSuggestions} object. 52a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka */ 53a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka public static PunctuationSuggestions newPunctuationSuggestions( 54303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic @Nullable final String[] punctuationSpecs) { 55303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic if (punctuationSpecs == null || punctuationSpecs.length == 0) { 56303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic return new PunctuationSuggestions(new ArrayList<SuggestedWordInfo>(0)); 57303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic } 58303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic final ArrayList<SuggestedWordInfo> punctuationList = 59303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic new ArrayList<>(punctuationSpecs.length); 60303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic for (String spec : punctuationSpecs) { 61303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic punctuationList.add(newHardCodedWordInfo(spec)); 62a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 63303a2ae5c90300caaf87571e28cb4ffdcd816ce3Dan Zivkovic return new PunctuationSuggestions(punctuationList); 64a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 65a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 66a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka /** 67a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * {@inheritDoc} 68d3a4c5132422b189c8dbb94dbbe84a9b9761b0a8Tadashi G. Takaoka * Note that {@link SuggestedWords#getWord(int)} returns a punctuation key specification text. 69a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * The suggested punctuation should be gotten by parsing the key specification. 70a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka */ 71a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka @Override 72a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka public String getWord(final int index) { 73a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka final String keySpec = super.getWord(index); 74a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka final int code = KeySpecParser.getCode(keySpec); 75a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka return (code == Constants.CODE_OUTPUT_TEXT) 76a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka ? KeySpecParser.getOutputText(keySpec) 77a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka : StringUtils.newSingleCodePointString(code); 78a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 79a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 80a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka /** 81a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * {@inheritDoc} 82d3a4c5132422b189c8dbb94dbbe84a9b9761b0a8Tadashi G. Takaoka * Note that {@link SuggestedWords#getWord(int)} returns a punctuation key specification text. 83a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * The displayed text should be gotten by parsing the key specification. 84a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka */ 85a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka @Override 86a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka public String getLabel(final int index) { 87a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka final String keySpec = super.getWord(index); 88a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka return KeySpecParser.getLabel(keySpec); 89a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 90a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 91a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka /** 92a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * {@inheritDoc} 93a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * Note that {@link #getWord(int)} returns a suggested punctuation. We should create a 94d3a4c5132422b189c8dbb94dbbe84a9b9761b0a8Tadashi G. Takaoka * {@link SuggestedWords.SuggestedWordInfo} object that represents a hard coded word. 95a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka */ 96a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka @Override 97a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka public SuggestedWordInfo getInfo(final int index) { 98a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka return newHardCodedWordInfo(getWord(index)); 99a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 100a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 101a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka /** 102a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * The predicator to tell whether this object represents punctuation suggestions. 103a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka * @return true if this object represents punctuation suggestions. 104a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka */ 105a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka @Override 106a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka public boolean isPunctuationSuggestions() { 107a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka return true; 108a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 109a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 110a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka @Override 111a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka public String toString() { 112a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka return "PunctuationSuggestions: " 113a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka + " words=" + Arrays.toString(mSuggestedWordInfoList.toArray()); 114a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 115a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka 116a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka private static SuggestedWordInfo newHardCodedWordInfo(final String keySpec) { 117ab5912959435c1901e268bc9766090e604f3523dMohammadinamul Sheik return new SuggestedWordInfo(keySpec, "" /* prevWordsContext */, 118ab5912959435c1901e268bc9766090e604f3523dMohammadinamul Sheik SuggestedWordInfo.MAX_SCORE, 119a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka SuggestedWordInfo.KIND_HARDCODED, 120a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka Dictionary.DICTIONARY_HARDCODED, 121a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, 122a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */); 123a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka } 124a273319c59ad24070ee5b35d72f044df496faa02Tadashi G. Takaoka} 125