From 00ed3be95cee472685bcba1ea861ac75c61db690 Mon Sep 17 00:00:00 2001
From: Jean Chalard <jchalard@google.com>
Date: Tue, 6 Mar 2012 14:00:34 +0900
Subject: [PATCH] Correct special space handling of punctuation

This fixes two defects:
- One where some separators should promote a phantom space to
a real space. This bug had a unit test but wasn't tracked.
- One where French punctuations would behave incorrectly. Tracked
Bug: 6113693

Change-Id: Ia7f86fc960e00141757632ab2c9bce9168dd6966
---
 java/res/values-fr/donottranslate.xml                    | 6 +++---
 java/res/values/donottranslate.xml                       | 2 +-
 java/src/com/android/inputmethod/latin/LatinIME.java     | 4 ++++
 .../com/android/inputmethod/latin/SettingsValues.java    | 9 ++++++++-
 4 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/java/res/values-fr/donottranslate.xml b/java/res/values-fr/donottranslate.xml
index 28140ab6a..8cf2516a6 100644
--- a/java/res/values-fr/donottranslate.xml
+++ b/java/res/values-fr/donottranslate.xml
@@ -19,11 +19,11 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Symbols that should be swapped with a magic space -->
-    <string name="magic_space_swapping_symbols">.,\")]}</string>
+    <string name="weak_space_swapping_symbols">.,\")]}</string>
     <!-- Symbols that should strip a magic space -->
-    <string name="magic_space_stripping_symbols">"&#x0009;&#x0020;\'\n-/_"</string>
+    <string name="weak_space_stripping_symbols">"&#x0009;&#x0020;\'\n-/_"</string>
     <!-- Symbols that should promote magic spaces into real space -->
-    <string name="magic_space_promoting_symbols">;:!?([*&amp;@{&lt;&gt;+=|</string>
+    <string name="phantom_space_promoting_symbols">;:!?([*&amp;@{&lt;&gt;+=|</string>
     <!-- Symbols that do NOT separate words -->
     <string name="symbols_excluded_from_word_separators">\'</string>
 </resources>
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index d6a15deb0..74c68464c 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -25,7 +25,7 @@
     <!-- Symbols that should strip a weak space -->
     <string name="weak_space_stripping_symbols">"&#x0009;&#x0020;\n/_\'-"</string>
     <!-- Symbols that should convert weak spaces into real space -->
-    <string name="weak_space_promoting_symbols">([*&amp;@{&lt;&gt;+=|</string>
+    <string name="phantom_space_promoting_symbols">([*&amp;@{&lt;&gt;+=|</string>
     <!-- Symbols that do NOT separate words -->
     <string name="symbols_excluded_from_word_separators">\'-</string>
     <!-- Word separator list is the union of all symbols except those that are not separators:
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 64b9f3364..742328256 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1610,6 +1610,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
         final boolean swapWeakSpace = maybeStripSpaceWhileInBatchEdit(ic, primaryCode, spaceState,
                 KeyboardActionListener.SUGGESTION_STRIP_COORDINATE == x);
 
+        if (SPACE_STATE_PHANTOM == spaceState &&
+                mSettingsValues.isPhantomSpacePromotingSymbol(primaryCode)) {
+            sendKeyCodePoint(Keyboard.CODE_SPACE);
+        }
         sendKeyCodePoint(primaryCode);
 
         if (Keyboard.CODE_SPACE == primaryCode) {
diff --git a/java/src/com/android/inputmethod/latin/SettingsValues.java b/java/src/com/android/inputmethod/latin/SettingsValues.java
index d123b608f..6d65a74c8 100644
--- a/java/src/com/android/inputmethod/latin/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/SettingsValues.java
@@ -37,6 +37,7 @@ public class SettingsValues {
     public final int mDelayUpdateOldSuggestions;
     public final String mWeakSpaceStrippers;
     public final String mWeakSpaceSwappers;
+    private final String mPhantomSpacePromotingSymbols;
     private final String mSuggestPuncs;
     public final SuggestedWords mSuggestPuncList;
     public final SuggestedWords mSuggestPuncOutputTextList;
@@ -91,6 +92,7 @@ public class SettingsValues {
         mDelayUpdateOldSuggestions = res.getInteger(R.integer.config_delay_update_old_suggestions);
         mWeakSpaceStrippers = res.getString(R.string.weak_space_stripping_symbols);
         mWeakSpaceSwappers = res.getString(R.string.weak_space_swapping_symbols);
+        mPhantomSpacePromotingSymbols = res.getString(R.string.phantom_space_promoting_symbols);
         if (LatinImeLogger.sDBG) {
             final int length = mWeakSpaceStrippers.length();
             for (int i = 0; i < length; i = mWeakSpaceStrippers.offsetByCodePoints(i, 1)) {
@@ -192,7 +194,7 @@ public class SettingsValues {
             final String weakSpaceSwappers, final String symbolsExcludedFromWordSeparators,
             final Resources res) {
         String wordSeparators = weakSpaceStrippers + weakSpaceSwappers
-                + res.getString(R.string.weak_space_promoting_symbols);
+                + res.getString(R.string.phantom_space_promoting_symbols);
         for (int i = symbolsExcludedFromWordSeparators.length() - 1; i >= 0; --i) {
             wordSeparators = wordSeparators.replace(
                     symbolsExcludedFromWordSeparators.substring(i, i + 1), "");
@@ -225,6 +227,11 @@ public class SettingsValues {
         return mWeakSpaceSwappers.contains(String.valueOf((char)code));
     }
 
+    public boolean isPhantomSpacePromotingSymbol(int code) {
+        // TODO: this does not work if the code does not fit in a char
+        return mPhantomSpacePromotingSymbols.contains(String.valueOf((char)code));
+    }
+
     private static boolean isAutoCorrectEnabled(final Resources resources,
             final String currentAutoCorrectionSetting) {
         final String autoCorrectionOff = resources.getString(