Passing SpacingAndPunctuations to CapsModeUtils.getCapsMode
Change-Id: I0b06e8cc75a403f7061864c5b7f3f6a2cacd60ebmain
parent
860c3b8e8c
commit
0a75cf51af
|
@ -35,7 +35,6 @@ import com.android.inputmethod.latin.utils.StringUtils;
|
||||||
import com.android.inputmethod.latin.utils.TextRange;
|
import com.android.inputmethod.latin.utils.TextRange;
|
||||||
import com.android.inputmethod.research.ResearchLogger;
|
import com.android.inputmethod.research.ResearchLogger;
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -302,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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue