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
17package com.android.inputmethod.latin;
18
19import com.android.inputmethod.keyboard.internal.KeySpecParser;
20import com.android.inputmethod.latin.common.Constants;
21import com.android.inputmethod.latin.common.StringUtils;
22
23import java.util.ArrayList;
24import java.util.Arrays;
25
26import 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 */
34public 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