Merge "Passing SpacingAndPunctuations to CapsModeUtils.getCapsMode"

main
Tadashi G. Takaoka 2014-01-09 09:31:31 +00:00 committed by Android (Google) Code Review
commit d7660c6f56
3 changed files with 59 additions and 51 deletions

View File

@ -301,7 +301,7 @@ public final class RichInputConnection {
// This never calls InputConnection#getCapsMode - in fact, it's a static method that // This never calls InputConnection#getCapsMode - in fact, it's a static method that
// never blocks or initiates IPC. // never blocks or initiates IPC.
return CapsModeUtils.getCapsMode(mCommittedTextBeforeComposingText, inputType, return CapsModeUtils.getCapsMode(mCommittedTextBeforeComposingText, inputType,
settingsValues, hasSpaceBefore); settingsValues.mSpacingAndPunctuations, hasSpaceBefore);
} }
public int getCodePointBeforeCursor() { public int getCodePointBeforeCursor() {

View File

@ -21,7 +21,7 @@ import android.text.TextUtils;
import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.WordComposer; import com.android.inputmethod.latin.WordComposer;
import com.android.inputmethod.latin.settings.SettingsValues; import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import java.util.Locale; import java.util.Locale;
@ -74,7 +74,7 @@ public final class CapsModeUtils {
* @param reqModes The modes to be checked: may be any combination of * @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_CHARACTERS}, {@link TextUtils#CAP_MODE_WORDS}, and
* {@link TextUtils#CAP_MODE_SENTENCES}. * {@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 * @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 * @return Returns the actual capitalization modes that can be in effect
@ -83,7 +83,7 @@ public final class CapsModeUtils {
* {@link TextUtils#CAP_MODE_SENTENCES}. * {@link TextUtils#CAP_MODE_SENTENCES}.
*/ */
public static int getCapsMode(final CharSequence cs, final int reqModes, 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: // Quick description of what we want to do:
// CAP_MODE_CHARACTERS is always on. // CAP_MODE_CHARACTERS is always on.
// CAP_MODE_WORDS is on if there is some whitespace before the cursor. // 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 // 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, // mark as the exact thing quoted and handling the surrounding punctuation independently,
// e.g. <<Did he say, "let's go home"?>> // e.g. <<Did he say, "let's go home"?>>
if (settingsValues.mSpacingAndPunctuations.mUsesAmericanTypography) { if (spacingAndPunctuations.mUsesAmericanTypography) {
for (; j > 0; j--) { for (; j > 0; j--) {
// Here we look to go over any closing punctuation. This is because in dominant // 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 // 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) { if (c == Constants.CODE_QUESTION_MARK || c == Constants.CODE_EXCLAMATION_MARK) {
return (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_SENTENCES) & reqModes; 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; return (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_WORDS) & reqModes;
} }
@ -240,7 +240,7 @@ public final class CapsModeUtils {
case WORD: case WORD:
if (Character.isLetter(c)) { if (Character.isLetter(c)) {
state = WORD; state = WORD;
} else if (settingsValues.mSpacingAndPunctuations.isSentenceSeparator(c)) { } else if (spacingAndPunctuations.isSentenceSeparator(c)) {
state = PERIOD; state = PERIOD;
} else { } else {
return caps; return caps;
@ -256,7 +256,7 @@ public final class CapsModeUtils {
case LETTER: case LETTER:
if (Character.isLetter(c)) { if (Character.isLetter(c)) {
state = LETTER; state = LETTER;
} else if (settingsValues.mSpacingAndPunctuations.isSentenceSeparator(c)) { } else if (spacingAndPunctuations.isSentenceSeparator(c)) {
state = PERIOD; state = PERIOD;
} else { } else {
return noCaps; return noCaps;

View File

@ -16,75 +16,83 @@
package com.android.inputmethod.latin.utils; 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.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils; import android.text.TextUtils;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import java.util.Locale; import java.util.Locale;
@SmallTest @SmallTest
public class CapsModeUtilsTests extends AndroidTestCase { public class CapsModeUtilsTests extends AndroidTestCase {
private static void onePathForCaps(final CharSequence cs, final int expectedResult, private static void onePathForCaps(final CharSequence cs, final int expectedResult,
final int mask, final SettingsValues sv, final boolean hasSpaceBefore) { final int mask, final SpacingAndPunctuations sp, final boolean hasSpaceBefore) {
int oneTimeResult = expectedResult & mask; final int oneTimeResult = expectedResult & mask;
assertEquals("After >" + cs + "<", oneTimeResult, 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, 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 c = TextUtils.CAP_MODE_CHARACTERS;
final int w = TextUtils.CAP_MODE_WORDS; final int w = TextUtils.CAP_MODE_WORDS;
final int s = TextUtils.CAP_MODE_SENTENCES; final int s = TextUtils.CAP_MODE_SENTENCES;
onePathForCaps(cs, expectedResult, c | w | s, sv, hasSpaceBefore); onePathForCaps(cs, expectedResult, c | w | s, sp, hasSpaceBefore);
onePathForCaps(cs, expectedResult, w | s, sv, hasSpaceBefore); onePathForCaps(cs, expectedResult, w | s, sp, hasSpaceBefore);
onePathForCaps(cs, expectedResult, c | s, sv, hasSpaceBefore); onePathForCaps(cs, expectedResult, c | s, sp, hasSpaceBefore);
onePathForCaps(cs, expectedResult, c | w, sv, hasSpaceBefore); onePathForCaps(cs, expectedResult, c | w, sp, hasSpaceBefore);
onePathForCaps(cs, expectedResult, c, sv, hasSpaceBefore); onePathForCaps(cs, expectedResult, c, sp, hasSpaceBefore);
onePathForCaps(cs, expectedResult, w, sv, hasSpaceBefore); onePathForCaps(cs, expectedResult, w, sp, hasSpaceBefore);
onePathForCaps(cs, expectedResult, s, sv, hasSpaceBefore); onePathForCaps(cs, expectedResult, s, sp, hasSpaceBefore);
} }
public void testGetCapsMode() { public void testGetCapsMode() {
final int c = TextUtils.CAP_MODE_CHARACTERS; final int c = TextUtils.CAP_MODE_CHARACTERS;
final int w = TextUtils.CAP_MODE_WORDS; final int w = TextUtils.CAP_MODE_WORDS;
final int s = TextUtils.CAP_MODE_SENTENCES; final int s = TextUtils.CAP_MODE_SENTENCES;
SettingsValues sv = SettingsValues.makeDummySettingsValuesForTest(Locale.ENGLISH); final RunInLocale<SpacingAndPunctuations> job = new RunInLocale<SpacingAndPunctuations>() {
allPathsForCaps("", c | w | s, sv, false); @Override
allPathsForCaps("Word", c, sv, false); protected SpacingAndPunctuations job(final Resources res) {
allPathsForCaps("Word.", c, sv, false); return new SpacingAndPunctuations(res);
allPathsForCaps("Word ", c | w, sv, false); }
allPathsForCaps("Word. ", c | w | s, sv, false); };
allPathsForCaps("Word..", c, sv, false); final Resources res = getContext().getResources();
allPathsForCaps("Word.. ", c | w | s, sv, false); SpacingAndPunctuations sp = job.runInLocale(res, Locale.ENGLISH);
allPathsForCaps("Word... ", c | w | s, sv, false); allPathsForCaps("", c | w | s, sp, false);
allPathsForCaps("Word ... ", c | w | s, sv, false); allPathsForCaps("Word", c, sp, false);
allPathsForCaps("Word . ", c | w, sv, false); allPathsForCaps("Word.", c, sp, false);
allPathsForCaps("In the U.S ", c | w, sv, false); allPathsForCaps("Word ", c | w, sp, false);
allPathsForCaps("In the U.S. ", c | w, sv, false); allPathsForCaps("Word. ", c | w | s, sp, false);
allPathsForCaps("Some stuff (e.g. ", c | w, sv, false); allPathsForCaps("Word..", c, sp, false);
allPathsForCaps("In the U.S.. ", c | w | s, sv, false); allPathsForCaps("Word.. ", c | w | s, sp, false);
allPathsForCaps("\"Word.\" ", c | w | s, sv, false); allPathsForCaps("Word... ", c | w | s, sp, false);
allPathsForCaps("\"Word\". ", c | w | s, sv, false); allPathsForCaps("Word ... ", c | w | s, sp, false);
allPathsForCaps("\"Word\" ", c | w, sv, 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 // Test for phantom space
allPathsForCaps("Word", c | w, sv, true); allPathsForCaps("Word", c | w, sp, true);
allPathsForCaps("Word.", c | w | s, sv, true); allPathsForCaps("Word.", c | w | s, sp, true);
// Tests after some whitespace // Tests after some whitespace
allPathsForCaps("Word\n", c | w | s, sv, false); allPathsForCaps("Word\n", c | w | s, sp, false);
allPathsForCaps("Word\n", c | w | s, sv, true); allPathsForCaps("Word\n", c | w | s, sp, true);
allPathsForCaps("Word\n ", c | w | s, sv, true); allPathsForCaps("Word\n ", c | w | s, sp, true);
allPathsForCaps("Word.\n", c | w | s, sv, false); allPathsForCaps("Word.\n", c | w | s, sp, false);
allPathsForCaps("Word.\n", c | w | s, sv, true); allPathsForCaps("Word.\n", c | w | s, sp, true);
allPathsForCaps("Word.\n ", c | w | s, sv, true); allPathsForCaps("Word.\n ", c | w | s, sp, true);
sv = SettingsValues.makeDummySettingsValuesForTest(Locale.FRENCH); sp = job.runInLocale(res, Locale.FRENCH);
allPathsForCaps("\"Word.\" ", c | w, sv, false); allPathsForCaps("\"Word.\" ", c | w, sp, false);
allPathsForCaps("\"Word\". ", c | w | s, sv, false); allPathsForCaps("\"Word\". ", c | w | s, sp, false);
allPathsForCaps("\"Word\" ", c | w, sv, false); allPathsForCaps("\"Word\" ", c | w, sp, false);
} }
} }