Home | History | Annotate | Download | only in settings
      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.settings;
     18 
     19 import android.content.res.Resources;
     20 
     21 import com.android.inputmethod.annotations.UsedForTesting;
     22 import com.android.inputmethod.keyboard.internal.MoreKeySpec;
     23 import com.android.inputmethod.latin.Constants;
     24 import com.android.inputmethod.latin.PunctuationSuggestions;
     25 import com.android.inputmethod.latin.R;
     26 import com.android.inputmethod.latin.utils.StringUtils;
     27 
     28 import java.util.Arrays;
     29 import java.util.Locale;
     30 
     31 public final class SpacingAndPunctuations {
     32     private final int[] mSortedSymbolsPrecededBySpace;
     33     private final int[] mSortedSymbolsFollowedBySpace;
     34     private final int[] mSortedSymbolsClusteringTogether;
     35     private final int[] mSortedWordConnectors;
     36     public final int[] mSortedWordSeparators;
     37     public final PunctuationSuggestions mSuggestPuncList;
     38     private final int mSentenceSeparator;
     39     public final String mSentenceSeparatorAndSpace;
     40     public final boolean mCurrentLanguageHasSpaces;
     41     public final boolean mUsesAmericanTypography;
     42     public final boolean mUsesGermanRules;
     43 
     44     public SpacingAndPunctuations(final Resources res) {
     45         // To be able to binary search the code point. See {@link #isUsuallyPrecededBySpace(int)}.
     46         mSortedSymbolsPrecededBySpace = StringUtils.toSortedCodePointArray(
     47                 res.getString(R.string.symbols_preceded_by_space));
     48         // To be able to binary search the code point. See {@link #isUsuallyFollowedBySpace(int)}.
     49         mSortedSymbolsFollowedBySpace = StringUtils.toSortedCodePointArray(
     50                 res.getString(R.string.symbols_followed_by_space));
     51         mSortedSymbolsClusteringTogether = StringUtils.toSortedCodePointArray(
     52                 res.getString(R.string.symbols_clustering_together));
     53         // To be able to binary search the code point. See {@link #isWordConnector(int)}.
     54         mSortedWordConnectors = StringUtils.toSortedCodePointArray(
     55                 res.getString(R.string.symbols_word_connectors));
     56         mSortedWordSeparators = StringUtils.toSortedCodePointArray(
     57                 res.getString(R.string.symbols_word_separators));
     58         mSentenceSeparator = res.getInteger(R.integer.sentence_separator);
     59         mSentenceSeparatorAndSpace = new String(new int[] {
     60                 mSentenceSeparator, Constants.CODE_SPACE }, 0, 2);
     61         mCurrentLanguageHasSpaces = res.getBoolean(R.bool.current_language_has_spaces);
     62         final Locale locale = res.getConfiguration().locale;
     63         // Heuristic: we use American Typography rules because it's the most common rules for all
     64         // English variants. German rules (not "German typography") also have small gotchas.
     65         mUsesAmericanTypography = Locale.ENGLISH.getLanguage().equals(locale.getLanguage());
     66         mUsesGermanRules = Locale.GERMAN.getLanguage().equals(locale.getLanguage());
     67         final String[] suggestPuncsSpec = MoreKeySpec.splitKeySpecs(
     68                 res.getString(R.string.suggested_punctuations));
     69         mSuggestPuncList = PunctuationSuggestions.newPunctuationSuggestions(suggestPuncsSpec);
     70     }
     71 
     72     @UsedForTesting
     73     public SpacingAndPunctuations(final SpacingAndPunctuations model,
     74             final int[] overrideSortedWordSeparators) {
     75         mSortedSymbolsPrecededBySpace = model.mSortedSymbolsPrecededBySpace;
     76         mSortedSymbolsFollowedBySpace = model.mSortedSymbolsFollowedBySpace;
     77         mSortedSymbolsClusteringTogether = model.mSortedSymbolsClusteringTogether;
     78         mSortedWordConnectors = model.mSortedWordConnectors;
     79         mSortedWordSeparators = overrideSortedWordSeparators;
     80         mSuggestPuncList = model.mSuggestPuncList;
     81         mSentenceSeparator = model.mSentenceSeparator;
     82         mSentenceSeparatorAndSpace = model.mSentenceSeparatorAndSpace;
     83         mCurrentLanguageHasSpaces = model.mCurrentLanguageHasSpaces;
     84         mUsesAmericanTypography = model.mUsesAmericanTypography;
     85         mUsesGermanRules = model.mUsesGermanRules;
     86     }
     87 
     88     public boolean isWordSeparator(final int code) {
     89         return Arrays.binarySearch(mSortedWordSeparators, code) >= 0;
     90     }
     91 
     92     public boolean isWordConnector(final int code) {
     93         return Arrays.binarySearch(mSortedWordConnectors, code) >= 0;
     94     }
     95 
     96     public boolean isWordCodePoint(final int code) {
     97         return Character.isLetter(code) || isWordConnector(code);
     98     }
     99 
    100     public boolean isUsuallyPrecededBySpace(final int code) {
    101         return Arrays.binarySearch(mSortedSymbolsPrecededBySpace, code) >= 0;
    102     }
    103 
    104     public boolean isUsuallyFollowedBySpace(final int code) {
    105         return Arrays.binarySearch(mSortedSymbolsFollowedBySpace, code) >= 0;
    106     }
    107 
    108     public boolean isClusteringSymbol(final int code) {
    109         return Arrays.binarySearch(mSortedSymbolsClusteringTogether, code) >= 0;
    110     }
    111 
    112     public boolean isSentenceSeparator(final int code) {
    113         return code == mSentenceSeparator;
    114     }
    115 
    116     public String dump() {
    117         final StringBuilder sb = new StringBuilder();
    118         sb.append("mSortedSymbolsPrecededBySpace = ");
    119         sb.append("" + Arrays.toString(mSortedSymbolsPrecededBySpace));
    120         sb.append("\n   mSortedSymbolsFollowedBySpace = ");
    121         sb.append("" + Arrays.toString(mSortedSymbolsFollowedBySpace));
    122         sb.append("\n   mSortedWordConnectors = ");
    123         sb.append("" + Arrays.toString(mSortedWordConnectors));
    124         sb.append("\n   mSortedWordSeparators = ");
    125         sb.append("" + Arrays.toString(mSortedWordSeparators));
    126         sb.append("\n   mSuggestPuncList = ");
    127         sb.append("" + mSuggestPuncList);
    128         sb.append("\n   mSentenceSeparator = ");
    129         sb.append("" + mSentenceSeparator);
    130         sb.append("\n   mSentenceSeparatorAndSpace = ");
    131         sb.append("" + mSentenceSeparatorAndSpace);
    132         sb.append("\n   mCurrentLanguageHasSpaces = ");
    133         sb.append("" + mCurrentLanguageHasSpaces);
    134         sb.append("\n   mUsesAmericanTypography = ");
    135         sb.append("" + mUsesAmericanTypography);
    136         sb.append("\n   mUsesGermanRules = ");
    137         sb.append("" + mUsesGermanRules);
    138         return sb.toString();
    139     }
    140 }
    141