Loading java/src/com/android/inputmethod/keyboard/Key.java +2 −2 Original line number Diff line number Diff line Loading @@ -101,7 +101,7 @@ public class Key { /** Text to output when pressed. This can be multiple characters, like ".com" */ public final CharSequence mOutputText; /** More keys */ public final CharSequence[] mMoreKeys; public final String[] mMoreKeys; /** More keys maximum column number */ public final int mMaxMoreKeysColumn; Loading Loading @@ -255,7 +255,7 @@ public class Key { // Update row to have current x coordinate. row.setXPos(keyXPos + keyWidth); final CharSequence[] moreKeys = style.getTextArray(keyAttr, final String[] moreKeys = style.getTextArray(keyAttr, R.styleable.Keyboard_Key_moreKeys); // In Arabic symbol layouts, we'd like to keep digits in more keys regardless of // config_digit_more_keys_enabled. Loading java/src/com/android/inputmethod/keyboard/MiniKeyboard.java +6 −8 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ public class MiniKeyboard extends Keyboard { } public static class Builder extends Keyboard.Builder<Builder.MiniKeyboardParams> { private final CharSequence[] mMoreKeys; private final String[] mMoreKeys; public static class MiniKeyboardParams extends Keyboard.Params { /* package */int mTopRowAdjustment; Loading Loading @@ -230,16 +230,14 @@ public class MiniKeyboard extends Keyboard { parentKey.mX + (mParams.mDefaultKeyWidth - width) / 2, view.getMeasuredWidth()); } private static int getMaxKeyWidth(KeyboardView view, CharSequence[] moreKeys, int minKeyWidth) { private static int getMaxKeyWidth(KeyboardView view, String[] moreKeys, int minKeyWidth) { final int padding = (int) view.getContext().getResources() .getDimension(R.dimen.mini_keyboard_key_horizontal_padding); Paint paint = null; int maxWidth = minKeyWidth; for (CharSequence moreKeySpec : moreKeys) { final CharSequence label = MoreKeySpecParser.getLabel(moreKeySpec.toString()); // If the label is single letter, minKeyWidth is enough to hold // the label. for (String moreKeySpec : moreKeys) { final String label = MoreKeySpecParser.getLabel(moreKeySpec); // If the label is single letter, minKeyWidth is enough to hold the label. if (label != null && label.length() > 1) { if (paint == null) { paint = new Paint(); Loading @@ -258,7 +256,7 @@ public class MiniKeyboard extends Keyboard { public MiniKeyboard build() { final MiniKeyboardParams params = mParams; for (int n = 0; n < mMoreKeys.length; n++) { final String moreKeySpec = mMoreKeys[n].toString(); final String moreKeySpec = mMoreKeys[n]; final int row = n / params.mNumColumns; final Key key = new Key(mResources, params, moreKeySpec, params.getX(n, row), params.getY(row), params.mDefaultKeyWidth, params.mDefaultRowHeight); Loading java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java +53 −49 Original line number Diff line number Diff line Loading @@ -37,20 +37,22 @@ public class KeyStyles { new HashMap<String, DeclaredKeyStyle>(); private static final KeyStyle EMPTY_KEY_STYLE = new EmptyKeyStyle(); private static final char ESCAPE_CHAR = '\\'; public interface KeyStyle { public CharSequence[] getTextArray(TypedArray a, int index); public String[] getTextArray(TypedArray a, int index); public CharSequence getText(TypedArray a, int index); public int getInt(TypedArray a, int index, int defaultValue); public int getFlag(TypedArray a, int index, int defaultValue); } /* package */ static class EmptyKeyStyle implements KeyStyle { private static class EmptyKeyStyle implements KeyStyle { EmptyKeyStyle() { // Nothing to do. } @Override public CharSequence[] getTextArray(TypedArray a, int index) { public String[] getTextArray(TypedArray a, int index) { return parseTextArray(a, index); } Loading @@ -69,33 +71,36 @@ public class KeyStyles { return a.getInt(index, defaultValue); } protected static CharSequence[] parseTextArray(TypedArray a, int index) { protected static String[] parseTextArray(TypedArray a, int index) { if (!a.hasValue(index)) return null; final CharSequence text = a.getText(index); return parseCsvText(text); return parseCsvText(text.toString()); } } /* package */ static CharSequence[] parseCsvText(CharSequence text) { /* package for test */ static String[] parseCsvText(String text) { final int size = text.length(); if (size == 0) return null; if (size == 1) return new CharSequence[] { text }; if (size == 1) return new String[] { text }; final StringBuilder sb = new StringBuilder(); ArrayList<CharSequence> list = null; ArrayList<String> list = null; int start = 0; for (int pos = 0; pos < size; pos++) { final char c = text.charAt(pos); if (c == ',') { if (list == null) list = new ArrayList<CharSequence>(); if (list == null) list = new ArrayList<String>(); if (sb.length() == 0) { list.add(text.subSequence(start, pos)); list.add(text.substring(start, pos)); } else { list.add(sb.toString()); sb.setLength(0); } start = pos + 1; continue; } else if (c == '\\') { } else if (c == ESCAPE_CHAR) { if (start == pos) { // Skip escape character at the beginning of the value. start++; Loading @@ -112,21 +117,20 @@ public class KeyStyles { } } if (list == null) { return new CharSequence[] { sb.length() > 0 ? sb : text.subSequence(start, size) }; return new String[] { sb.length() > 0 ? sb.toString() : text.substring(start) }; } else { list.add(sb.length() > 0 ? sb : text.subSequence(start, size)); return list.toArray(new CharSequence[list.size()]); } list.add(sb.length() > 0 ? sb.toString() : text.substring(start)); return list.toArray(new String[list.size()]); } } /* package */ static class DeclaredKeyStyle extends EmptyKeyStyle { private static class DeclaredKeyStyle extends EmptyKeyStyle { private final HashMap<Integer, Object> mAttributes = new HashMap<Integer, Object>(); @Override public CharSequence[] getTextArray(TypedArray a, int index) { public String[] getTextArray(TypedArray a, int index) { return a.hasValue(index) ? super.getTextArray(a, index) : (CharSequence[])mAttributes.get(index); ? super.getTextArray(a, index) : (String[])mAttributes.get(index); } @Override Loading java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java +12 −14 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ import java.util.ArrayList; public class MoreKeySpecParser { private static final String TAG = MoreKeySpecParser.class.getSimpleName(); private static final char ESCAPE = '\\'; private static final char ESCAPE_CHAR = '\\'; private static final String LABEL_END = "|"; private static final String PREFIX_AT = "@"; private static final String PREFIX_ICON = PREFIX_AT + "icon/"; Loading Loading @@ -71,14 +71,14 @@ public class MoreKeySpecParser { } private static String parseEscape(String text) { if (text.indexOf(ESCAPE) < 0) { if (text.indexOf(ESCAPE_CHAR) < 0) { return text; } final int length = text.length(); final StringBuilder sb = new StringBuilder(); for (int pos = 0; pos < length; pos++) { final char c = text.charAt(pos); if (c == ESCAPE && pos + 1 < length) { if (c == ESCAPE_CHAR && pos + 1 < length) { sb.append(text.charAt(++pos)); } else { sb.append(c); Loading @@ -88,7 +88,7 @@ public class MoreKeySpecParser { } private static int indexOfLabelEnd(String moreKeySpec, int start) { if (moreKeySpec.indexOf(ESCAPE, start) < 0) { if (moreKeySpec.indexOf(ESCAPE_CHAR, start) < 0) { final int end = moreKeySpec.indexOf(LABEL_END, start); if (end == 0) { throw new MoreKeySpecParserError(LABEL_END + " at " + start + ": " + moreKeySpec); Loading @@ -98,7 +98,7 @@ public class MoreKeySpecParser { final int length = moreKeySpec.length(); for (int pos = start; pos < length; pos++) { final char c = moreKeySpec.charAt(pos); if (c == ESCAPE && pos + 1 < length) { if (c == ESCAPE_CHAR && pos + 1 < length) { pos++; } else if (moreKeySpec.startsWith(LABEL_END, pos)) { return pos; Loading Loading @@ -207,21 +207,19 @@ public class MoreKeySpecParser { } }; public static CharSequence[] filterOut(Resources res, CharSequence[] moreKeys, CodeFilter filter) { public static String[] filterOut(Resources res, String[] moreKeys, CodeFilter filter) { if (moreKeys == null || moreKeys.length < 1) { return null; } if (moreKeys.length == 1 && filter.shouldFilterOut(getCode(res, moreKeys[0].toString()))) { if (moreKeys.length == 1 && filter.shouldFilterOut(getCode(res, moreKeys[0]))) { return null; } ArrayList<CharSequence> filtered = null; ArrayList<String> filtered = null; for (int i = 0; i < moreKeys.length; i++) { final CharSequence moreKeySpec = moreKeys[i]; if (filter.shouldFilterOut(getCode(res, moreKeySpec.toString()))) { final String moreKeySpec = moreKeys[i]; if (filter.shouldFilterOut(getCode(res, moreKeySpec))) { if (filtered == null) { filtered = new ArrayList<CharSequence>(); filtered = new ArrayList<String>(); for (int j = 0; j < i; j++) { filtered.add(moreKeys[j]); } Loading @@ -236,6 +234,6 @@ public class MoreKeySpecParser { if (filtered.size() == 0) { return null; } return filtered.toArray(new CharSequence[filtered.size()]); return filtered.toArray(new String[filtered.size()]); } } tests/src/com/android/inputmethod/keyboard/internal/KeyStylesTests.java +2 −5 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.inputmethod.keyboard.internal; import com.android.inputmethod.keyboard.internal.KeyStyles.EmptyKeyStyle; import android.test.AndroidTestCase; import android.text.TextUtils; Loading @@ -26,9 +24,8 @@ public class KeyStylesTests extends AndroidTestCase { return message + " expected:<" + expected + "> but was:<" + actual + ">"; } private static void assertTextArray(String message, CharSequence value, CharSequence ... expected) { final CharSequence actual[] = EmptyKeyStyle.parseCsvText(value); private static void assertTextArray(String message, String value, String ... expected) { final String actual[] = KeyStyles.parseCsvText(value); if (expected.length == 0) { assertNull(message, actual); return; Loading Loading
java/src/com/android/inputmethod/keyboard/Key.java +2 −2 Original line number Diff line number Diff line Loading @@ -101,7 +101,7 @@ public class Key { /** Text to output when pressed. This can be multiple characters, like ".com" */ public final CharSequence mOutputText; /** More keys */ public final CharSequence[] mMoreKeys; public final String[] mMoreKeys; /** More keys maximum column number */ public final int mMaxMoreKeysColumn; Loading Loading @@ -255,7 +255,7 @@ public class Key { // Update row to have current x coordinate. row.setXPos(keyXPos + keyWidth); final CharSequence[] moreKeys = style.getTextArray(keyAttr, final String[] moreKeys = style.getTextArray(keyAttr, R.styleable.Keyboard_Key_moreKeys); // In Arabic symbol layouts, we'd like to keep digits in more keys regardless of // config_digit_more_keys_enabled. Loading
java/src/com/android/inputmethod/keyboard/MiniKeyboard.java +6 −8 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ public class MiniKeyboard extends Keyboard { } public static class Builder extends Keyboard.Builder<Builder.MiniKeyboardParams> { private final CharSequence[] mMoreKeys; private final String[] mMoreKeys; public static class MiniKeyboardParams extends Keyboard.Params { /* package */int mTopRowAdjustment; Loading Loading @@ -230,16 +230,14 @@ public class MiniKeyboard extends Keyboard { parentKey.mX + (mParams.mDefaultKeyWidth - width) / 2, view.getMeasuredWidth()); } private static int getMaxKeyWidth(KeyboardView view, CharSequence[] moreKeys, int minKeyWidth) { private static int getMaxKeyWidth(KeyboardView view, String[] moreKeys, int minKeyWidth) { final int padding = (int) view.getContext().getResources() .getDimension(R.dimen.mini_keyboard_key_horizontal_padding); Paint paint = null; int maxWidth = minKeyWidth; for (CharSequence moreKeySpec : moreKeys) { final CharSequence label = MoreKeySpecParser.getLabel(moreKeySpec.toString()); // If the label is single letter, minKeyWidth is enough to hold // the label. for (String moreKeySpec : moreKeys) { final String label = MoreKeySpecParser.getLabel(moreKeySpec); // If the label is single letter, minKeyWidth is enough to hold the label. if (label != null && label.length() > 1) { if (paint == null) { paint = new Paint(); Loading @@ -258,7 +256,7 @@ public class MiniKeyboard extends Keyboard { public MiniKeyboard build() { final MiniKeyboardParams params = mParams; for (int n = 0; n < mMoreKeys.length; n++) { final String moreKeySpec = mMoreKeys[n].toString(); final String moreKeySpec = mMoreKeys[n]; final int row = n / params.mNumColumns; final Key key = new Key(mResources, params, moreKeySpec, params.getX(n, row), params.getY(row), params.mDefaultKeyWidth, params.mDefaultRowHeight); Loading
java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java +53 −49 Original line number Diff line number Diff line Loading @@ -37,20 +37,22 @@ public class KeyStyles { new HashMap<String, DeclaredKeyStyle>(); private static final KeyStyle EMPTY_KEY_STYLE = new EmptyKeyStyle(); private static final char ESCAPE_CHAR = '\\'; public interface KeyStyle { public CharSequence[] getTextArray(TypedArray a, int index); public String[] getTextArray(TypedArray a, int index); public CharSequence getText(TypedArray a, int index); public int getInt(TypedArray a, int index, int defaultValue); public int getFlag(TypedArray a, int index, int defaultValue); } /* package */ static class EmptyKeyStyle implements KeyStyle { private static class EmptyKeyStyle implements KeyStyle { EmptyKeyStyle() { // Nothing to do. } @Override public CharSequence[] getTextArray(TypedArray a, int index) { public String[] getTextArray(TypedArray a, int index) { return parseTextArray(a, index); } Loading @@ -69,33 +71,36 @@ public class KeyStyles { return a.getInt(index, defaultValue); } protected static CharSequence[] parseTextArray(TypedArray a, int index) { protected static String[] parseTextArray(TypedArray a, int index) { if (!a.hasValue(index)) return null; final CharSequence text = a.getText(index); return parseCsvText(text); return parseCsvText(text.toString()); } } /* package */ static CharSequence[] parseCsvText(CharSequence text) { /* package for test */ static String[] parseCsvText(String text) { final int size = text.length(); if (size == 0) return null; if (size == 1) return new CharSequence[] { text }; if (size == 1) return new String[] { text }; final StringBuilder sb = new StringBuilder(); ArrayList<CharSequence> list = null; ArrayList<String> list = null; int start = 0; for (int pos = 0; pos < size; pos++) { final char c = text.charAt(pos); if (c == ',') { if (list == null) list = new ArrayList<CharSequence>(); if (list == null) list = new ArrayList<String>(); if (sb.length() == 0) { list.add(text.subSequence(start, pos)); list.add(text.substring(start, pos)); } else { list.add(sb.toString()); sb.setLength(0); } start = pos + 1; continue; } else if (c == '\\') { } else if (c == ESCAPE_CHAR) { if (start == pos) { // Skip escape character at the beginning of the value. start++; Loading @@ -112,21 +117,20 @@ public class KeyStyles { } } if (list == null) { return new CharSequence[] { sb.length() > 0 ? sb : text.subSequence(start, size) }; return new String[] { sb.length() > 0 ? sb.toString() : text.substring(start) }; } else { list.add(sb.length() > 0 ? sb : text.subSequence(start, size)); return list.toArray(new CharSequence[list.size()]); } list.add(sb.length() > 0 ? sb.toString() : text.substring(start)); return list.toArray(new String[list.size()]); } } /* package */ static class DeclaredKeyStyle extends EmptyKeyStyle { private static class DeclaredKeyStyle extends EmptyKeyStyle { private final HashMap<Integer, Object> mAttributes = new HashMap<Integer, Object>(); @Override public CharSequence[] getTextArray(TypedArray a, int index) { public String[] getTextArray(TypedArray a, int index) { return a.hasValue(index) ? super.getTextArray(a, index) : (CharSequence[])mAttributes.get(index); ? super.getTextArray(a, index) : (String[])mAttributes.get(index); } @Override Loading
java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java +12 −14 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ import java.util.ArrayList; public class MoreKeySpecParser { private static final String TAG = MoreKeySpecParser.class.getSimpleName(); private static final char ESCAPE = '\\'; private static final char ESCAPE_CHAR = '\\'; private static final String LABEL_END = "|"; private static final String PREFIX_AT = "@"; private static final String PREFIX_ICON = PREFIX_AT + "icon/"; Loading Loading @@ -71,14 +71,14 @@ public class MoreKeySpecParser { } private static String parseEscape(String text) { if (text.indexOf(ESCAPE) < 0) { if (text.indexOf(ESCAPE_CHAR) < 0) { return text; } final int length = text.length(); final StringBuilder sb = new StringBuilder(); for (int pos = 0; pos < length; pos++) { final char c = text.charAt(pos); if (c == ESCAPE && pos + 1 < length) { if (c == ESCAPE_CHAR && pos + 1 < length) { sb.append(text.charAt(++pos)); } else { sb.append(c); Loading @@ -88,7 +88,7 @@ public class MoreKeySpecParser { } private static int indexOfLabelEnd(String moreKeySpec, int start) { if (moreKeySpec.indexOf(ESCAPE, start) < 0) { if (moreKeySpec.indexOf(ESCAPE_CHAR, start) < 0) { final int end = moreKeySpec.indexOf(LABEL_END, start); if (end == 0) { throw new MoreKeySpecParserError(LABEL_END + " at " + start + ": " + moreKeySpec); Loading @@ -98,7 +98,7 @@ public class MoreKeySpecParser { final int length = moreKeySpec.length(); for (int pos = start; pos < length; pos++) { final char c = moreKeySpec.charAt(pos); if (c == ESCAPE && pos + 1 < length) { if (c == ESCAPE_CHAR && pos + 1 < length) { pos++; } else if (moreKeySpec.startsWith(LABEL_END, pos)) { return pos; Loading Loading @@ -207,21 +207,19 @@ public class MoreKeySpecParser { } }; public static CharSequence[] filterOut(Resources res, CharSequence[] moreKeys, CodeFilter filter) { public static String[] filterOut(Resources res, String[] moreKeys, CodeFilter filter) { if (moreKeys == null || moreKeys.length < 1) { return null; } if (moreKeys.length == 1 && filter.shouldFilterOut(getCode(res, moreKeys[0].toString()))) { if (moreKeys.length == 1 && filter.shouldFilterOut(getCode(res, moreKeys[0]))) { return null; } ArrayList<CharSequence> filtered = null; ArrayList<String> filtered = null; for (int i = 0; i < moreKeys.length; i++) { final CharSequence moreKeySpec = moreKeys[i]; if (filter.shouldFilterOut(getCode(res, moreKeySpec.toString()))) { final String moreKeySpec = moreKeys[i]; if (filter.shouldFilterOut(getCode(res, moreKeySpec))) { if (filtered == null) { filtered = new ArrayList<CharSequence>(); filtered = new ArrayList<String>(); for (int j = 0; j < i; j++) { filtered.add(moreKeys[j]); } Loading @@ -236,6 +234,6 @@ public class MoreKeySpecParser { if (filtered.size() == 0) { return null; } return filtered.toArray(new CharSequence[filtered.size()]); return filtered.toArray(new String[filtered.size()]); } }
tests/src/com/android/inputmethod/keyboard/internal/KeyStylesTests.java +2 −5 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.inputmethod.keyboard.internal; import com.android.inputmethod.keyboard.internal.KeyStyles.EmptyKeyStyle; import android.test.AndroidTestCase; import android.text.TextUtils; Loading @@ -26,9 +24,8 @@ public class KeyStylesTests extends AndroidTestCase { return message + " expected:<" + expected + "> but was:<" + actual + ">"; } private static void assertTextArray(String message, CharSequence value, CharSequence ... expected) { final CharSequence actual[] = EmptyKeyStyle.parseCsvText(value); private static void assertTextArray(String message, String value, String ... expected) { final String actual[] = KeyStyles.parseCsvText(value); if (expected.length == 0) { assertNull(message, actual); return; Loading