Merge remote-tracking branch 'goog/master' into mergescriptpackage
commit
6779985ba2
|
@ -19,9 +19,10 @@
|
||||||
-->
|
-->
|
||||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
<!-- Symbols that should be swapped with a magic space -->
|
<!-- Symbols that should be swapped with a magic space -->
|
||||||
<string name="weak_space_swapping_symbols">.,\")]}</string>
|
<string name="weak_space_swapping_symbols">.,)]}</string>
|
||||||
<!-- Symbols that should strip a magic space -->
|
<!-- Symbols that should strip a magic space -->
|
||||||
<string name="weak_space_stripping_symbols">"	 \'\n-/_"</string>
|
<!-- Don't remove the enclosing double quotes, they protect whitespace (not just U+0020) -->
|
||||||
|
<string name="weak_space_stripping_symbols">"	 \n"\'-/_\"</string>
|
||||||
<!-- Symbols that should promote magic spaces into real space -->
|
<!-- Symbols that should promote magic spaces into real space -->
|
||||||
<string name="phantom_space_promoting_symbols">;:!?([*&@{<>+=|</string>
|
<string name="phantom_space_promoting_symbols">;:!?([*&@{<>+=|</string>
|
||||||
<!-- Symbols that do NOT separate words -->
|
<!-- Symbols that do NOT separate words -->
|
||||||
|
|
|
@ -21,9 +21,10 @@
|
||||||
<!-- Symbols that are suggested between words -->
|
<!-- Symbols that are suggested between words -->
|
||||||
<string name="suggested_punctuations">!,?,\\,,:,;,\",(,),\',-,/,@,_</string>
|
<string name="suggested_punctuations">!,?,\\,,:,;,\",(,),\',-,/,@,_</string>
|
||||||
<!-- Symbols that should be swapped with a weak space -->
|
<!-- Symbols that should be swapped with a weak space -->
|
||||||
<string name="weak_space_swapping_symbols">.,;:!?)]}\"</string>
|
<string name="weak_space_swapping_symbols">.,;:!?)]}</string>
|
||||||
<!-- Symbols that should strip a weak space -->
|
<!-- Symbols that should strip a weak space -->
|
||||||
<string name="weak_space_stripping_symbols">"	 \n/_\'-"@</string>
|
<!-- Don't remove the enclosing double quotes, they protect whitespace (not just U+0020) -->
|
||||||
|
<string name="weak_space_stripping_symbols">"	 \n"/_\'-@\"</string>
|
||||||
<!-- Symbols that should convert weak spaces into real space -->
|
<!-- Symbols that should convert weak spaces into real space -->
|
||||||
<string name="phantom_space_promoting_symbols">([*&{<>+=|</string>
|
<string name="phantom_space_promoting_symbols">([*&{<>+=|</string>
|
||||||
<!-- Symbols that do NOT separate words -->
|
<!-- Symbols that do NOT separate words -->
|
||||||
|
|
|
@ -29,6 +29,7 @@ public final class InputAttributes {
|
||||||
final public boolean mInputTypeNoAutoCorrect;
|
final public boolean mInputTypeNoAutoCorrect;
|
||||||
final public boolean mIsSettingsSuggestionStripOn;
|
final public boolean mIsSettingsSuggestionStripOn;
|
||||||
final public boolean mApplicationSpecifiedCompletionOn;
|
final public boolean mApplicationSpecifiedCompletionOn;
|
||||||
|
final public boolean mShouldInsertSpacesAutomatically;
|
||||||
final private int mInputType;
|
final private int mInputType;
|
||||||
|
|
||||||
public InputAttributes(final EditorInfo editorInfo, final boolean isFullscreenMode) {
|
public InputAttributes(final EditorInfo editorInfo, final boolean isFullscreenMode) {
|
||||||
|
@ -54,6 +55,7 @@ public final class InputAttributes {
|
||||||
mIsSettingsSuggestionStripOn = false;
|
mIsSettingsSuggestionStripOn = false;
|
||||||
mInputTypeNoAutoCorrect = false;
|
mInputTypeNoAutoCorrect = false;
|
||||||
mApplicationSpecifiedCompletionOn = false;
|
mApplicationSpecifiedCompletionOn = false;
|
||||||
|
mShouldInsertSpacesAutomatically = false;
|
||||||
} else {
|
} else {
|
||||||
final int variation = inputType & InputType.TYPE_MASK_VARIATION;
|
final int variation = inputType & InputType.TYPE_MASK_VARIATION;
|
||||||
final boolean flagNoSuggestions =
|
final boolean flagNoSuggestions =
|
||||||
|
@ -65,6 +67,7 @@ public final class InputAttributes {
|
||||||
final boolean flagAutoComplete =
|
final boolean flagAutoComplete =
|
||||||
0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
|
0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
|
||||||
|
|
||||||
|
// TODO: Have a helper method in InputTypeUtils
|
||||||
// Make sure that passwords are not displayed in {@link SuggestionStripView}.
|
// Make sure that passwords are not displayed in {@link SuggestionStripView}.
|
||||||
if (InputTypeUtils.isPasswordInputType(inputType)
|
if (InputTypeUtils.isPasswordInputType(inputType)
|
||||||
|| InputTypeUtils.isVisiblePasswordInputType(inputType)
|
|| InputTypeUtils.isVisiblePasswordInputType(inputType)
|
||||||
|
@ -78,6 +81,8 @@ public final class InputAttributes {
|
||||||
mIsSettingsSuggestionStripOn = true;
|
mIsSettingsSuggestionStripOn = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mShouldInsertSpacesAutomatically = InputTypeUtils.isAutoSpaceFriendlyType(inputType);
|
||||||
|
|
||||||
// If it's a browser edit field and auto correct is not ON explicitly, then
|
// If it's a browser edit field and auto correct is not ON explicitly, then
|
||||||
// disable auto correction, but keep suggestions on.
|
// disable auto correction, but keep suggestions on.
|
||||||
// If NO_SUGGESTIONS is set, don't do prediction.
|
// If NO_SUGGESTIONS is set, don't do prediction.
|
||||||
|
|
|
@ -29,31 +29,37 @@ public final class InputTypeUtils implements InputType {
|
||||||
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD;
|
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD;
|
||||||
private static final int TEXT_VISIBLE_PASSWORD_INPUT_TYPE =
|
private static final int TEXT_VISIBLE_PASSWORD_INPUT_TYPE =
|
||||||
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
|
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
|
||||||
|
private static final int[] SUPPRESSING_AUTO_SPACES_FIELD_VARIATION = {
|
||||||
|
InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
|
||||||
|
InputType.TYPE_TEXT_VARIATION_PASSWORD,
|
||||||
|
InputType.TYPE_TEXT_VARIATION_URI,
|
||||||
|
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
|
||||||
|
InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD };
|
||||||
|
|
||||||
private InputTypeUtils() {
|
private InputTypeUtils() {
|
||||||
// This utility class is not publicly instantiable.
|
// This utility class is not publicly instantiable.
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isWebEditTextInputType(int inputType) {
|
private static boolean isWebEditTextInputType(final int inputType) {
|
||||||
return inputType == (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_EDIT_TEXT);
|
return inputType == (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_EDIT_TEXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isWebPasswordInputType(int inputType) {
|
private static boolean isWebPasswordInputType(final int inputType) {
|
||||||
return WEB_TEXT_PASSWORD_INPUT_TYPE != 0
|
return WEB_TEXT_PASSWORD_INPUT_TYPE != 0
|
||||||
&& inputType == WEB_TEXT_PASSWORD_INPUT_TYPE;
|
&& inputType == WEB_TEXT_PASSWORD_INPUT_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isWebEmailAddressInputType(int inputType) {
|
private static boolean isWebEmailAddressInputType(final int inputType) {
|
||||||
return WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE != 0
|
return WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE != 0
|
||||||
&& inputType == WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE;
|
&& inputType == WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isNumberPasswordInputType(int inputType) {
|
private static boolean isNumberPasswordInputType(final int inputType) {
|
||||||
return NUMBER_PASSWORD_INPUT_TYPE != 0
|
return NUMBER_PASSWORD_INPUT_TYPE != 0
|
||||||
&& inputType == NUMBER_PASSWORD_INPUT_TYPE;
|
&& inputType == NUMBER_PASSWORD_INPUT_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isTextPasswordInputType(int inputType) {
|
private static boolean isTextPasswordInputType(final int inputType) {
|
||||||
return inputType == TEXT_PASSWORD_INPUT_TYPE;
|
return inputType == TEXT_PASSWORD_INPUT_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,12 +67,12 @@ public final class InputTypeUtils implements InputType {
|
||||||
return variation == TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS;
|
return variation == TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isEmailVariation(int variation) {
|
public static boolean isEmailVariation(final int variation) {
|
||||||
return variation == TYPE_TEXT_VARIATION_EMAIL_ADDRESS
|
return variation == TYPE_TEXT_VARIATION_EMAIL_ADDRESS
|
||||||
|| isWebEmailAddressVariation(variation);
|
|| isWebEmailAddressVariation(variation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isWebInputType(int inputType) {
|
public static boolean isWebInputType(final int inputType) {
|
||||||
final int maskedInputType =
|
final int maskedInputType =
|
||||||
inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
|
inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
|
||||||
return isWebEditTextInputType(maskedInputType) || isWebPasswordInputType(maskedInputType)
|
return isWebEditTextInputType(maskedInputType) || isWebPasswordInputType(maskedInputType)
|
||||||
|
@ -74,7 +80,7 @@ public final class InputTypeUtils implements InputType {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please refer to TextView.isPasswordInputType
|
// Please refer to TextView.isPasswordInputType
|
||||||
public static boolean isPasswordInputType(int inputType) {
|
public static boolean isPasswordInputType(final int inputType) {
|
||||||
final int maskedInputType =
|
final int maskedInputType =
|
||||||
inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
|
inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
|
||||||
return isTextPasswordInputType(maskedInputType) || isWebPasswordInputType(maskedInputType)
|
return isTextPasswordInputType(maskedInputType) || isWebPasswordInputType(maskedInputType)
|
||||||
|
@ -82,9 +88,18 @@ public final class InputTypeUtils implements InputType {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please refer to TextView.isVisiblePasswordInputType
|
// Please refer to TextView.isVisiblePasswordInputType
|
||||||
public static boolean isVisiblePasswordInputType(int inputType) {
|
public static boolean isVisiblePasswordInputType(final int inputType) {
|
||||||
final int maskedInputType =
|
final int maskedInputType =
|
||||||
inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
|
inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
|
||||||
return maskedInputType == TEXT_VISIBLE_PASSWORD_INPUT_TYPE;
|
return maskedInputType == TEXT_VISIBLE_PASSWORD_INPUT_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isAutoSpaceFriendlyType(final int inputType) {
|
||||||
|
if (TYPE_CLASS_TEXT != (TYPE_MASK_CLASS & inputType)) return false;
|
||||||
|
final int variation = TYPE_MASK_VARIATION & inputType;
|
||||||
|
for (final int fieldVariation : SUPPRESSING_AUTO_SPACES_FIELD_VARIATION) {
|
||||||
|
if (variation == fieldVariation) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2252,8 +2252,10 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
|
||||||
|
|
||||||
// This essentially inserts a space, and that's it.
|
// This essentially inserts a space, and that's it.
|
||||||
public void promotePhantomSpace() {
|
public void promotePhantomSpace() {
|
||||||
|
if (mCurrentSettings.shouldInsertSpacesAutomatically()) {
|
||||||
sendKeyCodePoint(Constants.CODE_SPACE);
|
sendKeyCodePoint(Constants.CODE_SPACE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Used by the RingCharBuffer
|
// Used by the RingCharBuffer
|
||||||
public boolean isWordSeparator(final int code) {
|
public boolean isWordSeparator(final int code) {
|
||||||
|
|
|
@ -271,6 +271,10 @@ public final class SettingsValues {
|
||||||
return mPhantomSpacePromotingSymbols.contains(String.valueOf((char)code));
|
return mPhantomSpacePromotingSymbols.contains(String.valueOf((char)code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean shouldInsertSpacesAutomatically() {
|
||||||
|
return mInputAttributes.mShouldInsertSpacesAutomatically;
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean isAutoCorrectEnabled(final Resources res,
|
private static boolean isAutoCorrectEnabled(final Resources res,
|
||||||
final String currentAutoCorrectionSetting) {
|
final String currentAutoCorrectionSetting) {
|
||||||
final String autoCorrectionOff = res.getString(
|
final String autoCorrectionOff = res.getString(
|
||||||
|
|
|
@ -243,6 +243,12 @@ static inline void prof_out(void) {
|
||||||
#ifndef S_INT_MAX
|
#ifndef S_INT_MAX
|
||||||
#define S_INT_MAX 2147483647 // ((1 << 31) - 1)
|
#define S_INT_MAX 2147483647 // ((1 << 31) - 1)
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef S_INT_MIN
|
||||||
|
// The literal constant -2147483648 does not work in C prior C90, because
|
||||||
|
// the compiler tries to fit the positive number into an int and then negate it.
|
||||||
|
// GCC warns about this.
|
||||||
|
#define S_INT_MIN (-2147483647 - 1) // -(1 << 31)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Define this to use mmap() for dictionary loading. Undefine to use malloc() instead of mmap().
|
// Define this to use mmap() for dictionary loading. Undefine to use malloc() instead of mmap().
|
||||||
// We measured and compared performance of both, and found mmap() is fairly good in terms of
|
// We measured and compared performance of both, and found mmap() is fairly good in terms of
|
||||||
|
|
|
@ -104,4 +104,20 @@ public class BlueUnderlineTests extends InputTestsBase {
|
||||||
final SpanGetter span = new SpanGetter(mTextView.getText(), SuggestionSpan.class);
|
final SpanGetter span = new SpanGetter(mTextView.getText(), SuggestionSpan.class);
|
||||||
assertNull("blue underline removed when cursor is moved", span.mSpan);
|
assertNull("blue underline removed when cursor is moved", span.mSpan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testComposingStopsOnSpace() {
|
||||||
|
final String STRING_TO_TYPE = "this ";
|
||||||
|
type(STRING_TO_TYPE);
|
||||||
|
sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
|
||||||
|
// Simulate the onUpdateSelection() event
|
||||||
|
mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
|
||||||
|
runMessages();
|
||||||
|
// Here the blue underline has been set. testBlueUnderline() is testing for this already,
|
||||||
|
// so let's not test it here again.
|
||||||
|
// Now simulate the user moving the cursor.
|
||||||
|
SpanGetter span = new SpanGetter(mTextView.getText(), UnderlineSpan.class);
|
||||||
|
assertNull("should not be composing, so should not have an underline span", span.mSpan);
|
||||||
|
span = new SpanGetter(mTextView.getText(), SuggestionSpan.class);
|
||||||
|
assertNull("should not be composing, so should not have an underline span", span.mSpan);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue