Skip to content

Commit 79e36db

Browse files
authored
Resize keyboard dimensions (#238)
* support a switch tag around the root keyboard tag * make the number row the same height as the other rows (still need to add numbers to support large devices) * add numbers to support large devices * add extra characters to the number row * reduced some duplicate code and removed more keys on the number row * removed special characters on the number row
1 parent 3b2beee commit 79e36db

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+629
-590
lines changed

app/src/main/java/rkr/simplekeyboard/inputmethod/keyboard/KeyboardId.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public final class KeyboardId {
5454
public static final int ELEMENT_NUMBER = 9;
5555

5656
public final RichInputMethodSubtype mSubtype;
57+
public final int mThemeId;
5758
public final int mWidth;
5859
public final int mHeight;
5960
public final int mMode;
@@ -68,6 +69,7 @@ public final class KeyboardId {
6869

6970
public KeyboardId(final int elementId, final KeyboardLayoutSet.Params params) {
7071
mSubtype = params.mSubtype;
72+
mThemeId = params.mKeyboardThemeId;
7173
mWidth = params.mKeyboardWidth;
7274
mHeight = params.mKeyboardHeight;
7375
mMode = params.mMode;
@@ -96,6 +98,7 @@ private static int computeHashCode(final KeyboardId id) {
9698
id.navigateNext(),
9799
id.navigatePrevious(),
98100
id.mSubtype,
101+
id.mThemeId
99102
});
100103
}
101104

@@ -113,7 +116,8 @@ private boolean equals(final KeyboardId other) {
113116
&& TextUtils.equals(other.mCustomActionLabel, mCustomActionLabel)
114117
&& other.navigateNext() == navigateNext()
115118
&& other.navigatePrevious() == navigatePrevious()
116-
&& other.mSubtype.equals(mSubtype);
119+
&& other.mSubtype.equals(mSubtype)
120+
&& other.mThemeId == mThemeId;
117121
}
118122

119123
private static boolean isAlphabetKeyboard(final int elementId) {
@@ -164,7 +168,7 @@ public int hashCode() {
164168

165169
@Override
166170
public String toString() {
167-
return String.format(Locale.ROOT, "[%s %s:%s %dx%d %s %s%s%s%s%s%s%s%s%s]",
171+
return String.format(Locale.ROOT, "[%s %s:%s %dx%d %s %s%s%s%s%s%s %s]",
168172
elementIdToName(mElementId),
169173
mSubtype.getLocale(),
170174
mSubtype.getExtraValueOf(KEYBOARD_LAYOUT_SET),
@@ -175,7 +179,8 @@ public String toString() {
175179
(navigatePrevious() ? " navigatePrevious" : ""),
176180
(passwordInput() ? " passwordInput" : ""),
177181
(mLanguageSwitchKeyEnabled ? " languageSwitchKeyEnabled" : ""),
178-
(isMultiLine() ? " isMultiLine" : "")
182+
(isMultiLine() ? " isMultiLine" : ""),
183+
KeyboardTheme.getKeyboardThemeName(mThemeId)
179184
);
180185
}
181186

app/src/main/java/rkr/simplekeyboard/inputmethod/keyboard/KeyboardLayoutSet.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public static final class Params {
9595
EditorInfo mEditorInfo;
9696
boolean mLanguageSwitchKeyEnabled;
9797
RichInputMethodSubtype mSubtype;
98+
int mKeyboardThemeId;
9899
int mKeyboardWidth;
99100
int mKeyboardHeight;
100101
boolean mShowMoreKeys;
@@ -213,6 +214,11 @@ public Builder(final Context context, final EditorInfo ei) {
213214
params.mEditorInfo = editorInfo;
214215
}
215216

217+
public Builder setKeyboardTheme(final int themeId) {
218+
mParams.mKeyboardThemeId = themeId;
219+
return this;
220+
}
221+
216222
public Builder setKeyboardGeometry(final int keyboardWidth, final int keyboardHeight) {
217223
mParams.mKeyboardWidth = keyboardWidth;
218224
mParams.mKeyboardHeight = keyboardHeight;

app/src/main/java/rkr/simplekeyboard/inputmethod/keyboard/KeyboardSwitcher.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ public void loadKeyboard(final EditorInfo editorInfo, final SettingsValues setti
105105
final Resources res = mThemeContext.getResources();
106106
final int keyboardWidth = mLatinIME.getMaxWidth();
107107
final int keyboardHeight = ResourceUtils.getKeyboardHeight(res, settingsValues);
108+
builder.setKeyboardTheme(mKeyboardTheme.mThemeId);
108109
builder.setKeyboardGeometry(keyboardWidth, keyboardHeight);
109110
builder.setSubtype(mRichImm.getCurrentSubtype());
110111
builder.setLanguageSwitchKeyEnabled(mLatinIME.shouldShowLanguageSwitchKey());

app/src/main/java/rkr/simplekeyboard/inputmethod/keyboard/internal/KeyboardBuilder.java

Lines changed: 58 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
140140
private float mCurrentY = 0;
141141
private KeyboardRow mCurrentRow = null;
142142
private Key mPreviousKeyInRow = null;
143+
private boolean mKeyboardDefined = false;
143144

144145
public KeyboardBuilder(final Context context, final KP params) {
145146
mContext = context;
@@ -160,7 +161,10 @@ public KeyboardBuilder<KP> load(final int xmlId, final KeyboardId id) {
160161
mParams.mId = id;
161162
final XmlResourceParser parser = mResources.getXml(xmlId);
162163
try {
163-
parseKeyboard(parser);
164+
parseKeyboard(parser, false);
165+
if (!mKeyboardDefined) {
166+
throw new XmlParseUtils.ParseException("No " + TAG_KEYBOARD + " tag was found");
167+
}
164168
} catch (XmlPullParserException e) {
165169
Log.w(BUILDER_TAG, "keyboard XML parse error", e);
166170
throw new IllegalArgumentException(e.getMessage(), e);
@@ -197,20 +201,37 @@ private void startEndTag(final String format, final Object ... args) {
197201
mIndent--;
198202
}
199203

200-
private void parseKeyboard(final XmlPullParser parser)
204+
private void parseKeyboard(final XmlPullParser parser, final boolean skip)
201205
throws XmlPullParserException, IOException {
202-
if (DEBUG) startTag("<%s> %s", TAG_KEYBOARD, mParams.mId);
203206
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
204207
final int event = parser.next();
205208
if (event == XmlPullParser.START_TAG) {
206209
final String tag = parser.getName();
207210
if (TAG_KEYBOARD.equals(tag)) {
208-
parseKeyboardAttributes(parser);
209-
startKeyboard();
210-
parseKeyboardContent(parser, false);
211+
if (DEBUG) startTag("<%s> %s%s", TAG_KEYBOARD, mParams.mId,
212+
skip ? " skipped" : "");
213+
if (!skip) {
214+
if (mKeyboardDefined) {
215+
throw new XmlParseUtils.ParseException("Only one " + TAG_KEYBOARD
216+
+ " tag can be defined", parser);
217+
}
218+
mKeyboardDefined = true;
219+
parseKeyboardAttributes(parser);
220+
startKeyboard();
221+
}
222+
parseKeyboardContent(parser, skip);
223+
} else if (TAG_SWITCH.equals(tag)) {
224+
parseSwitchKeyboard(parser, skip);
225+
} else {
226+
throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_KEYBOARD);
227+
}
228+
} else if (event == XmlPullParser.END_TAG) {
229+
final String tag = parser.getName();
230+
if (DEBUG) endTag("</%s>", tag);
231+
if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag)) {
211232
return;
212233
}
213-
throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_KEYBOARD);
234+
throw new XmlParseUtils.IllegalEndTag(parser, tag, TAG_ROW);
214235
}
215236
}
216237
}
@@ -224,7 +245,11 @@ private void parseKeyboardAttributes(final XmlPullParser parser) {
224245
final KeyboardParams params = mParams;
225246
final int height = params.mId.mHeight;
226247
final int width = params.mId.mWidth;
227-
params.mOccupiedHeight = height;
248+
// The bonus height isn't used to determine the other dimensions (gap/padding) to allow
249+
// those to stay consistent between layouts with and without the bonus height added.
250+
final int bonusHeight = mParams.mId.mShowNumberRow ? Math.round(mResources.getFraction(
251+
R.fraction.config_key_bonus_height_5row, height, height)) : 0;
252+
params.mOccupiedHeight = height + bonusHeight;
228253
params.mOccupiedWidth = width;
229254
params.mTopPadding = ResourceUtils.getDimensionOrFraction(keyboardAttr,
230255
R.styleable.Keyboard_keyboardTopPadding, height, 0);
@@ -261,7 +286,6 @@ private void parseKeyboardAttributes(final XmlPullParser parser) {
261286
params.mMaxMoreKeysKeyboardColumn = keyAttr.getInt(
262287
R.styleable.Keyboard_Key_maxMoreKeysColumn, 5);
263288

264-
params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0);
265289
params.mIconsSet.loadIcons(keyboardAttr);
266290
params.mTextsSet.setLocale(params.mId.getLocale(), mContext);
267291
} finally {
@@ -484,28 +508,33 @@ private void parseMerge(final XmlPullParser parser, final KeyboardRow row, final
484508
}
485509
}
486510

511+
private void parseSwitchKeyboard(final XmlPullParser parser, final boolean skip)
512+
throws XmlPullParserException, IOException {
513+
parseSwitchInternal(parser, true, null, skip);
514+
}
515+
487516
private void parseSwitchKeyboardContent(final XmlPullParser parser, final boolean skip)
488517
throws XmlPullParserException, IOException {
489-
parseSwitchInternal(parser, null, skip);
518+
parseSwitchInternal(parser, false, null, skip);
490519
}
491520

492521
private void parseSwitchRowContent(final XmlPullParser parser, final KeyboardRow row,
493522
final boolean skip) throws XmlPullParserException, IOException {
494-
parseSwitchInternal(parser, row, skip);
523+
parseSwitchInternal(parser, false, row, skip);
495524
}
496525

497-
private void parseSwitchInternal(final XmlPullParser parser, final KeyboardRow row,
498-
final boolean skip) throws XmlPullParserException, IOException {
526+
private void parseSwitchInternal(final XmlPullParser parser, final boolean parseKeyboard,
527+
final KeyboardRow row, final boolean skip) throws XmlPullParserException, IOException {
499528
if (DEBUG) startTag("<%s> %s", TAG_SWITCH, mParams.mId);
500529
boolean selected = false;
501530
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
502531
final int event = parser.next();
503532
if (event == XmlPullParser.START_TAG) {
504533
final String tag = parser.getName();
505534
if (TAG_CASE.equals(tag)) {
506-
selected |= parseCase(parser, row, selected || skip);
535+
selected |= parseCase(parser, parseKeyboard, row, selected || skip);
507536
} else if (TAG_DEFAULT.equals(tag)) {
508-
selected |= parseDefault(parser, row, selected || skip);
537+
selected |= parseDefault(parser, parseKeyboard, row, selected || skip);
509538
} else {
510539
throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_SWITCH);
511540
}
@@ -520,10 +549,13 @@ private void parseSwitchInternal(final XmlPullParser parser, final KeyboardRow r
520549
}
521550
}
522551

523-
private boolean parseCase(final XmlPullParser parser, final KeyboardRow row, final boolean skip)
524-
throws XmlPullParserException, IOException {
552+
private boolean parseCase(final XmlPullParser parser, final boolean parseKeyboard,
553+
final KeyboardRow row, final boolean skip) throws XmlPullParserException, IOException {
525554
final boolean selected = parseCaseCondition(parser);
526-
if (row == null) {
555+
if (parseKeyboard) {
556+
// Processing Keyboard root.
557+
parseKeyboard(parser, !selected || skip);
558+
} else if (row == null) {
527559
// Processing Rows.
528560
parseKeyboardContent(parser, !selected || skip);
529561
} else {
@@ -540,6 +572,7 @@ private boolean parseCaseCondition(final XmlPullParser parser) {
540572
}
541573
final AttributeSet attr = Xml.asAttributeSet(parser);
542574
final TypedArray caseAttr = mResources.obtainAttributes(attr, R.styleable.Keyboard_Case);
575+
if (DEBUG) startTag("<%s>", TAG_CASE);
543576
try {
544577
final boolean keyboardLayoutSetMatched = matchString(caseAttr,
545578
R.styleable.Keyboard_Case_keyboardLayoutSet,
@@ -548,8 +581,8 @@ private boolean parseCaseCondition(final XmlPullParser parser) {
548581
R.styleable.Keyboard_Case_keyboardLayoutSetElement, id.mElementId,
549582
KeyboardId.elementIdToName(id.mElementId));
550583
final boolean keyboardThemeMatched = matchTypedValue(caseAttr,
551-
R.styleable.Keyboard_Case_keyboardTheme, mParams.mThemeId,
552-
KeyboardTheme.getKeyboardThemeName(mParams.mThemeId));
584+
R.styleable.Keyboard_Case_keyboardTheme, id.mThemeId,
585+
KeyboardTheme.getKeyboardThemeName(id.mThemeId));
553586
final boolean modeMatched = matchTypedValue(caseAttr,
554587
R.styleable.Keyboard_Case_mode, id.mMode, KeyboardId.modeName(id.mMode));
555588
final boolean navigateNextMatched = matchBoolean(caseAttr,
@@ -647,10 +680,12 @@ private static boolean isIconDefined(final TypedArray a, final int index,
647680
return iconsSet.getIconDrawable(iconId) != null;
648681
}
649682

650-
private boolean parseDefault(final XmlPullParser parser, final KeyboardRow row,
651-
final boolean skip) throws XmlPullParserException, IOException {
683+
private boolean parseDefault(final XmlPullParser parser, final boolean parseKeyboard,
684+
final KeyboardRow row, final boolean skip) throws XmlPullParserException, IOException {
652685
if (DEBUG) startTag("<%s>", TAG_DEFAULT);
653-
if (row == null) {
686+
if (parseKeyboard) {
687+
parseKeyboard(parser, skip);
688+
} else if (row == null) {
654689
parseKeyboardContent(parser, skip);
655690
} else {
656691
parseRowContent(parser, row, skip);

app/src/main/java/rkr/simplekeyboard/inputmethod/keyboard/internal/KeyboardParams.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929

3030
public class KeyboardParams {
3131
public KeyboardId mId;
32-
public int mThemeId;
3332

3433
/** Total height and width of the keyboard, including the paddings and keys */
3534
public int mOccupiedHeight;

app/src/main/java/rkr/simplekeyboard/inputmethod/latin/utils/ResourceUtils.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,6 @@ private static boolean fulfillsCondition(final HashMap<String,String> keyValuePa
183183
public static int getKeyboardHeight(final Resources res, final SettingsValues settingsValues) {
184184
final int defaultKeyboardHeight = getDefaultKeyboardHeight(res);
185185
float scale = settingsValues.mKeyboardHeightScale;
186-
if (settingsValues.mShowNumberRow)
187-
scale += 0.1;
188186
return (int)(defaultKeyboardHeight * scale);
189187
}
190188

app/src/main/java/rkr/simplekeyboard/inputmethod/latin/utils/XmlParseUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ private XmlParseUtils() {
3030

3131
@SuppressWarnings("serial")
3232
public static class ParseException extends XmlPullParserException {
33+
public ParseException(final String msg) {
34+
super(msg);
35+
}
3336
public ParseException(final String msg, final XmlPullParser parser) {
3437
super(msg + " at " + parser.getPositionDescription());
3538
}

app/src/main/res/values-land/config.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,14 @@
5454
<fraction name="config_language_on_spacebar_text_ratio">40.000%</fraction>
5555

5656
<!-- For 5-row keyboard -->
57+
<!-- config_key_vertical_gap_5row is calculated to match config_key_horizontal_gap from the
58+
portrait layout (assuming the height is based on config_min_keyboard_height) to have a
59+
general guideline for a minimum gap between keys. For a 5 row keyboard, we shouldn't waste
60+
unnecessary space on the gap. -->
61+
<fraction name="config_key_vertical_gap_5row">3.864%p</fraction>
62+
<!-- config_key_bonus_height_5row ideally would be calculated to be the extra height necessary
63+
to keep the 5 and 4 row keyboards' keys the same height, but there isn't enough space
64+
solely from reducing the vertical gap, so it's just capped to prevent taking up too much
65+
space. -->
66+
<fraction name="config_key_bonus_height_5row">10%p</fraction>
5767
</resources>

app/src/main/res/values-sw600dp-land/config.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,10 @@
4545
<dimen name="config_key_shifted_letter_hint_padding">4dp</dimen>
4646

4747
<!-- For 5-row keyboard -->
48+
<!-- config_key_vertical_gap_5row should match config_key_vertical_gap -->
49+
<fraction name="config_key_vertical_gap_5row">4.5%p</fraction>
50+
<!-- config_key_bonus_height_5row ideally would be calculated to be the extra height necessary
51+
to keep the 5 and 4 row keyboards' keys the same height, but it needs to be capped to
52+
prevent taking up too much space. -->
53+
<fraction name="config_key_bonus_height_5row">15%p</fraction>
4854
</resources>

app/src/main/res/values-sw600dp/config.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@
5454
<dimen name="config_key_shifted_letter_hint_padding">3dp</dimen>
5555

5656
<!-- For 5-row keyboard -->
57+
<!-- config_key_vertical_gap_5row should match config_key_vertical_gap -->
58+
<fraction name="config_key_vertical_gap_5row">4.5%p</fraction>
59+
<!-- config_key_bonus_height_5row is calculated to be the extra height necessary to keep the 5
60+
and 4 row keyboards' keys the same height. -->
61+
<fraction name="config_key_bonus_height_5row">25.096%p</fraction>
5762
</resources>

0 commit comments

Comments
 (0)