Merge "Use SparseArray<E> instead of HashMap<Integer,E>"

This commit is contained in:
Tadashi G. Takaoka 2012-06-29 02:05:39 -07:00 committed by Android (Google) Code Review
commit e0b7359126
7 changed files with 55 additions and 51 deletions

View file

@ -19,6 +19,7 @@ package com.android.inputmethod.accessibility;
import android.content.Context; import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.SparseIntArray;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Key;
@ -39,8 +40,8 @@ public class KeyCodeDescriptionMapper {
// Map of key labels to spoken description resource IDs // Map of key labels to spoken description resource IDs
private final HashMap<CharSequence, Integer> mKeyLabelMap; private final HashMap<CharSequence, Integer> mKeyLabelMap;
// Map of key codes to spoken description resource IDs // Sparse array of spoken description resource IDs indexed by key codes
private final HashMap<Integer, Integer> mKeyCodeMap; private final SparseIntArray mKeyCodeMap;
public static void init() { public static void init() {
sInstance.initInternal(); sInstance.initInternal();
@ -52,7 +53,7 @@ public class KeyCodeDescriptionMapper {
private KeyCodeDescriptionMapper() { private KeyCodeDescriptionMapper() {
mKeyLabelMap = new HashMap<CharSequence, Integer>(); mKeyLabelMap = new HashMap<CharSequence, Integer>();
mKeyCodeMap = new HashMap<Integer, Integer>(); mKeyCodeMap = new SparseIntArray();
} }
private void initInternal() { private void initInternal() {
@ -60,7 +61,7 @@ public class KeyCodeDescriptionMapper {
mKeyLabelMap.put(":-)", R.string.spoken_description_smiley); mKeyLabelMap.put(":-)", R.string.spoken_description_smiley);
// Symbols that most TTS engines can't speak // Symbols that most TTS engines can't speak
mKeyCodeMap.put((int) ' ', R.string.spoken_description_space); mKeyCodeMap.put(' ', R.string.spoken_description_space);
// Special non-character codes defined in Keyboard // Special non-character codes defined in Keyboard
mKeyCodeMap.put(Keyboard.CODE_DELETE, R.string.spoken_description_delete); mKeyCodeMap.put(Keyboard.CODE_DELETE, R.string.spoken_description_delete);
@ -273,7 +274,8 @@ public class KeyCodeDescriptionMapper {
return context.getString(OBSCURED_KEY_RES_ID); return context.getString(OBSCURED_KEY_RES_ID);
} }
if (mKeyCodeMap.containsKey(code)) { final int resId = mKeyCodeMap.get(code);
if (resId != 0) {
return context.getString(mKeyCodeMap.get(code)); return context.getString(mKeyCodeMap.get(code));
} else if (isDefinedNonCtrl) { } else if (isDefinedNonCtrl) {
return Character.toString((char) code); return Character.toString((char) code);

View file

@ -23,6 +23,8 @@ import android.content.res.XmlResourceParser;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.util.TypedValue; import android.util.TypedValue;
import android.util.Xml; import android.util.Xml;
import android.view.InflateException; import android.view.InflateException;
@ -44,7 +46,6 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
@ -134,7 +135,7 @@ public class Keyboard {
public final Key[] mAltCodeKeysWhileTyping; public final Key[] mAltCodeKeysWhileTyping;
public final KeyboardIconsSet mIconsSet; public final KeyboardIconsSet mIconsSet;
private final HashMap<Integer, Key> mKeyCache = new HashMap<Integer, Key>(); private final SparseArray<Key> mKeyCache = new SparseArray<Key>();
private final ProximityInfo mProximityInfo; private final ProximityInfo mProximityInfo;
private final boolean mProximityCharsCorrectionEnabled; private final boolean mProximityCharsCorrectionEnabled;
@ -184,23 +185,23 @@ public class Keyboard {
if (code == CODE_UNSPECIFIED) { if (code == CODE_UNSPECIFIED) {
return null; return null;
} }
final Integer keyCode = code; final int index = mKeyCache.indexOfKey(code);
if (mKeyCache.containsKey(keyCode)) { if (index >= 0) {
return mKeyCache.get(keyCode); return mKeyCache.valueAt(index);
} }
for (final Key key : mKeys) { for (final Key key : mKeys) {
if (key.mCode == code) { if (key.mCode == code) {
mKeyCache.put(keyCode, key); mKeyCache.put(code, key);
return key; return key;
} }
} }
mKeyCache.put(keyCode, null); mKeyCache.put(code, null);
return null; return null;
} }
public boolean hasKey(Key aKey) { public boolean hasKey(Key aKey) {
if (mKeyCache.containsKey(aKey)) { if (mKeyCache.indexOfValue(aKey) >= 0) {
return true; return true;
} }
@ -344,8 +345,8 @@ public class Keyboard {
private int mMaxHeightCount = 0; private int mMaxHeightCount = 0;
private int mMaxWidthCount = 0; private int mMaxWidthCount = 0;
private final HashMap<Integer, Integer> mHeightHistogram = new HashMap<Integer, Integer>(); private final SparseIntArray mHeightHistogram = new SparseIntArray();
private final HashMap<Integer, Integer> mWidthHistogram = new HashMap<Integer, Integer>(); private final SparseIntArray mWidthHistogram = new SparseIntArray();
private void clearHistogram() { private void clearHistogram() {
mMostCommonKeyHeight = 0; mMostCommonKeyHeight = 0;
@ -357,22 +358,22 @@ public class Keyboard {
mWidthHistogram.clear(); mWidthHistogram.clear();
} }
private static int updateHistogramCounter(HashMap<Integer, Integer> histogram, private static int updateHistogramCounter(SparseIntArray histogram, int key) {
Integer key) { final int index = histogram.indexOfKey(key);
final int count = (histogram.containsKey(key) ? histogram.get(key) : 0) + 1; final int count = (index >= 0 ? histogram.get(key) : 0) + 1;
histogram.put(key, count); histogram.put(key, count);
return count; return count;
} }
private void updateHistogram(Key key) { private void updateHistogram(Key key) {
final Integer height = key.mHeight + key.mVerticalGap; final int height = key.mHeight + key.mVerticalGap;
final int heightCount = updateHistogramCounter(mHeightHistogram, height); final int heightCount = updateHistogramCounter(mHeightHistogram, height);
if (heightCount > mMaxHeightCount) { if (heightCount > mMaxHeightCount) {
mMaxHeightCount = heightCount; mMaxHeightCount = heightCount;
mMostCommonKeyHeight = height; mMostCommonKeyHeight = height;
} }
final Integer width = key.mWidth + key.mHorizontalGap; final int width = key.mWidth + key.mHorizontalGap;
final int widthCount = updateHistogramCounter(mWidthHistogram, width); final int widthCount = updateHistogramCounter(mWidthHistogram, width);
if (widthCount > mMaxWidthCount) { if (widthCount > mMaxWidthCount) {
mMaxWidthCount = widthCount; mMaxWidthCount = widthCount;

View file

@ -29,6 +29,7 @@ import android.content.res.TypedArray;
import android.content.res.XmlResourceParser; import android.content.res.XmlResourceParser;
import android.text.InputType; import android.text.InputType;
import android.util.Log; import android.util.Log;
import android.util.SparseArray;
import android.util.Xml; import android.util.Xml;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype;
@ -116,9 +117,9 @@ public class KeyboardLayoutSet {
InputMethodSubtype mSubtype; InputMethodSubtype mSubtype;
int mOrientation; int mOrientation;
int mWidth; int mWidth;
// KeyboardLayoutSet element id to element's parameters map. // Sparse array of KeyboardLayoutSet element parameters indexed by element's id.
final HashMap<Integer, ElementParams> mKeyboardLayoutSetElementIdToParamsMap = final SparseArray<ElementParams> mKeyboardLayoutSetElementIdToParamsMap =
new HashMap<Integer, ElementParams>(); new SparseArray<ElementParams>();
static class ElementParams { static class ElementParams {
int mKeyboardXmlId; int mKeyboardXmlId;

View file

@ -30,6 +30,7 @@ import android.graphics.Typeface;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Message; import android.os.Message;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.SparseArray;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -42,7 +43,6 @@ import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.StaticInnerHandlerWrapper; import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
import com.android.inputmethod.latin.StringUtils; import com.android.inputmethod.latin.StringUtils;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
/** /**
@ -124,12 +124,10 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
private Canvas mCanvas; private Canvas mCanvas;
private final Paint mPaint = new Paint(); private final Paint mPaint = new Paint();
private final Paint.FontMetrics mFontMetrics = new Paint.FontMetrics(); private final Paint.FontMetrics mFontMetrics = new Paint.FontMetrics();
// This map caches key label text height in pixel as value and key label text size as map key. // This sparse array caches key label text height in pixel indexed by key label text size.
private static final HashMap<Integer, Float> sTextHeightCache = private static final SparseArray<Float> sTextHeightCache = new SparseArray<Float>();
new HashMap<Integer, Float>(); // This sparse array caches key label text width in pixel indexed by key label text size.
// This map caches key label text width in pixel as value and key label text size as map key. private static final SparseArray<Float> sTextWidthCache = new SparseArray<Float>();
private static final HashMap<Integer, Float> sTextWidthCache =
new HashMap<Integer, Float>();
private static final char[] KEY_LABEL_REFERENCE_CHAR = { 'M' }; private static final char[] KEY_LABEL_REFERENCE_CHAR = { 'M' };
private static final char[] KEY_NUMERIC_HINT_LABEL_REFERENCE_CHAR = { '8' }; private static final char[] KEY_NUMERIC_HINT_LABEL_REFERENCE_CHAR = { '8' };
@ -766,7 +764,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
private final Rect mTextBounds = new Rect(); private final Rect mTextBounds = new Rect();
private float getCharHeight(char[] referenceChar, Paint paint) { private float getCharHeight(char[] referenceChar, Paint paint) {
final Integer key = getCharGeometryCacheKey(referenceChar[0], paint); final int key = getCharGeometryCacheKey(referenceChar[0], paint);
final Float cachedValue = sTextHeightCache.get(key); final Float cachedValue = sTextHeightCache.get(key);
if (cachedValue != null) if (cachedValue != null)
return cachedValue; return cachedValue;
@ -778,7 +776,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
} }
private float getCharWidth(char[] referenceChar, Paint paint) { private float getCharWidth(char[] referenceChar, Paint paint) {
final Integer key = getCharGeometryCacheKey(referenceChar[0], paint); final int key = getCharGeometryCacheKey(referenceChar[0], paint);
final Float cachedValue = sTextWidthCache.get(key); final Float cachedValue = sTextWidthCache.get(key);
if (cachedValue != null) if (cachedValue != null)
return cachedValue; return cachedValue;

View file

@ -24,7 +24,6 @@ import com.android.inputmethod.keyboard.Keyboard.Params.TouchPositionCorrection;
import com.android.inputmethod.latin.JniUtils; import com.android.inputmethod.latin.JniUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
public class ProximityInfo { public class ProximityInfo {
/** MAX_PROXIMITY_CHARS_SIZE must be the same as MAX_PROXIMITY_CHARS_SIZE_INTERNAL /** MAX_PROXIMITY_CHARS_SIZE must be the same as MAX_PROXIMITY_CHARS_SIZE_INTERNAL
@ -190,10 +189,6 @@ public class ProximityInfo {
private void computeNearestNeighbors() { private void computeNearestNeighbors() {
final int defaultWidth = mMostCommonKeyWidth; final int defaultWidth = mMostCommonKeyWidth;
final Key[] keys = mKeys; final Key[] keys = mKeys;
final HashMap<Integer, Key> keyCodeMap = new HashMap<Integer, Key>();
for (final Key key : keys) {
keyCodeMap.put(key.mCode, key);
}
final int thresholdBase = (int) (defaultWidth * SEARCH_DISTANCE); final int thresholdBase = (int) (defaultWidth * SEARCH_DISTANCE);
final int threshold = thresholdBase * thresholdBase; final int threshold = thresholdBase * thresholdBase;
// Round-up so we don't have any pixels outside the grid // Round-up so we don't have any pixels outside the grid

View file

@ -18,6 +18,7 @@ package com.android.inputmethod.keyboard.internal;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.util.Log; import android.util.Log;
import android.util.SparseArray;
import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.R;
@ -89,7 +90,7 @@ public class KeyStyles {
private class DeclaredKeyStyle extends KeyStyle { private class DeclaredKeyStyle extends KeyStyle {
private final String mParentStyleName; private final String mParentStyleName;
private final HashMap<Integer, Object> mStyleAttributes = new HashMap<Integer, Object>(); private final SparseArray<Object> mStyleAttributes = new SparseArray<Object>();
public DeclaredKeyStyle(String parentStyleName) { public DeclaredKeyStyle(String parentStyleName) {
mParentStyleName = parentStyleName; mParentStyleName = parentStyleName;
@ -100,8 +101,9 @@ public class KeyStyles {
if (a.hasValue(index)) { if (a.hasValue(index)) {
return parseStringArray(a, index); return parseStringArray(a, index);
} }
if (mStyleAttributes.containsKey(index)) { final Object value = mStyleAttributes.get(index);
return (String[])mStyleAttributes.get(index); if (value != null) {
return (String[])value;
} }
final KeyStyle parentStyle = mStyles.get(mParentStyleName); final KeyStyle parentStyle = mStyles.get(mParentStyleName);
return parentStyle.getStringArray(a, index); return parentStyle.getStringArray(a, index);
@ -112,8 +114,9 @@ public class KeyStyles {
if (a.hasValue(index)) { if (a.hasValue(index)) {
return parseString(a, index); return parseString(a, index);
} }
if (mStyleAttributes.containsKey(index)) { final Object value = mStyleAttributes.get(index);
return (String)mStyleAttributes.get(index); if (value != null) {
return (String)value;
} }
final KeyStyle parentStyle = mStyles.get(mParentStyleName); final KeyStyle parentStyle = mStyles.get(mParentStyleName);
return parentStyle.getString(a, index); return parentStyle.getString(a, index);
@ -124,8 +127,9 @@ public class KeyStyles {
if (a.hasValue(index)) { if (a.hasValue(index)) {
return a.getInt(index, defaultValue); return a.getInt(index, defaultValue);
} }
if (mStyleAttributes.containsKey(index)) { final Object value = mStyleAttributes.get(index);
return (Integer)mStyleAttributes.get(index); if (value != null) {
return (Integer)value;
} }
final KeyStyle parentStyle = mStyles.get(mParentStyleName); final KeyStyle parentStyle = mStyles.get(mParentStyleName);
return parentStyle.getInt(a, index, defaultValue); return parentStyle.getInt(a, index, defaultValue);
@ -133,12 +137,13 @@ public class KeyStyles {
@Override @Override
public int getFlag(TypedArray a, int index) { public int getFlag(TypedArray a, int index) {
int value = a.getInt(index, 0); int flags = a.getInt(index, 0);
if (mStyleAttributes.containsKey(index)) { final Object value = mStyleAttributes.get(index);
value |= (Integer)mStyleAttributes.get(index); if (value != null) {
flags |= (Integer)value;
} }
final KeyStyle parentStyle = mStyles.get(mParentStyleName); final KeyStyle parentStyle = mStyles.get(mParentStyleName);
return value | parentStyle.getFlag(a, index); return flags | parentStyle.getFlag(a, index);
} }
void readKeyAttributes(TypedArray keyAttr) { void readKeyAttributes(TypedArray keyAttr) {

View file

@ -20,6 +20,7 @@ import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.Log; import android.util.Log;
import android.util.SparseIntArray;
import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.R;
@ -31,8 +32,7 @@ public class KeyboardIconsSet {
public static final int ICON_UNDEFINED = 0; public static final int ICON_UNDEFINED = 0;
private static final int ATTR_UNDEFINED = 0; private static final int ATTR_UNDEFINED = 0;
private static final HashMap<Integer, Integer> ATTR_ID_TO_ICON_ID private static final SparseIntArray ATTR_ID_TO_ICON_ID = new SparseIntArray();
= new HashMap<Integer, Integer>();
// Icon name to icon id map. // Icon name to icon id map.
private static final HashMap<String, Integer> sNameToIdsMap = new HashMap<String, Integer>(); private static final HashMap<String, Integer> sNameToIdsMap = new HashMap<String, Integer>();
@ -76,7 +76,9 @@ public class KeyboardIconsSet {
} }
public void loadIcons(final TypedArray keyboardAttrs) { public void loadIcons(final TypedArray keyboardAttrs) {
for (final Integer attrId : ATTR_ID_TO_ICON_ID.keySet()) { final int size = ATTR_ID_TO_ICON_ID.size();
for (int index = 0; index < size; index++) {
final int attrId = ATTR_ID_TO_ICON_ID.keyAt(index);
try { try {
final Drawable icon = keyboardAttrs.getDrawable(attrId); final Drawable icon = keyboardAttrs.getDrawable(attrId);
setDefaultBounds(icon); setDefaultBounds(icon);