diff options
Diffstat (limited to 'java/src')
6 files changed, 86 insertions, 31 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index aaa55d79c..18b81161c 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -59,7 +59,7 @@ public class Key implements Comparable<Key> { /** Flags of the label */ private final int mLabelFlags; private static final int LABEL_FLAGS_ALIGN_ICON_TO_BOTTOM = 0x04; - private static final int LABEL_FLAGS_ALIGN_LEFT_OF_CENTER = 0x08; + private static final int LABEL_FLAGS_ALIGN_LABEL_OFF_CENTER = 0x08; // Font typeface specification. private static final int LABEL_FLAGS_FONT_MASK = 0x30; private static final int LABEL_FLAGS_FONT_NORMAL = 0x10; @@ -648,8 +648,8 @@ public class Key implements Comparable<Key> { return (mLabelFlags & LABEL_FLAGS_ALIGN_ICON_TO_BOTTOM) != 0; } - public final boolean isAlignLeftOfCenter() { - return (mLabelFlags & LABEL_FLAGS_ALIGN_LEFT_OF_CENTER) != 0; + public final boolean isAlignLabelOffCenter() { + return (mLabelFlags & LABEL_FLAGS_ALIGN_LABEL_OFF_CENTER) != 0; } public final boolean hasPopupHint() { diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index 4a791f325..72b254756 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -369,9 +369,9 @@ public class KeyboardView extends View { final float baseline = centerY + labelCharHeight / 2.0f; // Horizontal label text alignment - if (key.isAlignLeftOfCenter()) { - // TODO: Parameterise this? - positionX = centerX - labelCharWidth * 7.0f / 4.0f; + if (key.isAlignLabelOffCenter()) { + // The label is placed off center of the key. Used mainly on "phone number" layout. + positionX = centerX + params.mLabelOffCenterRatio * labelCharWidth; paint.setTextAlign(Align.LEFT); } else { positionX = centerX; @@ -418,15 +418,12 @@ public class KeyboardView extends View { blendAlpha(paint, params.mAnimAlpha); final float labelCharHeight = TypefaceUtils.getReferenceCharHeight(paint); final float labelCharWidth = TypefaceUtils.getReferenceCharWidth(paint); - final KeyVisualAttributes visualAttr = key.getVisualAttributes(); - final float adjustmentY = (visualAttr == null) ? 0.0f - : visualAttr.mHintLabelVerticalAdjustment * labelCharHeight; + final float adjustmentY = params.mHintLabelVerticalAdjustment * labelCharHeight; final float hintX, hintY; if (key.hasHintLabel()) { // The hint label is placed just right of the key label. Used mainly on // "phone number" layout. - // TODO: Generalize the following calculations. - hintX = positionX + labelCharWidth * 2.0f; + hintX = positionX + params.mHintLabelOffCenterRatio * labelCharWidth; hintY = centerY + labelCharHeight / 2.0f; paint.setTextAlign(Align.LEFT); } else if (key.hasShiftedLetterHint()) { diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyDrawParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyDrawParams.java index 07ac06bab..6dbee55ae 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyDrawParams.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyDrawParams.java @@ -42,6 +42,10 @@ public final class KeyDrawParams { public int mShiftedLetterHintActivatedColor; public int mPreviewTextColor; + public float mHintLabelVerticalAdjustment; + public float mLabelOffCenterRatio; + public float mHintLabelOffCenterRatio; + public int mAnimAlpha; public KeyDrawParams() {} @@ -68,6 +72,10 @@ public final class KeyDrawParams { mShiftedLetterHintActivatedColor = copyFrom.mShiftedLetterHintActivatedColor; mPreviewTextColor = copyFrom.mPreviewTextColor; + mHintLabelVerticalAdjustment = copyFrom.mHintLabelVerticalAdjustment; + mLabelOffCenterRatio = copyFrom.mLabelOffCenterRatio; + mHintLabelOffCenterRatio = copyFrom.mHintLabelOffCenterRatio; + mAnimAlpha = copyFrom.mAnimAlpha; } @@ -103,6 +111,13 @@ public final class KeyDrawParams { mShiftedLetterHintActivatedColor = selectColor( attr.mShiftedLetterHintActivatedColor, mShiftedLetterHintActivatedColor); mPreviewTextColor = selectColor(attr.mPreviewTextColor, mPreviewTextColor); + + mHintLabelVerticalAdjustment = selectFloatIfNonZero( + attr.mHintLabelVerticalAdjustment, mHintLabelVerticalAdjustment); + mLabelOffCenterRatio = selectFloatIfNonZero( + attr.mLabelOffCenterRatio, mLabelOffCenterRatio); + mHintLabelOffCenterRatio = selectFloatIfNonZero( + attr.mHintLabelOffCenterRatio, mHintLabelOffCenterRatio); } public KeyDrawParams mayCloneAndUpdateParams(final int keyHeight, @@ -115,7 +130,7 @@ public final class KeyDrawParams { return newParams; } - private static final int selectTextSizeFromDimensionOrRatio(final int keyHeight, + private static int selectTextSizeFromDimensionOrRatio(final int keyHeight, final int dimens, final float ratio, final int defaultDimens) { if (ResourceUtils.isValidDimensionPixelSize(dimens)) { return dimens; @@ -126,7 +141,7 @@ public final class KeyDrawParams { return defaultDimens; } - private static final int selectTextSize(final int keyHeight, final float ratio, + private static int selectTextSize(final int keyHeight, final float ratio, final int defaultSize) { if (ResourceUtils.isValidFraction(ratio)) { return (int)(keyHeight * ratio); @@ -134,10 +149,17 @@ public final class KeyDrawParams { return defaultSize; } - private static final int selectColor(final int attrColor, final int defaultColor) { + private static int selectColor(final int attrColor, final int defaultColor) { if (attrColor != 0) { return attrColor; } return defaultColor; } + + private static float selectFloatIfNonZero(final float attrFloat, final float defaultFloat) { + if (attrFloat != 0) { + return attrFloat; + } + return defaultFloat; + } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyVisualAttributes.java b/java/src/com/android/inputmethod/keyboard/internal/KeyVisualAttributes.java index 133462ac7..69cf2e389 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyVisualAttributes.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyVisualAttributes.java @@ -48,6 +48,8 @@ public final class KeyVisualAttributes { public final int mPreviewTextColor; public final float mHintLabelVerticalAdjustment; + public final float mLabelOffCenterRatio; + public final float mHintLabelOffCenterRatio; private static final int[] VISUAL_ATTRIBUTE_IDS = { R.styleable.Keyboard_Key_keyTypeface, @@ -69,6 +71,8 @@ public final class KeyVisualAttributes { R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor, R.styleable.Keyboard_Key_keyPreviewTextColor, R.styleable.Keyboard_Key_keyHintLabelVerticalAdjustment, + R.styleable.Keyboard_Key_keyLabelOffCenterRatio, + R.styleable.Keyboard_Key_keyHintLabelOffCenterRatio }; private static final SparseIntArray sVisualAttributeIds = new SparseIntArray(); private static final int ATTR_DEFINED = 1; @@ -135,5 +139,9 @@ public final class KeyVisualAttributes { mHintLabelVerticalAdjustment = ResourceUtils.getFraction(keyAttr, R.styleable.Keyboard_Key_keyHintLabelVerticalAdjustment, 0.0f); + mLabelOffCenterRatio = ResourceUtils.getFraction(keyAttr, + R.styleable.Keyboard_Key_keyLabelOffCenterRatio, 0.0f); + mHintLabelOffCenterRatio = ResourceUtils.getFraction(keyAttr, + R.styleable.Keyboard_Key_keyHintLabelOffCenterRatio, 0.0f); } } diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java index d6e6656ab..36a02669d 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java +++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java @@ -468,7 +468,9 @@ public class DictionaryFacilitator { // We don't add words with 0-frequency (assuming they would be profanity etc.). final boolean isValid = maxFreq > 0; UserHistoryDictionary.addToDictionary(userHistoryDictionary, prevWordsInfo, secondWord, - isValid, timeStampInSeconds, mDistracterFilter); + isValid, timeStampInSeconds, + new DistracterFilterCheckingIsInDictionary( + mDistracterFilter, userHistoryDictionary)); } private void removeWord(final String dictName, final String word) { diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java index 5808b9e4e..c11a220a4 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java @@ -38,6 +38,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -163,9 +164,31 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { } private void asyncExecuteTaskWithLock(final Lock lock, final Runnable task) { + asyncPreCheckAndExecuteTaskWithLock(lock, null /* preCheckTask */, task); + } + + private void asyncPreCheckAndExecuteTaskWithWriteLock( + final Callable<Boolean> preCheckTask, final Runnable task) { + asyncPreCheckAndExecuteTaskWithLock(mLock.writeLock(), preCheckTask, task); + + } + + // Execute task with lock when the result of preCheckTask is true or preCheckTask is null. + private void asyncPreCheckAndExecuteTaskWithLock(final Lock lock, + final Callable<Boolean> preCheckTask, final Runnable task) { ExecutorUtils.getExecutor(mDictName).execute(new Runnable() { @Override public void run() { + if (preCheckTask != null) { + try { + if (!preCheckTask.call().booleanValue()) { + return; + } + } catch (final Exception e) { + Log.e(TAG, "The pre check task throws an exception.", e); + return; + } + } lock.lock(); try { task.run(); @@ -278,22 +301,25 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { final boolean isBlacklisted, final int timestamp, final DistracterFilter distracterFilter) { reloadDictionaryIfRequired(); - asyncExecuteTaskWithWriteLock(new Runnable() { - @Override - public void run() { - if (mBinaryDictionary == null) { - return; - } - if (distracterFilter.isDistracterToWordsInDictionaries( - PrevWordsInfo.EMPTY_PREV_WORDS_INFO, word, mLocale)) { - // The word is a distracter. - return; - } - runGCIfRequiredLocked(true /* mindsBlockByGC */); - addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq, - isNotAWord, isBlacklisted, timestamp); - } - }); + asyncPreCheckAndExecuteTaskWithWriteLock( + new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return !distracterFilter.isDistracterToWordsInDictionaries( + PrevWordsInfo.EMPTY_PREV_WORDS_INFO, word, mLocale); + } + }, + new Runnable() { + @Override + public void run() { + if (mBinaryDictionary == null) { + return; + } + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq, + isNotAWord, isBlacklisted, timestamp); + } + }); } protected void addUnigramLocked(final String word, final int frequency, |