Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7660c6f authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Passing SpacingAndPunctuations to CapsModeUtils.getCapsMode"

parents c912b222 0a75cf51
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -301,7 +301,7 @@ public final class RichInputConnection {
        // This never calls InputConnection#getCapsMode - in fact, it's a static method that
        // never blocks or initiates IPC.
        return CapsModeUtils.getCapsMode(mCommittedTextBeforeComposingText, inputType,
                settingsValues, hasSpaceBefore);
                settingsValues.mSpacingAndPunctuations, hasSpaceBefore);
    }

    public int getCodePointBeforeCursor() {
+7 −7
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ import android.text.TextUtils;

import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.WordComposer;
import com.android.inputmethod.latin.settings.SettingsValues;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;

import java.util.Locale;

@@ -74,7 +74,7 @@ public final class CapsModeUtils {
     * @param reqModes The modes to be checked: may be any combination of
     * {@link TextUtils#CAP_MODE_CHARACTERS}, {@link TextUtils#CAP_MODE_WORDS}, and
     * {@link TextUtils#CAP_MODE_SENTENCES}.
     * @param settingsValues The current settings values.
     * @param spacingAndPunctuations The current spacing and punctuations settings.
     * @param hasSpaceBefore Whether we should consider there is a space inserted at the end of cs
     *
     * @return Returns the actual capitalization modes that can be in effect
@@ -83,7 +83,7 @@ public final class CapsModeUtils {
     * {@link TextUtils#CAP_MODE_SENTENCES}.
     */
    public static int getCapsMode(final CharSequence cs, final int reqModes,
            final SettingsValues settingsValues, final boolean hasSpaceBefore) {
            final SpacingAndPunctuations spacingAndPunctuations, final boolean hasSpaceBefore) {
        // Quick description of what we want to do:
        // CAP_MODE_CHARACTERS is always on.
        // CAP_MODE_WORDS is on if there is some whitespace before the cursor.
@@ -167,7 +167,7 @@ public final class CapsModeUtils {
        // No other language has such a rule as far as I know, instead putting inside the quotation
        // mark as the exact thing quoted and handling the surrounding punctuation independently,
        // e.g. <<Did he say, "let's go home"?>>
        if (settingsValues.mSpacingAndPunctuations.mUsesAmericanTypography) {
        if (spacingAndPunctuations.mUsesAmericanTypography) {
            for (; j > 0; j--) {
                // Here we look to go over any closing punctuation. This is because in dominant
                // variants of English, the final period is placed within double quotes and maybe
@@ -190,7 +190,7 @@ public final class CapsModeUtils {
        if (c == Constants.CODE_QUESTION_MARK || c == Constants.CODE_EXCLAMATION_MARK) {
            return (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_SENTENCES) & reqModes;
        }
        if (!settingsValues.mSpacingAndPunctuations.isSentenceSeparator(c) || j <= 0) {
        if (!spacingAndPunctuations.isSentenceSeparator(c) || j <= 0) {
            return (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_WORDS) & reqModes;
        }

@@ -240,7 +240,7 @@ public final class CapsModeUtils {
            case WORD:
                if (Character.isLetter(c)) {
                    state = WORD;
                } else if (settingsValues.mSpacingAndPunctuations.isSentenceSeparator(c)) {
                } else if (spacingAndPunctuations.isSentenceSeparator(c)) {
                    state = PERIOD;
                } else {
                    return caps;
@@ -256,7 +256,7 @@ public final class CapsModeUtils {
            case LETTER:
                if (Character.isLetter(c)) {
                    state = LETTER;
                } else if (settingsValues.mSpacingAndPunctuations.isSentenceSeparator(c)) {
                } else if (spacingAndPunctuations.isSentenceSeparator(c)) {
                    state = PERIOD;
                } else {
                    return noCaps;
+51 −43
Original line number Diff line number Diff line
@@ -16,75 +16,83 @@

package com.android.inputmethod.latin.utils;

import com.android.inputmethod.latin.settings.SettingsValues;

import android.content.res.Resources;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils;

import com.android.inputmethod.latin.settings.SpacingAndPunctuations;

import java.util.Locale;

@SmallTest
public class CapsModeUtilsTests extends AndroidTestCase {
    private static void onePathForCaps(final CharSequence cs, final int expectedResult,
            final int mask, final SettingsValues sv, final boolean hasSpaceBefore) {
        int oneTimeResult = expectedResult & mask;
            final int mask, final SpacingAndPunctuations sp, final boolean hasSpaceBefore) {
        final int oneTimeResult = expectedResult & mask;
        assertEquals("After >" + cs + "<", oneTimeResult,
                CapsModeUtils.getCapsMode(cs, mask, sv, hasSpaceBefore));
                CapsModeUtils.getCapsMode(cs, mask, sp, hasSpaceBefore));
    }

    private static void allPathsForCaps(final CharSequence cs, final int expectedResult,
            final SettingsValues sv, final boolean hasSpaceBefore) {
            final SpacingAndPunctuations sp, final boolean hasSpaceBefore) {
        final int c = TextUtils.CAP_MODE_CHARACTERS;
        final int w = TextUtils.CAP_MODE_WORDS;
        final int s = TextUtils.CAP_MODE_SENTENCES;
        onePathForCaps(cs, expectedResult, c | w | s, sv, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, w | s, sv, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, c | s, sv, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, c | w, sv, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, c, sv, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, w, sv, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, s, sv, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, c | w | s, sp, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, w | s, sp, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, c | s, sp, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, c | w, sp, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, c, sp, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, w, sp, hasSpaceBefore);
        onePathForCaps(cs, expectedResult, s, sp, hasSpaceBefore);
    }

    public void testGetCapsMode() {
        final int c = TextUtils.CAP_MODE_CHARACTERS;
        final int w = TextUtils.CAP_MODE_WORDS;
        final int s = TextUtils.CAP_MODE_SENTENCES;
        SettingsValues sv = SettingsValues.makeDummySettingsValuesForTest(Locale.ENGLISH);
        allPathsForCaps("", c | w | s, sv, false);
        allPathsForCaps("Word", c, sv, false);
        allPathsForCaps("Word.", c, sv, false);
        allPathsForCaps("Word ", c | w, sv, false);
        allPathsForCaps("Word. ", c | w | s, sv, false);
        allPathsForCaps("Word..", c, sv, false);
        allPathsForCaps("Word.. ", c | w | s, sv, false);
        allPathsForCaps("Word... ", c | w | s, sv, false);
        allPathsForCaps("Word ... ", c | w | s, sv, false);
        allPathsForCaps("Word . ", c | w, sv, false);
        allPathsForCaps("In the U.S ", c | w, sv, false);
        allPathsForCaps("In the U.S. ", c | w, sv, false);
        allPathsForCaps("Some stuff (e.g. ", c | w, sv, false);
        allPathsForCaps("In the U.S.. ", c | w | s, sv, false);
        allPathsForCaps("\"Word.\" ", c | w | s, sv, false);
        allPathsForCaps("\"Word\". ", c | w | s, sv, false);
        allPathsForCaps("\"Word\" ", c | w, sv, false);
        final RunInLocale<SpacingAndPunctuations> job = new RunInLocale<SpacingAndPunctuations>() {
            @Override
            protected SpacingAndPunctuations job(final Resources res) {
                return new SpacingAndPunctuations(res);
            }
        };
        final Resources res = getContext().getResources();
        SpacingAndPunctuations sp = job.runInLocale(res, Locale.ENGLISH);
        allPathsForCaps("", c | w | s, sp, false);
        allPathsForCaps("Word", c, sp, false);
        allPathsForCaps("Word.", c, sp, false);
        allPathsForCaps("Word ", c | w, sp, false);
        allPathsForCaps("Word. ", c | w | s, sp, false);
        allPathsForCaps("Word..", c, sp, false);
        allPathsForCaps("Word.. ", c | w | s, sp, false);
        allPathsForCaps("Word... ", c | w | s, sp, false);
        allPathsForCaps("Word ... ", c | w | s, sp, false);
        allPathsForCaps("Word . ", c | w, sp, false);
        allPathsForCaps("In the U.S ", c | w, sp, false);
        allPathsForCaps("In the U.S. ", c | w, sp, false);
        allPathsForCaps("Some stuff (e.g. ", c | w, sp, false);
        allPathsForCaps("In the U.S.. ", c | w | s, sp, false);
        allPathsForCaps("\"Word.\" ", c | w | s, sp, false);
        allPathsForCaps("\"Word\". ", c | w | s, sp, false);
        allPathsForCaps("\"Word\" ", c | w, sp, false);

        // Test for phantom space
        allPathsForCaps("Word", c | w, sv, true);
        allPathsForCaps("Word.", c | w | s, sv, true);
        allPathsForCaps("Word", c | w, sp, true);
        allPathsForCaps("Word.", c | w | s, sp, true);

        // Tests after some whitespace
        allPathsForCaps("Word\n", c | w | s, sv, false);
        allPathsForCaps("Word\n", c | w | s, sv, true);
        allPathsForCaps("Word\n ", c | w | s, sv, true);
        allPathsForCaps("Word.\n", c | w | s, sv, false);
        allPathsForCaps("Word.\n", c | w | s, sv, true);
        allPathsForCaps("Word.\n ", c | w | s, sv, true);
        allPathsForCaps("Word\n", c | w | s, sp, false);
        allPathsForCaps("Word\n", c | w | s, sp, true);
        allPathsForCaps("Word\n ", c | w | s, sp, true);
        allPathsForCaps("Word.\n", c | w | s, sp, false);
        allPathsForCaps("Word.\n", c | w | s, sp, true);
        allPathsForCaps("Word.\n ", c | w | s, sp, true);

        sv = SettingsValues.makeDummySettingsValuesForTest(Locale.FRENCH);
        allPathsForCaps("\"Word.\" ", c | w, sv, false);
        allPathsForCaps("\"Word\". ", c | w | s, sv, false);
        allPathsForCaps("\"Word\" ", c | w, sv, false);
        sp = job.runInLocale(res, Locale.FRENCH);
        allPathsForCaps("\"Word.\" ", c | w, sp, false);
        allPathsForCaps("\"Word\". ", c | w | s, sp, false);
        allPathsForCaps("\"Word\" ", c | w, sp, false);
    }
}