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