Make Key, Row and Keyboard attributes final
Change-Id: Ie87e9e8936646334646cc93b228e0f6a93a79e5bmain
parent
7545ec8df0
commit
a275e9eb48
|
@ -35,47 +35,48 @@ public class Key {
|
||||||
* All the key codes (unicode or custom code) that this key could generate, zero'th
|
* All the key codes (unicode or custom code) that this key could generate, zero'th
|
||||||
* being the most important.
|
* being the most important.
|
||||||
*/
|
*/
|
||||||
public int[] mCodes;
|
public final int[] mCodes;
|
||||||
/** The unicode that this key generates in manual temporary upper case mode. */
|
/** The unicode that this key generates in manual temporary upper case mode. */
|
||||||
public int mManualTemporaryUpperCaseCode;
|
public final int mManualTemporaryUpperCaseCode;
|
||||||
|
|
||||||
/** Label to display */
|
/** Label to display */
|
||||||
public CharSequence mLabel;
|
public final CharSequence mLabel;
|
||||||
/** Option of the label */
|
/** Option of the label */
|
||||||
public int mLabelOption;
|
public final int mLabelOption;
|
||||||
|
|
||||||
/** Icon to display instead of a label. Icon takes precedence over a label */
|
/** Icon to display instead of a label. Icon takes precedence over a label */
|
||||||
public Drawable mIcon;
|
private Drawable mIcon;
|
||||||
/** Hint icon to display on the key in conjunction with the label */
|
|
||||||
public Drawable mHintIcon;
|
|
||||||
/** Preview version of the icon, for the preview popup */
|
/** Preview version of the icon, for the preview popup */
|
||||||
|
private Drawable mPreviewIcon;
|
||||||
|
/** Hint icon to display on the key in conjunction with the label */
|
||||||
|
public final Drawable mHintIcon;
|
||||||
/**
|
/**
|
||||||
* The hint icon to display on the key when keyboard is in manual temporary upper case
|
* The hint icon to display on the key when keyboard is in manual temporary upper case
|
||||||
* mode.
|
* mode.
|
||||||
*/
|
*/
|
||||||
public Drawable mManualTemporaryUpperCaseHintIcon;
|
public final Drawable mManualTemporaryUpperCaseHintIcon;
|
||||||
|
|
||||||
public Drawable mPreviewIcon;
|
|
||||||
/** Width of the key, not including the gap */
|
/** Width of the key, not including the gap */
|
||||||
public int mWidth;
|
public final int mWidth;
|
||||||
/** Height of the key, not including the gap */
|
/** Height of the key, not including the gap */
|
||||||
public int mHeight;
|
public final int mHeight;
|
||||||
/** The horizontal gap before this key */
|
/** The horizontal gap before this key */
|
||||||
public int mGap;
|
public final int mGap;
|
||||||
/** Whether this key is sticky, i.e., a toggle key */
|
/** Whether this key is sticky, i.e., a toggle key */
|
||||||
public boolean mSticky;
|
public final boolean mSticky;
|
||||||
/** X coordinate of the key in the keyboard layout */
|
/** X coordinate of the key in the keyboard layout */
|
||||||
public int mX;
|
public final int mX;
|
||||||
/** Y coordinate of the key in the keyboard layout */
|
/** Y coordinate of the key in the keyboard layout */
|
||||||
public int mY;
|
public final int mY;
|
||||||
/** The current pressed state of this key */
|
|
||||||
public boolean mPressed;
|
|
||||||
/** If this is a sticky key, is it on? */
|
|
||||||
public boolean mOn;
|
|
||||||
/** Text to output when pressed. This can be multiple characters, like ".com" */
|
/** Text to output when pressed. This can be multiple characters, like ".com" */
|
||||||
public CharSequence mOutputText;
|
public final CharSequence mOutputText;
|
||||||
/** Popup characters */
|
/** Popup characters */
|
||||||
public CharSequence mPopupCharacters;
|
public final CharSequence mPopupCharacters;
|
||||||
|
/**
|
||||||
|
* If this key pops up a mini keyboard, this is the resource id for the XML layout for that
|
||||||
|
* keyboard.
|
||||||
|
*/
|
||||||
|
public final int mPopupResId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flags that specify the anchoring to edges of the keyboard for detecting touch events
|
* Flags that specify the anchoring to edges of the keyboard for detecting touch events
|
||||||
|
@ -83,19 +84,19 @@ public class Key {
|
||||||
* {@link Keyboard#EDGE_LEFT}, {@link Keyboard#EDGE_RIGHT},
|
* {@link Keyboard#EDGE_LEFT}, {@link Keyboard#EDGE_RIGHT},
|
||||||
* {@link Keyboard#EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM}.
|
* {@link Keyboard#EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM}.
|
||||||
*/
|
*/
|
||||||
public int mEdgeFlags;
|
public final int mEdgeFlags;
|
||||||
/** Whether this is a modifier key, such as Shift or Alt */
|
/** Whether this is a modifier key, such as Shift or Alt */
|
||||||
public boolean mModifier;
|
public final boolean mModifier;
|
||||||
/** The Keyboard that this key belongs to */
|
|
||||||
protected final Keyboard mKeyboard;
|
|
||||||
/**
|
|
||||||
* If this key pops up a mini keyboard, this is the resource id for the XML layout for that
|
|
||||||
* keyboard.
|
|
||||||
*/
|
|
||||||
public int mPopupResId;
|
|
||||||
/** Whether this key repeats itself when held down */
|
/** Whether this key repeats itself when held down */
|
||||||
public boolean mRepeatable;
|
public final boolean mRepeatable;
|
||||||
|
|
||||||
|
/** The Keyboard that this key belongs to */
|
||||||
|
private final Keyboard mKeyboard;
|
||||||
|
|
||||||
|
/** The current pressed state of this key */
|
||||||
|
public boolean mPressed;
|
||||||
|
/** If this is a sticky key, is it on? */
|
||||||
|
public boolean mOn;
|
||||||
|
|
||||||
private final static int[] KEY_STATE_NORMAL_ON = {
|
private final static int[] KEY_STATE_NORMAL_ON = {
|
||||||
android.R.attr.state_checkable,
|
android.R.attr.state_checkable,
|
||||||
|
@ -136,38 +137,53 @@ public class Key {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Create an empty key with no attributes. */
|
/** Create an empty key with no attributes. */
|
||||||
public Key(Row parent) {
|
public Key(Row row, char letter, int x, int y) {
|
||||||
mKeyboard = parent.mParent;
|
mKeyboard = row.getKeyboard();
|
||||||
mHeight = parent.mDefaultHeight;
|
mHeight = row.mDefaultHeight;
|
||||||
mGap = parent.mDefaultHorizontalGap;
|
mGap = row.mDefaultHorizontalGap;
|
||||||
mWidth = parent.mDefaultWidth - mGap;
|
mWidth = row.mDefaultWidth - mGap;
|
||||||
mEdgeFlags = parent.mRowEdgeFlags;
|
mEdgeFlags = row.mRowEdgeFlags;
|
||||||
|
mHintIcon = null;
|
||||||
|
mManualTemporaryUpperCaseHintIcon = null;
|
||||||
|
mManualTemporaryUpperCaseCode = 0;
|
||||||
|
mLabelOption = 0;
|
||||||
|
mModifier = false;
|
||||||
|
mSticky = false;
|
||||||
|
mRepeatable = false;
|
||||||
|
mOutputText = null;
|
||||||
|
mPopupCharacters = null;
|
||||||
|
mPopupResId = 0;
|
||||||
|
mLabel = String.valueOf(letter);
|
||||||
|
mCodes = new int[] { letter };
|
||||||
|
// Horizontal gap is divided equally to both sides of the key.
|
||||||
|
mX = x + mGap / 2;
|
||||||
|
mY = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a key with the given top-left coordinate and extract its attributes from
|
/** Create a key with the given top-left coordinate and extract its attributes from
|
||||||
* the XML parser.
|
* the XML parser.
|
||||||
* @param res resources associated with the caller's context
|
* @param res resources associated with the caller's context
|
||||||
* @param parent the row that this key belongs to. The row must already be attached to
|
* @param row the row that this key belongs to. The row must already be attached to
|
||||||
* a {@link Keyboard}.
|
* a {@link Keyboard}.
|
||||||
* @param x the x coordinate of the top-left
|
* @param x the x coordinate of the top-left
|
||||||
* @param y the y coordinate of the top-left
|
* @param y the y coordinate of the top-left
|
||||||
* @param parser the XML parser containing the attributes for this key
|
* @param parser the XML parser containing the attributes for this key
|
||||||
*/
|
*/
|
||||||
public Key(Resources res, Row parent, int x, int y, XmlResourceParser parser,
|
public Key(Resources res, Row row, int x, int y, XmlResourceParser parser,
|
||||||
KeyStyles keyStyles) {
|
KeyStyles keyStyles) {
|
||||||
this(parent);
|
mKeyboard = row.getKeyboard();
|
||||||
|
|
||||||
TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
|
TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
|
||||||
R.styleable.Keyboard);
|
R.styleable.Keyboard);
|
||||||
mHeight = KeyboardParser.getDimensionOrFraction(a,
|
mHeight = KeyboardParser.getDimensionOrFraction(a,
|
||||||
R.styleable.Keyboard_keyHeight,
|
R.styleable.Keyboard_keyHeight,
|
||||||
mKeyboard.mDisplayHeight, parent.mDefaultHeight);
|
mKeyboard.getKeyboardHeight(), row.mDefaultHeight);
|
||||||
mGap = KeyboardParser.getDimensionOrFraction(a,
|
mGap = KeyboardParser.getDimensionOrFraction(a,
|
||||||
R.styleable.Keyboard_horizontalGap,
|
R.styleable.Keyboard_horizontalGap,
|
||||||
mKeyboard.mDisplayWidth, parent.mDefaultHorizontalGap);
|
mKeyboard.getKeyboardWidth(), row.mDefaultHorizontalGap);
|
||||||
mWidth = KeyboardParser.getDimensionOrFraction(a,
|
mWidth = KeyboardParser.getDimensionOrFraction(a,
|
||||||
R.styleable.Keyboard_keyWidth,
|
R.styleable.Keyboard_keyWidth,
|
||||||
mKeyboard.mDisplayWidth, parent.mDefaultWidth) - mGap;
|
mKeyboard.getKeyboardWidth(), row.mDefaultWidth) - mGap;
|
||||||
a.recycle();
|
a.recycle();
|
||||||
|
|
||||||
a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.Keyboard_Key);
|
a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.Keyboard_Key);
|
||||||
|
@ -186,7 +202,7 @@ public class Key {
|
||||||
this.mX = x + mGap / 2;
|
this.mX = x + mGap / 2;
|
||||||
this.mY = y;
|
this.mY = y;
|
||||||
|
|
||||||
mCodes = style.getIntArray(a, R.styleable.Keyboard_Key_codes);
|
int[] codes = style.getIntArray(a, R.styleable.Keyboard_Key_codes);
|
||||||
mPreviewIcon = style.getDrawable(a, R.styleable.Keyboard_Key_iconPreview);
|
mPreviewIcon = style.getDrawable(a, R.styleable.Keyboard_Key_iconPreview);
|
||||||
Keyboard.setDefaultBounds(mPreviewIcon);
|
Keyboard.setDefaultBounds(mPreviewIcon);
|
||||||
mPopupCharacters = style.getText(a, R.styleable.Keyboard_Key_popupCharacters);
|
mPopupCharacters = style.getText(a, R.styleable.Keyboard_Key_popupCharacters);
|
||||||
|
@ -194,8 +210,8 @@ public class Key {
|
||||||
mRepeatable = style.getBoolean(a, R.styleable.Keyboard_Key_isRepeatable, false);
|
mRepeatable = style.getBoolean(a, R.styleable.Keyboard_Key_isRepeatable, false);
|
||||||
mModifier = style.getBoolean(a, R.styleable.Keyboard_Key_isModifier, false);
|
mModifier = style.getBoolean(a, R.styleable.Keyboard_Key_isModifier, false);
|
||||||
mSticky = style.getBoolean(a, R.styleable.Keyboard_Key_isSticky, false);
|
mSticky = style.getBoolean(a, R.styleable.Keyboard_Key_isSticky, false);
|
||||||
mEdgeFlags = style.getFlag(a, R.styleable.Keyboard_Key_keyEdgeFlags, 0);
|
mEdgeFlags = style.getFlag(a, R.styleable.Keyboard_Key_keyEdgeFlags, 0)
|
||||||
mEdgeFlags |= parent.mRowEdgeFlags;
|
| row.mRowEdgeFlags;
|
||||||
|
|
||||||
mIcon = style.getDrawable(a, R.styleable.Keyboard_Key_keyIcon);
|
mIcon = style.getDrawable(a, R.styleable.Keyboard_Key_keyIcon);
|
||||||
Keyboard.setDefaultBounds(mIcon);
|
Keyboard.setDefaultBounds(mIcon);
|
||||||
|
@ -217,9 +233,25 @@ public class Key {
|
||||||
if (shiftedIcon != null)
|
if (shiftedIcon != null)
|
||||||
mKeyboard.getShiftedIcons().put(this, shiftedIcon);
|
mKeyboard.getShiftedIcons().put(this, shiftedIcon);
|
||||||
|
|
||||||
if (mCodes == null && !TextUtils.isEmpty(mLabel)) {
|
if (codes == null && !TextUtils.isEmpty(mLabel))
|
||||||
mCodes = new int[] { mLabel.charAt(0) };
|
codes = new int[] { mLabel.charAt(0) };
|
||||||
}
|
mCodes = codes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Drawable getIcon() {
|
||||||
|
return mIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Drawable getPreviewIcon() {
|
||||||
|
return mPreviewIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIcon(Drawable icon) {
|
||||||
|
mIcon = icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPreviewIcon(Drawable icon) {
|
||||||
|
mPreviewIcon = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -80,16 +80,16 @@ public class Keyboard {
|
||||||
public static final int CODE_VOICE = -109;
|
public static final int CODE_VOICE = -109;
|
||||||
|
|
||||||
/** Horizontal gap default for all rows */
|
/** Horizontal gap default for all rows */
|
||||||
int mDefaultHorizontalGap;
|
private int mDefaultHorizontalGap;
|
||||||
|
|
||||||
/** Default key width */
|
/** Default key width */
|
||||||
int mDefaultWidth;
|
private int mDefaultWidth;
|
||||||
|
|
||||||
/** Default key height */
|
/** Default key height */
|
||||||
int mDefaultHeight;
|
private int mDefaultHeight;
|
||||||
|
|
||||||
/** Default gap between rows */
|
/** Default gap between rows */
|
||||||
int mDefaultVerticalGap;
|
private int mDefaultVerticalGap;
|
||||||
|
|
||||||
/** List of shift keys in this keyboard and its icons and state */
|
/** List of shift keys in this keyboard and its icons and state */
|
||||||
private final List<Key> mShiftKeys = new ArrayList<Key>();
|
private final List<Key> mShiftKeys = new ArrayList<Key>();
|
||||||
|
@ -116,12 +116,12 @@ public class Keyboard {
|
||||||
private final List<Key> mKeys = new ArrayList<Key>();
|
private final List<Key> mKeys = new ArrayList<Key>();
|
||||||
|
|
||||||
/** Width of the screen available to fit the keyboard */
|
/** Width of the screen available to fit the keyboard */
|
||||||
final int mDisplayWidth;
|
private final int mDisplayWidth;
|
||||||
|
|
||||||
/** Height of the screen */
|
/** Height of the screen */
|
||||||
final int mDisplayHeight;
|
private final int mDisplayHeight;
|
||||||
|
|
||||||
protected final KeyboardId mId;
|
public final KeyboardId mId;
|
||||||
|
|
||||||
// Variables for pre-computing nearest keys.
|
// Variables for pre-computing nearest keys.
|
||||||
|
|
||||||
|
@ -206,12 +206,7 @@ public class Keyboard {
|
||||||
int column = 0;
|
int column = 0;
|
||||||
mTotalWidth = 0;
|
mTotalWidth = 0;
|
||||||
|
|
||||||
Row row = new Row(this);
|
final Row row = new Row(this);
|
||||||
row.mDefaultHeight = mDefaultHeight;
|
|
||||||
row.mDefaultWidth = mDefaultWidth;
|
|
||||||
row.mDefaultHorizontalGap = mDefaultHorizontalGap;
|
|
||||||
row.mVerticalGap = mDefaultVerticalGap;
|
|
||||||
row.mRowEdgeFlags = EDGE_TOP | EDGE_BOTTOM;
|
|
||||||
final int maxColumns = columns == -1 ? Integer.MAX_VALUE : columns;
|
final int maxColumns = columns == -1 ? Integer.MAX_VALUE : columns;
|
||||||
for (int i = 0; i < characters.length(); i++) {
|
for (int i = 0; i < characters.length(); i++) {
|
||||||
char c = characters.charAt(i);
|
char c = characters.charAt(i);
|
||||||
|
@ -221,12 +216,7 @@ public class Keyboard {
|
||||||
y += mDefaultVerticalGap + mDefaultHeight;
|
y += mDefaultVerticalGap + mDefaultHeight;
|
||||||
column = 0;
|
column = 0;
|
||||||
}
|
}
|
||||||
final Key key = new Key(row);
|
final Key key = new Key(row, c, x, y);
|
||||||
// Horizontal gap is divided equally to both sides of the key.
|
|
||||||
key.mX = x + key.mGap / 2;
|
|
||||||
key.mY = y;
|
|
||||||
key.mLabel = String.valueOf(c);
|
|
||||||
key.mCodes = new int[] { c };
|
|
||||||
column++;
|
column++;
|
||||||
x += key.mWidth + key.mGap;
|
x += key.mWidth + key.mGap;
|
||||||
mKeys.add(key);
|
mKeys.add(key);
|
||||||
|
@ -237,43 +227,39 @@ public class Keyboard {
|
||||||
mTotalHeight = y + mDefaultHeight;
|
mTotalHeight = y + mDefaultHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
public KeyboardId getKeyboardId() {
|
|
||||||
return mId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Key> getKeys() {
|
public List<Key> getKeys() {
|
||||||
return mKeys;
|
return mKeys;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int getHorizontalGap() {
|
public int getHorizontalGap() {
|
||||||
return mDefaultHorizontalGap;
|
return mDefaultHorizontalGap;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setHorizontalGap(int gap) {
|
public void setHorizontalGap(int gap) {
|
||||||
mDefaultHorizontalGap = gap;
|
mDefaultHorizontalGap = gap;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int getVerticalGap() {
|
public int getVerticalGap() {
|
||||||
return mDefaultVerticalGap;
|
return mDefaultVerticalGap;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setVerticalGap(int gap) {
|
public void setVerticalGap(int gap) {
|
||||||
mDefaultVerticalGap = gap;
|
mDefaultVerticalGap = gap;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int getKeyHeight() {
|
public int getKeyHeight() {
|
||||||
return mDefaultHeight;
|
return mDefaultHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setKeyHeight(int height) {
|
public void setKeyHeight(int height) {
|
||||||
mDefaultHeight = height;
|
mDefaultHeight = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int getKeyWidth() {
|
public int getKeyWidth() {
|
||||||
return mDefaultWidth;
|
return mDefaultWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setKeyWidth(int width) {
|
public void setKeyWidth(int width) {
|
||||||
mDefaultWidth = width;
|
mDefaultWidth = width;
|
||||||
final int threshold = (int) (width * SEARCH_DISTANCE);
|
final int threshold = (int) (width * SEARCH_DISTANCE);
|
||||||
mProximityThreshold = threshold * threshold;
|
mProximityThreshold = threshold * threshold;
|
||||||
|
@ -310,7 +296,7 @@ public class Keyboard {
|
||||||
public void enableShiftLock() {
|
public void enableShiftLock() {
|
||||||
for (final Key key : getShiftKeys()) {
|
for (final Key key : getShiftKeys()) {
|
||||||
mShiftLockEnabled.add(key);
|
mShiftLockEnabled.add(key);
|
||||||
mNormalShiftIcons.put(key, key.mIcon);
|
mNormalShiftIcons.put(key, key.getIcon());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +308,7 @@ public class Keyboard {
|
||||||
final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
|
final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
|
||||||
for (final Key key : getShiftKeys()) {
|
for (final Key key : getShiftKeys()) {
|
||||||
key.mOn = newShiftLockState;
|
key.mOn = newShiftLockState;
|
||||||
key.mIcon = newShiftLockState ? shiftedIcons.get(key) : mNormalShiftIcons.get(key);
|
key.setIcon(newShiftLockState ? shiftedIcons.get(key) : mNormalShiftIcons.get(key));
|
||||||
}
|
}
|
||||||
mShiftState.setShiftLocked(newShiftLockState);
|
mShiftState.setShiftLocked(newShiftLockState);
|
||||||
return true;
|
return true;
|
||||||
|
@ -336,9 +322,9 @@ public class Keyboard {
|
||||||
final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
|
final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
|
||||||
for (final Key key : getShiftKeys()) {
|
for (final Key key : getShiftKeys()) {
|
||||||
if (!newShiftState && !mShiftState.isShiftLocked()) {
|
if (!newShiftState && !mShiftState.isShiftLocked()) {
|
||||||
key.mIcon = mNormalShiftIcons.get(key);
|
key.setIcon(mNormalShiftIcons.get(key));
|
||||||
} else if (newShiftState && !mShiftState.isShiftedOrShiftLocked()) {
|
} else if (newShiftState && !mShiftState.isShiftedOrShiftLocked()) {
|
||||||
key.mIcon = shiftedIcons.get(key);
|
key.setIcon(shiftedIcons.get(key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return mShiftState.setShifted(newShiftState);
|
return mShiftState.setShifted(newShiftState);
|
||||||
|
@ -379,8 +365,8 @@ public class Keyboard {
|
||||||
|
|
||||||
public void setSpaceKey(Key space) {
|
public void setSpaceKey(Key space) {
|
||||||
mSpaceKey = space;
|
mSpaceKey = space;
|
||||||
mSpaceIcon = space.mIcon;
|
mSpaceIcon = space.getIcon();
|
||||||
mSpacePreviewIcon = space.mPreviewIcon;
|
mSpacePreviewIcon = space.getPreviewIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void computeNearestNeighbors() {
|
private void computeNearestNeighbors() {
|
||||||
|
|
|
@ -758,9 +758,10 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
|
||||||
paint.setShadowLayer(0, 0, 0, 0);
|
paint.setShadowLayer(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
// Draw key icon
|
// Draw key icon
|
||||||
if (key.mLabel == null && key.mIcon != null) {
|
final Drawable icon = key.getIcon();
|
||||||
final int drawableWidth = key.mIcon.getIntrinsicWidth();
|
if (key.mLabel == null && icon != null) {
|
||||||
final int drawableHeight = key.mIcon.getIntrinsicHeight();
|
final int drawableWidth = icon.getIntrinsicWidth();
|
||||||
|
final int drawableHeight = icon.getIntrinsicHeight();
|
||||||
final int drawableX;
|
final int drawableX;
|
||||||
final int drawableY = (
|
final int drawableY = (
|
||||||
key.mHeight + padding.top - padding.bottom - drawableHeight) / 2;
|
key.mHeight + padding.top - padding.bottom - drawableHeight) / 2;
|
||||||
|
@ -780,7 +781,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
|
||||||
drawVerticalLine(canvas, drawableX + drawableWidth / 2, rowHeight,
|
drawVerticalLine(canvas, drawableX + drawableWidth / 2, rowHeight,
|
||||||
0xc0008080, new Paint());
|
0xc0008080, new Paint());
|
||||||
}
|
}
|
||||||
drawIcon(canvas, key.mIcon, drawableX, drawableY, drawableWidth, drawableHeight);
|
drawIcon(canvas, icon, drawableX, drawableY, drawableWidth, drawableHeight);
|
||||||
if (DEBUG_SHOW_ALIGN)
|
if (DEBUG_SHOW_ALIGN)
|
||||||
drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,
|
drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,
|
||||||
0x80c00000, new Paint());
|
0x80c00000, new Paint());
|
||||||
|
@ -790,10 +791,10 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
|
||||||
final int drawableHeight = key.mHeight;
|
final int drawableHeight = key.mHeight;
|
||||||
final int drawableX = 0;
|
final int drawableX = 0;
|
||||||
final int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL;
|
final int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL;
|
||||||
Drawable icon = (isManualTemporaryUpperCase
|
Drawable hintIcon = (isManualTemporaryUpperCase
|
||||||
&& key.mManualTemporaryUpperCaseHintIcon != null)
|
&& key.mManualTemporaryUpperCaseHintIcon != null)
|
||||||
? key.mManualTemporaryUpperCaseHintIcon : key.mHintIcon;
|
? key.mManualTemporaryUpperCaseHintIcon : key.mHintIcon;
|
||||||
drawIcon(canvas, icon, drawableX, drawableY, drawableWidth, drawableHeight);
|
drawIcon(canvas, hintIcon, drawableX, drawableY, drawableWidth, drawableHeight);
|
||||||
if (DEBUG_SHOW_ALIGN)
|
if (DEBUG_SHOW_ALIGN)
|
||||||
drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,
|
drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,
|
||||||
0x80c0c000, new Paint());
|
0x80c0c000, new Paint());
|
||||||
|
@ -965,8 +966,9 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
|
||||||
mPreviewText.setTypeface(mKeyLetterStyle);
|
mPreviewText.setTypeface(mKeyLetterStyle);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
final Drawable previewIcon = key.getPreviewIcon();
|
||||||
mPreviewText.setCompoundDrawables(null, null, null,
|
mPreviewText.setCompoundDrawables(null, null, null,
|
||||||
key.mPreviewIcon != null ? key.mPreviewIcon : key.mIcon);
|
previewIcon != null ? previewIcon : key.getIcon());
|
||||||
mPreviewText.setText(null);
|
mPreviewText.setText(null);
|
||||||
}
|
}
|
||||||
mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
|
mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
|
||||||
|
|
|
@ -109,15 +109,15 @@ public class LatinKeyboard extends Keyboard {
|
||||||
final Resources res = mRes;
|
final Resources res = mRes;
|
||||||
// If application locales are explicitly selected.
|
// If application locales are explicitly selected.
|
||||||
if (SubtypeSwitcher.getInstance().needsToDisplayLanguage()) {
|
if (SubtypeSwitcher.getInstance().needsToDisplayLanguage()) {
|
||||||
mSpaceKey.mIcon = new BitmapDrawable(res,
|
mSpaceKey.setIcon(new BitmapDrawable(res,
|
||||||
drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion));
|
drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion)));
|
||||||
} else {
|
} else {
|
||||||
// sym_keyboard_space_led can be shared with Black and White symbol themes.
|
// sym_keyboard_space_led can be shared with Black and White symbol themes.
|
||||||
if (isAutoCompletion) {
|
if (isAutoCompletion) {
|
||||||
mSpaceKey.mIcon = new BitmapDrawable(res,
|
mSpaceKey.setIcon(new BitmapDrawable(res,
|
||||||
drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion));
|
drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion)));
|
||||||
} else {
|
} else {
|
||||||
mSpaceKey.mIcon = mSpaceIcon;
|
mSpaceKey.setIcon(mSpaceIcon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -238,15 +238,15 @@ public class LatinKeyboard extends Keyboard {
|
||||||
mSlidingLocaleIcon =
|
mSlidingLocaleIcon =
|
||||||
new SlidingLocaleDrawable(mContext, mSpacePreviewIcon, width, height);
|
new SlidingLocaleDrawable(mContext, mSpacePreviewIcon, width, height);
|
||||||
mSlidingLocaleIcon.setBounds(0, 0, width, height);
|
mSlidingLocaleIcon.setBounds(0, 0, width, height);
|
||||||
mSpaceKey.mPreviewIcon = mSlidingLocaleIcon;
|
mSpaceKey.setPreviewIcon(mSlidingLocaleIcon);
|
||||||
}
|
}
|
||||||
mSlidingLocaleIcon.setDiff(diff);
|
mSlidingLocaleIcon.setDiff(diff);
|
||||||
if (Math.abs(diff) == Integer.MAX_VALUE) {
|
if (Math.abs(diff) == Integer.MAX_VALUE) {
|
||||||
mSpaceKey.mPreviewIcon = mSpacePreviewIcon;
|
mSpaceKey.setPreviewIcon(mSpacePreviewIcon);
|
||||||
} else {
|
} else {
|
||||||
mSpaceKey.mPreviewIcon = mSlidingLocaleIcon;
|
mSpaceKey.setPreviewIcon(mSlidingLocaleIcon);
|
||||||
}
|
}
|
||||||
mSpaceKey.mPreviewIcon.invalidateSelf();
|
mSpaceKey.getPreviewIcon().invalidateSelf();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLanguageChangeDirection() {
|
public int getLanguageChangeDirection() {
|
||||||
|
|
|
@ -30,44 +30,52 @@ import android.util.Xml;
|
||||||
*/
|
*/
|
||||||
public class Row {
|
public class Row {
|
||||||
/** Default width of a key in this row. */
|
/** Default width of a key in this row. */
|
||||||
public int mDefaultWidth;
|
public final int mDefaultWidth;
|
||||||
/** Default height of a key in this row. */
|
/** Default height of a key in this row. */
|
||||||
public int mDefaultHeight;
|
public final int mDefaultHeight;
|
||||||
/** Default horizontal gap between keys in this row. */
|
/** Default horizontal gap between keys in this row. */
|
||||||
public int mDefaultHorizontalGap;
|
public final int mDefaultHorizontalGap;
|
||||||
/** Vertical gap following this row. */
|
/** Vertical gap following this row. */
|
||||||
public int mVerticalGap;
|
public final int mVerticalGap;
|
||||||
/**
|
/**
|
||||||
* Edge flags for this row of keys. Possible values that can be assigned are
|
* Edge flags for this row of keys. Possible values that can be assigned are
|
||||||
* {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM}
|
* {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM}
|
||||||
*/
|
*/
|
||||||
public int mRowEdgeFlags;
|
public final int mRowEdgeFlags;
|
||||||
|
|
||||||
/* package */ final Keyboard mParent;
|
private final Keyboard mKeyboard;
|
||||||
|
|
||||||
/* package */ Row(Keyboard parent) {
|
public Row(Keyboard keyboard) {
|
||||||
this.mParent = parent;
|
this.mKeyboard = keyboard;
|
||||||
|
mDefaultHeight = keyboard.getKeyHeight();
|
||||||
|
mDefaultWidth = keyboard.getKeyWidth();
|
||||||
|
mDefaultHorizontalGap = keyboard.getHorizontalGap();
|
||||||
|
mVerticalGap = keyboard.getVerticalGap();
|
||||||
|
mRowEdgeFlags = Keyboard.EDGE_TOP | Keyboard.EDGE_BOTTOM;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Row(Resources res, Keyboard parent, XmlResourceParser parser) {
|
public Row(Resources res, Keyboard keyboard, XmlResourceParser parser) {
|
||||||
this.mParent = parent;
|
this.mKeyboard = keyboard;
|
||||||
|
final int keyboardWidth = keyboard.getKeyboardWidth();
|
||||||
|
final int keyboardHeight = keyboard.getKeyboardHeight();
|
||||||
TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
|
TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
|
||||||
R.styleable.Keyboard);
|
R.styleable.Keyboard);
|
||||||
mDefaultWidth = KeyboardParser.getDimensionOrFraction(a,
|
mDefaultWidth = KeyboardParser.getDimensionOrFraction(a,
|
||||||
R.styleable.Keyboard_keyWidth,
|
R.styleable.Keyboard_keyWidth, keyboardWidth, keyboard.getKeyWidth());
|
||||||
parent.mDisplayWidth, parent.mDefaultWidth);
|
|
||||||
mDefaultHeight = KeyboardParser.getDimensionOrFraction(a,
|
mDefaultHeight = KeyboardParser.getDimensionOrFraction(a,
|
||||||
R.styleable.Keyboard_keyHeight,
|
R.styleable.Keyboard_keyHeight, keyboardHeight, keyboard.getKeyHeight());
|
||||||
parent.mDisplayHeight, parent.mDefaultHeight);
|
|
||||||
mDefaultHorizontalGap = KeyboardParser.getDimensionOrFraction(a,
|
mDefaultHorizontalGap = KeyboardParser.getDimensionOrFraction(a,
|
||||||
R.styleable.Keyboard_horizontalGap,
|
R.styleable.Keyboard_horizontalGap, keyboardWidth, keyboard.getHorizontalGap());
|
||||||
parent.mDisplayWidth, parent.mDefaultHorizontalGap);
|
|
||||||
mVerticalGap = KeyboardParser.getDimensionOrFraction(a,
|
mVerticalGap = KeyboardParser.getDimensionOrFraction(a,
|
||||||
R.styleable.Keyboard_verticalGap,
|
R.styleable.Keyboard_verticalGap, keyboardHeight, keyboard.getVerticalGap());
|
||||||
parent.mDisplayHeight, parent.mDefaultVerticalGap);
|
|
||||||
a.recycle();
|
a.recycle();
|
||||||
a = res.obtainAttributes(Xml.asAttributeSet(parser),
|
a = res.obtainAttributes(Xml.asAttributeSet(parser),
|
||||||
R.styleable.Keyboard_Row);
|
R.styleable.Keyboard_Row);
|
||||||
mRowEdgeFlags = a.getInt(R.styleable.Keyboard_Row_rowEdgeFlags, 0);
|
mRowEdgeFlags = a.getInt(R.styleable.Keyboard_Row_rowEdgeFlags, 0);
|
||||||
|
a.recycle();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Keyboard getKeyboard() {
|
||||||
|
return mKeyboard;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue