Home | History | Annotate | Download | only in latin
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of 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,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.inputmethod.latin;
     18 
     19 import com.android.inputmethod.keyboard.internal.KeySpecParser;
     20 import com.android.inputmethod.latin.common.Constants;
     21 import com.android.inputmethod.latin.common.StringUtils;
     22 
     23 import java.util.ArrayList;
     24 import java.util.Arrays;
     25 
     26 import javax.annotation.Nullable;
     27 
     28 /**
     29  * The extended {@link SuggestedWords} class to represent punctuation suggestions.
     30  *
     31  * Each punctuation specification string is the key specification that can be parsed by
     32  * {@link KeySpecParser}.
     33  */
     34 public final class PunctuationSuggestions extends SuggestedWords {
     35     private PunctuationSuggestions(final ArrayList<SuggestedWordInfo> punctuationsList) {
     36         super(punctuationsList,
     37                 null /* rawSuggestions */,
     38                 null /* typedWord */,
     39                 false /* typedWordValid */,
     40                 false /* hasAutoCorrectionCandidate */,
     41                 false /* isObsoleteSuggestions */,
     42                 INPUT_STYLE_NONE /* inputStyle */,
     43                 SuggestedWords.NOT_A_SEQUENCE_NUMBER);
     44     }
     45 
     46     /**
     47      * Create new instance of {@link PunctuationSuggestions} from the array of punctuation key
     48      * specifications.
     49      *
     50      * @param punctuationSpecs The array of punctuation key specifications.
     51      * @return The {@link PunctuationSuggestions} object.
     52      */
     53     public static PunctuationSuggestions newPunctuationSuggestions(
     54             @Nullable final String[] punctuationSpecs) {
     55         if (punctuationSpecs == null || punctuationSpecs.length == 0) {
     56             return new PunctuationSuggestions(new ArrayList<SuggestedWordInfo>(0));
     57         }
     58         final ArrayList<SuggestedWordInfo> punctuationList =
     59                 new ArrayList<>(punctuationSpecs.length);
     60         for (String spec : punctuationSpecs) {
     61             punctuationList.add(newHardCodedWordInfo(spec));
     62         }
     63         return new PunctuationSuggestions(punctuationList);
     64     }
     65 
     66     /**
     67      * {@inheritDoc}
     68      * Note that {@link SuggestedWords#getWord(int)} returns a punctuation key specification text.
     69      * The suggested punctuation should be gotten by parsing the key specification.
     70      */
     71     @Override
     72     public String getWord(final int index) {
     73         final String keySpec = super.getWord(index);
     74         final int code = KeySpecParser.getCode(keySpec);
     75         return (code == Constants.CODE_OUTPUT_TEXT)
     76                 ? KeySpecParser.getOutputText(keySpec)
     77                 : StringUtils.newSingleCodePointString(code);
     78     }
     79 
     80     /**
     81      * {@inheritDoc}
     82      * Note that {@link SuggestedWords#getWord(int)} returns a punctuation key specification text.
     83      * The displayed text should be gotten by parsing the key specification.
     84      */
     85     @Override
     86     public String getLabel(final int index) {
     87         final String keySpec = super.getWord(index);
     88         return KeySpecParser.getLabel(keySpec);
     89     }
     90 
     91     /**
     92      * {@inheritDoc}
     93      * Note that {@link #getWord(int)} returns a suggested punctuation. We should create a
     94      * {@link SuggestedWords.SuggestedWordInfo} object that represents a hard coded word.
     95      */
     96     @Override
     97     public SuggestedWordInfo getInfo(final int index) {
     98         return newHardCodedWordInfo(getWord(index));
     99     }
    100 
    101     /**
    102      * The predicator to tell whether this object represents punctuation suggestions.
    103      * @return true if this object represents punctuation suggestions.
    104      */
    105     @Override
    106     public boolean isPunctuationSuggestions() {
    107         return true;
    108     }
    109 
    110     @Override
    111     public String toString() {
    112         return "PunctuationSuggestions: "
    113                 + " words=" + Arrays.toString(mSuggestedWordInfoList.toArray());
    114     }
    115 
    116     private static SuggestedWordInfo newHardCodedWordInfo(final String keySpec) {
    117         return new SuggestedWordInfo(keySpec, "" /* prevWordsContext */,
    118                 SuggestedWordInfo.MAX_SCORE,
    119                 SuggestedWordInfo.KIND_HARDCODED,
    120                 Dictionary.DICTIONARY_HARDCODED,
    121                 SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */,
    122                 SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */);
    123     }
    124 }
    125