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