aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/res/values/donottranslate.xml2
-rw-r--r--java/res/xml-sw600dp/kbd_key_styles.xml15
-rw-r--r--java/res/xml-sw600dp/kbd_rows_symbols_shift.xml19
-rw-r--r--java/res/xml-sw768dp/kbd_key_styles.xml15
-rw-r--r--java/res/xml-sw768dp/kbd_rows_symbols_shift.xml19
-rw-r--r--java/res/xml/kbd_key_styles.xml23
-rw-r--r--java/res/xml/kbd_rows_symbols_shift.xml13
-rw-r--r--java/res/xml/kbd_symbols_shift_row4.xml8
-rw-r--r--java/src/com/android/inputmethod/keyboard/Key.java6
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java7
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java66
-rw-r--r--java/src/com/android/inputmethod/latin/StringBuilderPool.java16
-rw-r--r--java/src/com/android/inputmethod/latin/Suggest.java9
13 files changed, 39 insertions, 179 deletions
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index f55e9bf53..5cd995be9 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -35,7 +35,7 @@
<!-- Label for "switch to more symbol" modifier key. Must be short to fit on key! -->
<string name="label_to_more_symbol_key">= \\ &lt;</string>
<!-- Label for "switch to more symbol" modifier key on tablets. Must be short to fit on key! -->
- <string name="label_to_more_symbol_for_tablet_key">\\ ^ [ {</string>
+ <string name="label_to_more_symbol_for_tablet_key">~ \\ {</string>
<!-- Label for "Tab" key. Must be short to fit on key! -->
<string name="label_tab_key">Tab</string>
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
index 15a3d1df5..b93d3007f 100644
--- a/java/res/xml-sw600dp/kbd_key_styles.xml
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -118,19 +118,4 @@
latin:keyLabelOption="fontNormal|hasPopupHint"
latin:keyOutputText="@string/keylabel_for_popular_domain"
latin:popupCharacters="@string/alternates_for_popular_domain" />
- <switch>
- <case
- latin:passwordInput="true"
- >
- <key-style
- latin:styleName="nonPasswordSymbolKeyStyle"
- latin:enabled="false" />
- </case>
- <!-- latin:passwordInput="false" -->
- <default>
- <key-style
- latin:styleName="nonPasswordSymbolKeyStyle"
- latin:enabled="true" />
- </default>
- </switch>
</merge>
diff --git a/java/res/xml-sw600dp/kbd_rows_symbols_shift.xml b/java/res/xml-sw600dp/kbd_rows_symbols_shift.xml
index 2909acb6f..c5143d9c8 100644
--- a/java/res/xml-sw600dp/kbd_rows_symbols_shift.xml
+++ b/java/res/xml-sw600dp/kbd_rows_symbols_shift.xml
@@ -33,28 +33,21 @@
<Key
latin:keyLabel="|" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="•"
latin:popupCharacters="♪,♥,♠,♦,♣" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="√" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="π"
latin:popupCharacters="Π" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="÷" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="×" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="§"
latin:popupCharacters="¶" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="Δ" />
<Key
latin:keyStyle="deleteKeyStyle"
@@ -65,27 +58,21 @@
latin:keyWidth="9.0%p"
>
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="£"
latin:keyXPos="4.5%p" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¢" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="€" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¥" />
<Key
latin:keyLabel="^"
latin:popupCharacters="↑,↓,←,→" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="°"
latin:popupCharacters="′,″" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="±"
latin:popupCharacters="∞" />
<Key
@@ -106,26 +93,20 @@
<Key
latin:keyLabel="\\" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="©" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="®" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="™" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="℅" />
<Key
latin:keyLabel="[" />
<Key
latin:keyLabel="]" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¡" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¿" />
</Row>
<Row
diff --git a/java/res/xml-sw768dp/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml
index 1711c423f..7c74bb5ad 100644
--- a/java/res/xml-sw768dp/kbd_key_styles.xml
+++ b/java/res/xml-sw768dp/kbd_key_styles.xml
@@ -104,19 +104,4 @@
latin:keyLabelOption="fontNormal|hasPopupHint"
latin:keyOutputText="@string/keylabel_for_popular_domain"
latin:popupCharacters="@string/alternates_for_popular_domain" />
- <switch>
- <case
- latin:passwordInput="true"
- >
- <key-style
- latin:styleName="nonPasswordSymbolKeyStyle"
- latin:enabled="false" />
- </case>
- <!-- latin:passwordInput="false" -->
- <default>
- <key-style
- latin:styleName="nonPasswordSymbolKeyStyle"
- latin:enabled="true" />
- </default>
- </switch>
</merge>
diff --git a/java/res/xml-sw768dp/kbd_rows_symbols_shift.xml b/java/res/xml-sw768dp/kbd_rows_symbols_shift.xml
index 1f43a0f91..82bc4b26e 100644
--- a/java/res/xml-sw768dp/kbd_rows_symbols_shift.xml
+++ b/java/res/xml-sw768dp/kbd_rows_symbols_shift.xml
@@ -37,28 +37,21 @@
<Key
latin:keyLabel="|" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="•"
latin:popupCharacters="♪,♥,♠,♦,♣" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="√" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="π"
latin:popupCharacters="Π" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="÷" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="×" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="§"
latin:popupCharacters="¶" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="Δ" />
<Key
latin:keyStyle="deleteKeyStyle"
@@ -73,26 +66,20 @@
latin:keyLabelOption="alignLeft"
latin:keyWidth="11.172%p" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="£" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¢" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="€" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¥" />
<Key
latin:keyLabel="^"
latin:popupCharacters="↑,↓,←,→" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="°"
latin:popupCharacters="′,″" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="±"
latin:popupCharacters="∞" />
<Key
@@ -113,26 +100,20 @@
<Key
latin:keyLabel="\\" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="©" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="®" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="™" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="℅" />
<Key
latin:keyLabel="[" />
<Key
latin:keyLabel="]" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¡" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¿" />
<Key
latin:keyStyle="backFromMoreSymbolKeyStyle"
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
index 5612251a5..48468987e 100644
--- a/java/res/xml/kbd_key_styles.xml
+++ b/java/res/xml/kbd_key_styles.xml
@@ -215,29 +215,6 @@
latin:code="@integer/key_shift"
latin:keyLabel="@string/label_to_symbol_key"
latin:parentStyle="functionalKeyStyle" />
- <switch>
- <case
- latin:passwordInput="true"
- >
- <key-style
- latin:styleName="nonPasswordSymbolKeyStyle"
- latin:enabled="false" />
- <key-style
- latin:styleName="nonPasswordFunctionalKeyStyle"
- latin:enabled="false"
- latin:parentStyle="functionalKeyStyle" />
- </case>
- <!-- latin:passwordInput="false" -->
- <default>
- <key-style
- latin:styleName="nonPasswordSymbolKeyStyle"
- latin:enabled="true" />
- <key-style
- latin:styleName="nonPasswordFunctionalKeyStyle"
- latin:enabled="true"
- latin:parentStyle="functionalKeyStyle" />
- </default>
- </switch>
<key-style
latin:styleName="punctuationKeyStyle"
latin:keyLabel="."
diff --git a/java/res/xml/kbd_rows_symbols_shift.xml b/java/res/xml/kbd_rows_symbols_shift.xml
index d52341512..ff272f1b0 100644
--- a/java/res/xml/kbd_rows_symbols_shift.xml
+++ b/java/res/xml/kbd_rows_symbols_shift.xml
@@ -33,21 +33,16 @@
<Key
latin:keyLabel="|" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="•"
latin:popupCharacters="♪,♥,♠,♦,♣" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="√" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="π"
latin:popupCharacters="Π" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="÷" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="×" />
<Key
latin:keyLabel="{" />
@@ -61,16 +56,12 @@
<Key
latin:keyStyle="nonSpecialBackgroundTabKeyStyle" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="£" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¢" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="€" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="°"
latin:popupCharacters="′,″" />
<Key
@@ -95,16 +86,12 @@
latin:keyWidth="15%p"
latin:visualInsetsRight="1%p" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="™" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="®" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="©" />
<Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¶"
latin:popupCharacters="§" />
<Key
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
index 9cb453fbc..bcab19b06 100644
--- a/java/res/xml/kbd_symbols_shift_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -35,13 +35,13 @@
<Key
latin:keyLabel="„"
latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛"
- latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+ latin:keyStyle="functionalKeyStyle" />
<Key
latin:keyStyle="spaceKeyStyle"
latin:keyWidth="50%p" />
<Key
latin:keyLabel="…"
- latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+ latin:keyStyle="functionalKeyStyle" />
<Key
latin:keyStyle="returnKeyStyle"
latin:keyWidth="fillRight" />
@@ -57,14 +57,14 @@
latin:keyLabel="„"
latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛"
latin:keyWidth="9.2%p"
- latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+ latin:keyStyle="functionalKeyStyle" />
<Key
latin:keyStyle="spaceKeyStyle"
latin:keyWidth="35.83%p" />
<Key
latin:keyLabel="…"
latin:keyWidth="9.2%p"
- latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+ latin:keyStyle="functionalKeyStyle" />
<Key
latin:keyStyle="returnKeyStyle"
latin:keyWidth="fillRight" />
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 397b7b16b..f56b52388 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -295,12 +295,8 @@ public class Key {
mY = y;
mWidth = keyWidth - mHorizontalGap;
- CharSequence[] popupCharacters = style.getTextArray(
+ final CharSequence[] popupCharacters = style.getTextArray(
keyAttr, R.styleable.Keyboard_Key_popupCharacters);
- if (params.mId.mPasswordInput) {
- popupCharacters = PopupCharactersParser.filterOut(
- res, popupCharacters, PopupCharactersParser.NON_ASCII_FILTER);
- }
// In Arabic symbol layouts, we'd like to keep digits in popup characters regardless of
// config_digit_popup_characters_enabled.
if (params.mId.isAlphabetKeyboard() && !res.getBoolean(
diff --git a/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
index 032489e66..7c5abe32a 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
@@ -196,13 +196,6 @@ public class PopupCharactersParser {
}
};
- public static final CodeFilter NON_ASCII_FILTER = new CodeFilter() {
- @Override
- public boolean shouldFilterOut(int code) {
- return code < 0x20 || code > 0x7e;
- }
- };
-
public static CharSequence[] filterOut(Resources res, CharSequence[] popupCharacters,
CodeFilter filter) {
if (popupCharacters == null || popupCharacters.length < 1) {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index e72b43ae9..48bcd3b92 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -113,7 +113,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Key events coming any faster than this are long-presses.
private static final int QUICK_PRESS = 200;
- private static final int SCREEN_ORIENTATION_CHANGE_DETECTION_DELAY = 2;
+ private static final int START_INPUT_VIEW_DELAY_WHEN_SCREEN_ORIENTATION_STARTED = 10;
private static final int ACCUMULATE_START_INPUT_VIEW_DELAY = 20;
private static final int RESTORE_KEYBOARD_STATE_DELAY = 500;
@@ -198,8 +198,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Member variables for remembering the current device orientation.
private int mDisplayOrientation;
- private int mDisplayWidth;
- private int mDisplayHeight;
// Object for reacting to adding/removing a dictionary pack.
private BroadcastReceiver mDictionaryPackInstallReceiver =
@@ -219,31 +217,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5;
private static final int MSG_SPACE_TYPED = 6;
private static final int MSG_SET_BIGRAM_PREDICTIONS = 7;
- private static final int MSG_CONFIRM_ORIENTATION_CHANGE = 8;
+ private static final int MSG_START_ORIENTATION_CHANGE = 8;
private static final int MSG_START_INPUT_VIEW = 9;
private static final int MSG_RESTORE_KEYBOARD_LAYOUT = 10;
- private static class OrientationChangeArgs {
- public final int mOldWidth;
- public final int mOldHeight;
- private int mRetryCount;
-
- public OrientationChangeArgs(int oldw, int oldh) {
- mOldWidth = oldw;
- mOldHeight = oldh;
- mRetryCount = 0;
- }
-
- public boolean hasTimedOut() {
- mRetryCount++;
- return mRetryCount >= 10;
- }
-
- public boolean hasOrientationChangeFinished(DisplayMetrics dm) {
- return dm.widthPixels != mOldWidth && dm.heightPixels != mOldHeight;
- }
- }
-
public UIHandler(LatinIME outerInstance) {
super(outerInstance);
}
@@ -291,18 +268,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
(LatinKeyboard)msg.obj);
}
break;
- case MSG_CONFIRM_ORIENTATION_CHANGE: {
- final OrientationChangeArgs args = (OrientationChangeArgs)msg.obj;
- final Resources res = latinIme.mResources;
- final DisplayMetrics dm = res.getDisplayMetrics();
- if (args.hasTimedOut() || args.hasOrientationChangeFinished(dm)) {
- latinIme.setDisplayGeometry(res.getConfiguration(), dm);
- } else {
- // It seems orientation changing is on going.
- postConfirmOrientationChange(args);
- }
- break;
- }
case MSG_START_INPUT_VIEW:
latinIme.onStartInputView((EditorInfo)msg.obj, false);
break;
@@ -411,22 +376,16 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
- private void postConfirmOrientationChange(OrientationChangeArgs args) {
- removeMessages(MSG_CONFIRM_ORIENTATION_CHANGE);
- // Will confirm whether orientation change has finished or not again.
- sendMessageDelayed(obtainMessage(MSG_CONFIRM_ORIENTATION_CHANGE, args),
- SCREEN_ORIENTATION_CHANGE_DETECTION_DELAY);
- }
-
- public void startOrientationChanging(int oldw, int oldh) {
- postConfirmOrientationChange(new OrientationChangeArgs(oldw, oldh));
+ public void startOrientationChanging() {
+ sendMessageDelayed(obtainMessage(MSG_START_ORIENTATION_CHANGE),
+ START_INPUT_VIEW_DELAY_WHEN_SCREEN_ORIENTATION_STARTED);
final LatinIME latinIme = getOuterInstance();
latinIme.mKeyboardSwitcher.getKeyboardState().save();
postRestoreKeyboardLayout();
}
public boolean postStartInputView(EditorInfo attribute) {
- if (hasMessages(MSG_CONFIRM_ORIENTATION_CHANGE) || hasMessages(MSG_START_INPUT_VIEW)) {
+ if (hasMessages(MSG_START_ORIENTATION_CHANGE) || hasMessages(MSG_START_INPUT_VIEW)) {
removeMessages(MSG_START_INPUT_VIEW);
// Postpone onStartInputView by ACCUMULATE_START_INPUT_VIEW_DELAY and see if
// orientation change has finished.
@@ -438,12 +397,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
- private void setDisplayGeometry(Configuration conf, DisplayMetrics metric) {
- mDisplayOrientation = conf.orientation;
- mDisplayWidth = metric.widthPixels;
- mDisplayHeight = metric.heightPixels;
- }
-
@Override
public void onCreate() {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
@@ -481,7 +434,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
- setDisplayGeometry(res.getConfiguration(), res.getDisplayMetrics());
+ mDisplayOrientation = res.getConfiguration().orientation;
// Register to receive ringer mode change and network state change.
// Also receive installation and removal of a dictionary pack.
@@ -609,8 +562,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void onConfigurationChanged(Configuration conf) {
mSubtypeSwitcher.onConfigurationChanged(conf);
// If orientation changed while predicting, commit the change
- if (conf.orientation != mDisplayOrientation) {
- mHandler.startOrientationChanging(mDisplayWidth, mDisplayHeight);
+ if (mDisplayOrientation != conf.orientation) {
+ mDisplayOrientation = conf.orientation;
+ mHandler.startOrientationChanging();
final InputConnection ic = getCurrentInputConnection();
commitTyped(ic);
if (ic != null) ic.finishComposingText(); // For voice input
diff --git a/java/src/com/android/inputmethod/latin/StringBuilderPool.java b/java/src/com/android/inputmethod/latin/StringBuilderPool.java
index 66f123731..a663ed43e 100644
--- a/java/src/com/android/inputmethod/latin/StringBuilderPool.java
+++ b/java/src/com/android/inputmethod/latin/StringBuilderPool.java
@@ -26,12 +26,20 @@ import java.util.List;
public class StringBuilderPool {
// Singleton
private static final StringBuilderPool sInstance = new StringBuilderPool();
+ private static final boolean DEBUG = false;
private StringBuilderPool() {}
- // TODO: Make this a normal array with a size of 20
+ // TODO: Make this a normal array with a size of 20, or a ConcurrentQueue
private final List<StringBuilder> mPool =
Collections.synchronizedList(new ArrayList<StringBuilder>());
public static StringBuilder getStringBuilder(final int initialSize) {
+ // TODO: although the pool is synchronized, the following is not thread-safe.
+ // Two threads entering this at the same time could take the same size of the pool and the
+ // second to attempt removing this index from the pool would crash with an
+ // IndexOutOfBoundsException.
+ // At the moment this pool is only used in Suggest.java and only in one thread so it's
+ // okay. The simplest thing to do here is probably to replace the ArrayList with a
+ // ConcurrentQueue.
final int poolSize = sInstance.mPool.size();
final StringBuilder sb = poolSize > 0 ? (StringBuilder) sInstance.mPool.remove(poolSize - 1)
: new StringBuilder(initialSize);
@@ -40,6 +48,12 @@ public class StringBuilderPool {
}
public static void recycle(final StringBuilder garbage) {
+ if (DEBUG) {
+ final int gid = garbage.hashCode();
+ for (final StringBuilder q : sInstance.mPool) {
+ if (gid == q.hashCode()) throw new RuntimeException("Duplicate id " + gid);
+ }
+ }
sInstance.mPool.add(garbage);
}
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index e3cb6987a..29b629576 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -284,7 +284,14 @@ public class Suggest implements Dictionary.WordCallback {
}
protected void addBigramToSuggestions(CharSequence bigram) {
- mSuggestions.add(bigram);
+ // TODO: Try to be a little more shrewd with resource allocation.
+ // At the moment we copy this object because the StringBuilders are pooled (see
+ // StringBuilderPool.java) and when we are finished using mSuggestions and
+ // mBigramSuggestions we will take everything from both and insert them back in the
+ // pool, so we can't allow the same object to be in both lists at the same time.
+ final StringBuilder sb = StringBuilderPool.getStringBuilder(getApproxMaxWordLength());
+ sb.append(bigram);
+ mSuggestions.add(sb);
}
// TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder