Fix the bottom row of tablet keyboard layout

This CL eliminates "_" and "/" keys from the bottom row of tablet
keyboard.  This CL also reorganizes the bottom row of tablet Dvorak
keyboard.

Bug: 16603887
Change-Id: Ic1570836dea1a475bed5d43aeb6a351507bf5428
main
Tadashi G. Takaoka 2014-08-23 19:08:40 +09:00
parent 2637be27c5
commit c9aa1beb6d
39 changed files with 592 additions and 292 deletions

View File

@ -2,7 +2,7 @@
<!-- <!--
/* /*
** **
** Copyright 2014, The Android Open Source Project ** Copyright 2012, The Android Open Source Project
** **
** Licensed under the Apache License, Version 2.0 (the "License"); ** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License. ** you may not use this file except in compliance with the License.
@ -21,27 +21,36 @@
<merge <merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
> >
<!-- The table comma key which may have settings as popup key. -->
<!-- Kept as a separate file for cleaner overriding by an overlay. -->
<key-style
latin:styleName="baseTabletCommaKeyStyle"
latin:keySpec="!text/keyspec_tablet_comma"
latin:keyHintLabel="!text/keyhintlabel_tablet_comma"
latin:keyLabelFlags="hasPopupHint"
latin:parentStyle="hasShiftedLetterHintStyle" />
<switch> <switch>
<case <case
latin:clobberSettingsKey="true" latin:mode="url"
> >
<Key <Key
latin:moreKeys="!text/morekeys_tablet_comma" latin:keySpec="/"
latin:keyStyle="baseTabletCommaKeyStyle" /> latin:keyStyle="settingsMoreKeysStyle" />
</case>
<case
latin:mode="email"
>
<Key
latin:keySpec="\@"
latin:keyStyle="settingsMoreKeysStyle" />
</case>
<case
latin:keyboardLayoutSet="dvorak"
>
<Key
latin:keySpec="!"
latin:moreKeys="!text/morekeys_exclamation,%"
latin:keyStyle="settingsMoreKeysStyle" />
</case> </case>
<!-- clobberSettingsKey="false" -->
<default> <default>
<Key <Key
latin:moreKeys="!text/morekeys_tablet_comma,!text/keyspec_settings" latin:keySpec="!text/keyspec_tablet_comma"
latin:keyStyle="baseTabletCommaKeyStyle" /> latin:moreKeys="!text/morekeys_tablet_comma,%"
latin:keyHintLabel="!text/keyhintlabel_tablet_comma"
latin:keyLabelFlags="hasPopupHint"
latin:keyStyle="settingsMoreKeysStyle" />
</default> </default>
</switch> </switch>
</merge> </merge>

View File

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2012, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<switch>
<case
latin:mode="email"
>
<Key
latin:keySpec="\@" />
</case>
<default>
<Key
latin:keySpec="/" />
</default>
</switch>
</merge>

View File

@ -35,6 +35,13 @@
latin:moreKeys="!autoColumnOrder!8,\\,,.,',#,),(,/,;,@,:,-,&quot;,+,\\%,&amp;" latin:moreKeys="!autoColumnOrder!8,\\,,.,',#,),(,/,;,@,:,-,&quot;,+,\\%,&amp;"
latin:backgroundType="functional" /> latin:backgroundType="functional" />
</case> </case>
<case
latin:keyboardLayoutSet="dvorak"
>
<Key
latin:keySpec="\?"
latin:moreKeys="!text/morekeys_tablet_period,!text/morekeys_question" />
</case>
<default> <default>
<Key <Key
latin:keySpec="!text/keyspec_tablet_period" latin:keySpec="!text/keyspec_tablet_period"

View File

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2012, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<switch>
<case
latin:mode="email|url"
>
<Key
latin:keySpec="-" />
</case>
<default>
<Key
latin:keySpec="\?"
latin:keyHintLabel="!"
latin:moreKeys="!"
latin:keyStyle="hasShiftedLetterHintStyle" />
</default>
</switch>
</merge>

View File

@ -34,7 +34,7 @@
latin:keyStyle="languageSwitchKeyStyle" /> latin:keyStyle="languageSwitchKeyStyle" />
<Key <Key
latin:keyStyle="spaceKeyStyle" latin:keyStyle="spaceKeyStyle"
latin:keyWidth="27.0%p" /> latin:keyWidth="45.0%p" />
<Key <Key
latin:keyStyle="zwnjKeyStyle" /> latin:keyStyle="zwnjKeyStyle" />
</case> </case>
@ -44,7 +44,7 @@
> >
<Key <Key
latin:keyStyle="spaceKeyStyle" latin:keyStyle="spaceKeyStyle"
latin:keyWidth="36.0%p" /> latin:keyWidth="54.0%p" />
<Key <Key
latin:keyStyle="zwnjKeyStyle" /> latin:keyStyle="zwnjKeyStyle" />
</case> </case>
@ -55,13 +55,13 @@
latin:keyStyle="languageSwitchKeyStyle" /> latin:keyStyle="languageSwitchKeyStyle" />
<Key <Key
latin:keyStyle="spaceKeyStyle" latin:keyStyle="spaceKeyStyle"
latin:keyWidth="36.0%p" /> latin:keyWidth="54.0%p" />
</case> </case>
<!-- languageSwitchKeyEnabled="false" --> <!-- languageSwitchKeyEnabled="false" -->
<default> <default>
<Key <Key
latin:keyStyle="spaceKeyStyle" latin:keyStyle="spaceKeyStyle"
latin:keyWidth="45.0%p" /> latin:keyWidth="63.0%p" />
</default> </default>
</switch> </switch>
</merge> </merge>

View File

@ -36,6 +36,9 @@
</default> </default>
</switch> </switch>
<!-- Base key style for the key which may have settings key as more keys. --> <!-- Base key style for the key which may have settings key as more keys. -->
<key-style
latin:styleName="baseSettingsMoreKeysStyle"
latin:parentStyle="hasShiftedLetterHintStyle" />
<include <include
latin:keyboardLayout="@xml/key_styles_settings" /> latin:keyboardLayout="@xml/key_styles_settings" />
<!-- Functional key styles --> <!-- Functional key styles -->

View File

@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2012, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<Row
latin:keyWidth="9.0%p"
latin:backgroundType="functional"
>
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyWidth="10.0%p" />
<include
latin:keyboardLayout="@xml/key_settings" />
<Key
latin:keySpec="_"
latin:keyHintLabel="-"
latin:moreKeys="-"
latin:keyStyle="hasShiftedLetterHintStyle" />
<include
latin:keyXPos="28.0%p"
latin:keyboardLayout="@xml/key_space_5kw"
latin:backgroundType="normal" />
<include
latin:keyboardLayout="@xml/key_f1" />
<include
latin:keyboardLayout="@xml/key_question_exclamation" />
<include
latin:keyboardLayout="@xml/key_f2" />
</Row>
</merge>

View File

@ -50,6 +50,6 @@
latin:keyXPos="-9.0%p" latin:keyXPos="-9.0%p"
latin:keyWidth="9.0%p" latin:keyWidth="9.0%p"
latin:backgroundType="functional" latin:backgroundType="functional"
latin:keyboardLayout="@xml/key_f2" /> latin:keyboardLayout="@xml/key_emoji" />
</Row> </Row>
</merge> </merge>

View File

@ -30,18 +30,14 @@
latin:keyWidth="10.0%p" /> latin:keyWidth="10.0%p" />
<include <include
latin:keyboardLayout="@xml/key_comma" /> latin:keyboardLayout="@xml/key_comma" />
<Key
latin:keySpec="_" />
<!-- Space key. --> <!-- Space key. -->
<include <include
latin:keyXPos="28.0%p" latin:keyXPos="19.0%p"
latin:keyboardLayout="@xml/key_space_5kw" latin:keyboardLayout="@xml/key_space_7kw"
latin:backgroundType="normal" /> latin:backgroundType="normal" />
<include
latin:keyboardLayout="@xml/key_f1" />
<include <include
latin:keyboardLayout="@xml/key_period" /> latin:keyboardLayout="@xml/key_period" />
<include <include
latin:keyboardLayout="@xml/key_f2" /> latin:keyboardLayout="@xml/key_emoji" />
</Row> </Row>
</merge> </merge>

View File

@ -53,6 +53,8 @@
latin:keyStyle="shiftKeyStyle" latin:keyStyle="shiftKeyStyle"
latin:keyWidth="fillRight" /> latin:keyWidth="fillRight" />
</Row> </Row>
<!-- Dvorak layout shares almost the same row with Qwerty layout.
The difference is defined in xml-sw600dp/row_qwerty4.xml. -->
<include <include
latin:keyboardLayout="@xml/row_dvorak4" /> latin:keyboardLayout="@xml/row_qwerty4" />
</merge> </merge>

View File

@ -70,6 +70,6 @@
<include <include
latin:keyboardLayout="@xml/row_symbols4" /> latin:keyboardLayout="@xml/row_symbols4" />
<include <include
latin:keyboardLayout="@xml/key_f2" /> latin:keyboardLayout="@xml/key_emoji" />
</Row> </Row>
</merge> </merge>

View File

@ -72,6 +72,6 @@
<include <include
latin:keyboardLayout="@xml/row_symbols_shift4" /> latin:keyboardLayout="@xml/row_symbols_shift4" />
<include <include
latin:keyboardLayout="@xml/key_f2" /> latin:keyboardLayout="@xml/key_emoji" />
</Row> </Row>
</merge> </merge>

View File

@ -22,6 +22,15 @@
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
> >
<switch> <switch>
<case
latin:keyboardLayoutSet="dvorak"
>
<Key
latin:keySpec="q"
latin:moreKeys="!text/morekeys_q,%"
latin:backgroundType="normal"
latin:keyStyle="settingsMoreKeysStyle" />
</case>
<case <case
latin:mode="url" latin:mode="url"
> >

View File

@ -48,6 +48,14 @@
latin:moreKeys="!text/morekeys_punctuation" latin:moreKeys="!text/morekeys_punctuation"
latin:backgroundType="functional" /> latin:backgroundType="functional" />
</case> </case>
<case
latin:keyboardLayoutSet="dvorak"
>
<Key
latin:keySpec="z"
latin:keyLabelFlags="hasPopupHint"
latin:moreKeys="!text/morekeys_punctuation,!text/morekeys_z" />
</case>
<default> <default>
<Key <Key
latin:keySpec="!text/keyspec_period" latin:keySpec="!text/keyspec_period"

View File

@ -36,6 +36,8 @@
</default> </default>
</switch> </switch>
<!-- Base key style for the key which may have settings key as more keys. --> <!-- Base key style for the key which may have settings key as more keys. -->
<key-style
latin:styleName="baseSettingsMoreKeysStyle" />
<include <include
latin:keyboardLayout="@xml/key_styles_settings" /> latin:keyboardLayout="@xml/key_styles_settings" />
<!-- Functional key styles --> <!-- Functional key styles -->

View File

@ -29,15 +29,17 @@
> >
<key-style <key-style
latin:styleName="settingsMoreKeysStyle" latin:styleName="settingsMoreKeysStyle"
latin:backgroundType="functional" /> latin:backgroundType="functional"
latin:parentStyle="baseSettingsMoreKeysStyle" />
</case> </case>
<!-- clobberSettingsKey="false" --> <!-- clobberSettingsKey="false" -->
<default> <default>
<key-style <key-style
latin:styleName="settingsMoreKeysStyle" latin:styleName="settingsMoreKeysStyle"
latin:keyLabelFlags="hasPopupHint" latin:keyLabelFlags="hasPopupHint"
latin:moreKeys="!text/keyspec_settings" latin:additionalMoreKeys="!text/keyspec_settings"
latin:backgroundType="functional" /> latin:backgroundType="functional"
latin:parentStyle="baseSettingsMoreKeysStyle" />
</default> </default>
</switch> </switch>
</merge> </merge>

View File

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2012, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<Row
latin:keyWidth="10%p"
>
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyWidth="15%p" />
<Key
latin:keySpec="q"
latin:backgroundType="normal"
latin:keyStyle="settingsMoreKeysStyle" />
<include
latin:keyXPos="25%p"
latin:keyboardLayout="@xml/key_space_5kw" />
<Key
latin:keySpec="z"
latin:keyLabelFlags="hasPopupHint"
latin:moreKeys="!text/morekeys_punctuation,!text/morekeys_z" />
<Key
latin:keyStyle="enterKeyStyle"
latin:keyWidth="fillRight" />
</Row>
</merge>

View File

@ -28,7 +28,7 @@
latin:keyStyle="toSymbolKeyStyle" latin:keyStyle="toSymbolKeyStyle"
latin:keyWidth="15%p" /> latin:keyWidth="15%p" />
<include <include
latin:keyboardLayout="@xml/key_f1" /> latin:keyboardLayout="@xml/key_comma" />
<include <include
latin:keyXPos="25%p" latin:keyXPos="25%p"
latin:keyboardLayout="@xml/key_space_5kw" /> latin:keyboardLayout="@xml/key_space_5kw" />

View File

@ -49,6 +49,8 @@
latin:keyWidth="fillRight" latin:keyWidth="fillRight"
latin:visualInsetsLeft="1%p" /> latin:visualInsetsLeft="1%p" />
</Row> </Row>
<!-- Dvorak layout shares almost the same row with Qwerty layout.
The difference is defined in xml/row_qwerty4.xml. -->
<include <include
latin:keyboardLayout="@xml/row_dvorak4" /> latin:keyboardLayout="@xml/row_qwerty4" />
</merge> </merge>

View File

@ -112,13 +112,13 @@ public abstract class KeyboardLayoutSetTestsBase extends AndroidTestCase {
"Unknown subtype: locale=" + locale + " keyboardLayout=" + keyboardLayout); "Unknown subtype: locale=" + locale + " keyboardLayout=" + keyboardLayout);
} }
protected final KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
final EditorInfo editorInfo) { final EditorInfo editorInfo) {
return createKeyboardLayoutSet(subtype, editorInfo, false /* voiceInputKeyEnabled */, return createKeyboardLayoutSet(subtype, editorInfo, false /* voiceInputKeyEnabled */,
false /* languageSwitchKeyEnabled */); false /* languageSwitchKeyEnabled */);
} }
protected final KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
final EditorInfo editorInfo, final boolean voiceInputKeyEnabled, final EditorInfo editorInfo, final boolean voiceInputKeyEnabled,
final boolean languageSwitchKeyEnabled) { final boolean languageSwitchKeyEnabled) {
final Context context = mThemeContext; final Context context = mThemeContext;

View File

@ -78,8 +78,7 @@ public final class Arabic extends LayoutBase {
// U+061F: "؟" ARABIC QUESTION MARK // U+061F: "؟" ARABIC QUESTION MARK
// U+061B: "؛" ARABIC SEMICOLON // U+061B: "؛" ARABIC SEMICOLON
return joinKeys(key("\u060C", joinMoreKeys( return joinKeys(key("\u060C", joinMoreKeys(
":", "!", "\u061F", "\u061B", "-", "\"", "'", SETTINGS_KEY)), ":", "!", "\u061F", "\u061B", "-", "\"", "'", SETTINGS_KEY)));
"_");
} }
@Override @Override
@ -90,7 +89,7 @@ public final class Arabic extends LayoutBase {
// U+060C: "،" ARABIC COMMA // U+060C: "،" ARABIC COMMA
// U+061F: "؟" ARABIC QUESTION MARK // U+061F: "؟" ARABIC QUESTION MARK
// U+061B: "؛" ARABIC SEMICOLON // U+061B: "؛" ARABIC SEMICOLON
return joinKeys("/", key(".", getPunctuationMoreKeys(isPhone))); return joinKeys(key(".", getPunctuationMoreKeys(isPhone)));
} }
@Override @Override

View File

@ -62,14 +62,14 @@ public final class ArmenianPhonetic extends LayoutBase {
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) { public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
// U+055D: "՝" ARMENIAN COMMA // U+055D: "՝" ARMENIAN COMMA
return isPhone ? joinKeys(key("\u055D", SETTINGS_KEY)) return isPhone ? joinKeys(key("\u055D", SETTINGS_KEY))
: joinKeys(key("\u055D", SETTINGS_KEY), "_"); : joinKeys(key("\u055D", SETTINGS_KEY));
} }
@Override @Override
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) { public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
// U+0589: "։" ARMENIAN FULL STOP // U+0589: "։" ARMENIAN FULL STOP
final ExpectedKey fullStopKey = key("\u0589", getPunctuationMoreKeys(isPhone)); final ExpectedKey fullStopKey = key("\u0589", getPunctuationMoreKeys(isPhone));
return isPhone ? joinKeys(fullStopKey) : joinKeys("/", fullStopKey); return joinKeys(fullStopKey);
} }
@Override @Override

View File

@ -20,13 +20,14 @@ import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey; import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder; import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey; import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey;
import com.android.inputmethod.latin.settings.CustomInputStyleSettingsFragment;
import java.util.Locale; import java.util.Locale;
/** /**
* The QWERTY alphabet keyboard. * The Dvorak alphabet keyboard.
*/ */
public final class Dvorak extends LayoutBase { public class Dvorak extends LayoutBase {
private static final String LAYOUT_NAME = "dvorak"; private static final String LAYOUT_NAME = "dvorak";
public Dvorak(final LayoutCustomizer customizer) { public Dvorak(final LayoutCustomizer customizer) {
@ -51,17 +52,19 @@ public final class Dvorak extends LayoutBase {
@Override @Override
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) { public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
return isPhone ? joinKeys(key("q", SETTINGS_KEY)) : // U+00A1: "¡" INVERTED EXCLAMATION MARK
joinKeys(SETTINGS_KEY, key("_", moreKey("-"))); return isPhone ? joinKeys(key("q", SETTINGS_KEY))
: joinKeys(key("!", joinMoreKeys("\u00A1", SETTINGS_KEY)));
} }
@Override @Override
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) { public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
final ExpectedAdditionalMoreKey[] punctuationMoreKeys = final ExpectedAdditionalMoreKey[] punctuationMoreKeys =
convertToAdditionalMoreKeys(getPunctuationMoreKeys(isPhone)); convertToAdditionalMoreKeys(getPunctuationMoreKeys(isPhone));
// U+00BF: "¿" INVERTED QUESTION MARK
return isPhone return isPhone
? joinKeys(key("z", punctuationMoreKeys)) ? joinKeys(key("z", punctuationMoreKeys))
: joinKeys("/", key("?", moreKey("!"))); : joinKeys(key("?", joinMoreKeys(punctuationMoreKeys, "\u00BF")));
} }
private static ExpectedAdditionalMoreKey[] convertToAdditionalMoreKeys( private static ExpectedAdditionalMoreKey[] convertToAdditionalMoreKeys(
@ -76,7 +79,33 @@ public final class Dvorak extends LayoutBase {
} }
@Override @Override
ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; } public ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
return ALPHABET_COMMON;
}
protected ExpectedKey getRow1_1Key(final boolean isPhone, final int elementId) {
if (elementId == KeyboardId.ELEMENT_ALPHABET
|| elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
return key("'", joinMoreKeys(additionalMoreKey("1"), "!", "\""));
}
return key("\"", additionalMoreKey("1"));
}
protected ExpectedKey getRow1_2Key(final boolean isPhone, final int elementId) {
if (elementId == KeyboardId.ELEMENT_ALPHABET
|| elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
return key(",", joinMoreKeys(additionalMoreKey("2"), "?", "<"));
}
return key("<", additionalMoreKey("2"));
}
protected ExpectedKey getRow1_3Key(final boolean isPhone, final int elementId) {
if (elementId == KeyboardId.ELEMENT_ALPHABET
|| elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
return key(".", joinMoreKeys(additionalMoreKey("3"), ">"));
}
return key(">", additionalMoreKey("3"));
}
@Override @Override
public ExpectedKey[][] getLayout(final boolean isPhone, final int elementId) { public ExpectedKey[][] getLayout(final boolean isPhone, final int elementId) {
@ -86,18 +115,9 @@ public final class Dvorak extends LayoutBase {
} }
final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder( final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(
getCommonAlphabetLayout(isPhone)); getCommonAlphabetLayout(isPhone));
if (elementId == KeyboardId.ELEMENT_ALPHABET builder.replaceKeyOfLabel(ROW1_1, getRow1_1Key(isPhone, elementId))
|| elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) { .replaceKeyOfLabel(ROW1_2, getRow1_2Key(isPhone, elementId))
builder.addKeysOnTheLeftOfRow(1, .replaceKeyOfLabel(ROW1_3, getRow1_3Key(isPhone, elementId));
key("'", joinMoreKeys(additionalMoreKey("1"), "!", "\"")),
key(",", joinMoreKeys(additionalMoreKey("2"), "?", "<")),
key(".", joinMoreKeys(additionalMoreKey("3"), ">")));
} else {
builder.addKeysOnTheLeftOfRow(1,
key("\"", additionalMoreKey("1")),
key("<", additionalMoreKey("2")),
key(">", additionalMoreKey("3")));
}
convertCommonLayoutToKeyboard(builder, isPhone); convertCommonLayoutToKeyboard(builder, isPhone);
getCustomizer().setAccentedLetters(builder); getCustomizer().setAccentedLetters(builder);
if (elementId != KeyboardId.ELEMENT_ALPHABET) { if (elementId != KeyboardId.ELEMENT_ALPHABET) {
@ -107,8 +127,13 @@ public final class Dvorak extends LayoutBase {
return builder.build(); return builder.build();
} }
public static final String ROW1_1 = "ROW1_1";
public static final String ROW1_2 = "ROW1_2";
public static final String ROW1_3 = "ROW1_3";
private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder() private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
.setKeysOfRow(1, .setKeysOfRow(1,
ROW1_1, ROW1_2, ROW1_3,
key("p", additionalMoreKey("4")), key("p", additionalMoreKey("4")),
key("y", additionalMoreKey("5")), key("y", additionalMoreKey("5")),
key("f", additionalMoreKey("6")), key("f", additionalMoreKey("6")),

View File

@ -77,8 +77,7 @@ public final class Farsi extends LayoutBase {
// U+061B: "؛" ARABIC SEMICOLON // U+061B: "؛" ARABIC SEMICOLON
return joinKeys(key("\u060C", joinMoreKeys( return joinKeys(key("\u060C", joinMoreKeys(
":", "!", "\u061F", "\u061B", "-", RtlSymbols.DOUBLE_ANGLE_QUOTES_LR_RTL, ":", "!", "\u061F", "\u061B", "-", RtlSymbols.DOUBLE_ANGLE_QUOTES_LR_RTL,
SETTINGS_KEY)), SETTINGS_KEY)));
"_");
} }
@Override @Override
@ -86,7 +85,7 @@ public final class Farsi extends LayoutBase {
if (isPhone) { if (isPhone) {
return super.getKeysRightToSpacebar(isPhone); return super.getKeysRightToSpacebar(isPhone);
} }
return joinKeys("/", key(".", getPunctuationMoreKeys(isPhone))); return joinKeys(key(".", getPunctuationMoreKeys(isPhone)));
} }
@Override @Override

View File

@ -50,7 +50,7 @@ public final class HindiCompact extends LayoutBase {
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) { public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
// U+0964: "।" DEVANAGARI DANDA // U+0964: "।" DEVANAGARI DANDA
final ExpectedKey periodKey = key("\u0964", getPunctuationMoreKeys(isPhone)); final ExpectedKey periodKey = key("\u0964", getPunctuationMoreKeys(isPhone));
return isPhone ? joinKeys(periodKey) : joinKeys("/", periodKey); return joinKeys(periodKey);
} }
@Override @Override

View File

@ -148,6 +148,24 @@ public abstract class LayoutBase extends AbstractLayoutBase {
return isPhone ? EMPTY_KEYS : joinKeys(EXCLAMATION_AND_QUESTION_MARKS, SHIFT_KEY); return isPhone ? EMPTY_KEYS : joinKeys(EXCLAMATION_AND_QUESTION_MARKS, SHIFT_KEY);
} }
/**
* Get the enter key.
* @param isPhone true if requesting phone's key.
* @return the array of {@link ExpectedKey} that should be placed as an enter key.
*/
public ExpectedKey getEnterKey(final boolean isPhone) {
return isPhone ? key(ENTER_KEY, EMOJI_ACTION_KEY) : ENTER_KEY;
}
/**
* Get the emoji key.
* @param isPhone true if requesting phone's key.
* @return the array of {@link ExpectedKey} that should be placed as an emoji key.
*/
public ExpectedKey getEmojiKey(final boolean isPhone) {
return EMOJI_NORMAL_KEY;
}
/** /**
* Get the space keys. * Get the space keys.
* @param isPhone true if requesting phone's keys. * @param isPhone true if requesting phone's keys.
@ -165,8 +183,7 @@ public abstract class LayoutBase extends AbstractLayoutBase {
*/ */
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) { public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
// U+002C: "," COMMA // U+002C: "," COMMA
return isPhone ? joinKeys(key("\u002C", SETTINGS_KEY)) return joinKeys(key("\u002C", SETTINGS_KEY));
: joinKeys(key("\u002C", SETTINGS_KEY), "_");
} }
/** /**
@ -176,7 +193,7 @@ public abstract class LayoutBase extends AbstractLayoutBase {
*/ */
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) { public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
final ExpectedKey periodKey = key(".", getPunctuationMoreKeys(isPhone)); final ExpectedKey periodKey = key(".", getPunctuationMoreKeys(isPhone));
return isPhone ? joinKeys(periodKey) : joinKeys("/", periodKey); return joinKeys(periodKey);
} }
/** /**
@ -241,7 +258,25 @@ public abstract class LayoutBase extends AbstractLayoutBase {
*/ */
public final LayoutCustomizer getCustomizer() { return mCustomizer; } public final LayoutCustomizer getCustomizer() { return mCustomizer; }
// Icon id. // Icon ids.
private static final int ICON_DELETE = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_DELETE_KEY);
private static final int ICON_SPACE = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SPACE_KEY);
private static final int ICON_TAB = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_TAB_KEY);
private static final int ICON_SHORTCUT = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SHORTCUT_KEY);
private static final int ICON_SETTINGS = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SETTINGS_KEY);
private static final int ICON_LANGUAGE_SWITCH = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_LANGUAGE_SWITCH_KEY);
private static final int ICON_ENTER = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_ENTER_KEY);
private static final int ICON_EMOJI_ACTION = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_EMOJI_ACTION_KEY);
private static final int ICON_EMOJI_NORMAL = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_EMOJI_NORMAL_KEY);
private static final int ICON_SHIFT = KeyboardIconsSet.getIconId( private static final int ICON_SHIFT = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SHIFT_KEY); KeyboardIconsSet.NAME_SHIFT_KEY);
private static final int ICON_SHIFTED_SHIFT = KeyboardIconsSet.getIconId( private static final int ICON_SHIFTED_SHIFT = KeyboardIconsSet.getIconId(
@ -251,11 +286,21 @@ public abstract class LayoutBase extends AbstractLayoutBase {
private static final int ICON_ZWJ = KeyboardIconsSet.getIconId( private static final int ICON_ZWJ = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_ZWJ_KEY); KeyboardIconsSet.NAME_ZWJ_KEY);
// Functional key. // Functional keys.
public static final ExpectedKey DELETE_KEY = key(ICON_DELETE, Constants.CODE_DELETE);
public static final ExpectedKey TAB_KEY = key(ICON_TAB, Constants.CODE_TAB);
public static final ExpectedKey SHORTCUT_KEY = key(ICON_SHORTCUT, Constants.CODE_SHORTCUT);
public static final ExpectedKey SETTINGS_KEY = key(ICON_SETTINGS, Constants.CODE_SETTINGS);
public static final ExpectedKey LANGUAGE_SWITCH_KEY = key(
ICON_LANGUAGE_SWITCH, Constants.CODE_LANGUAGE_SWITCH);
public static final ExpectedKey ENTER_KEY = key(ICON_ENTER, Constants.CODE_ENTER);
public static final ExpectedKey EMOJI_ACTION_KEY = key(ICON_EMOJI_ACTION, Constants.CODE_EMOJI);
public static final ExpectedKey EMOJI_NORMAL_KEY = key(ICON_EMOJI_NORMAL, Constants.CODE_EMOJI);
public static final ExpectedKey SPACE_KEY = key(ICON_SPACE, Constants.CODE_SPACE);
static final ExpectedKey CAPSLOCK_MORE_KEY = key(" ", Constants.CODE_CAPSLOCK); static final ExpectedKey CAPSLOCK_MORE_KEY = key(" ", Constants.CODE_CAPSLOCK);
static final ExpectedKey SHIFT_KEY = key(ICON_SHIFT, public static final ExpectedKey SHIFT_KEY = key(ICON_SHIFT,
Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY); Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY);
static final ExpectedKey SHIFTED_SHIFT_KEY = key(ICON_SHIFTED_SHIFT, public static final ExpectedKey SHIFTED_SHIFT_KEY = key(ICON_SHIFTED_SHIFT,
Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY); Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY);
static final ExpectedKey ALPHABET_KEY = key("ABC", Constants.CODE_SWITCH_ALPHA_SYMBOL); static final ExpectedKey ALPHABET_KEY = key("ABC", Constants.CODE_SWITCH_ALPHA_SYMBOL);
static final ExpectedKey SYMBOLS_KEY = key("?123", Constants.CODE_SWITCH_ALPHA_SYMBOL); static final ExpectedKey SYMBOLS_KEY = key("?123", Constants.CODE_SWITCH_ALPHA_SYMBOL);
@ -271,6 +316,9 @@ public abstract class LayoutBase extends AbstractLayoutBase {
// U+200D: ZERO WIDTH JOINER // U+200D: ZERO WIDTH JOINER
static final ExpectedKey ZWNJ_KEY = key(ICON_ZWNJ, "\u200C"); static final ExpectedKey ZWNJ_KEY = key(ICON_ZWNJ, "\u200C");
static final ExpectedKey ZWJ_KEY = key(ICON_ZWJ, "\u200D"); static final ExpectedKey ZWJ_KEY = key(ICON_ZWJ, "\u200D");
// Domain key
public static final ExpectedKey DOMAIN_KEY =
key(".com", joinMoreKeys(".net", ".org", ".gov", ".edu")).preserveCase();
// Punctuation more keys for phone form factor. // Punctuation more keys for phone form factor.
public static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys( public static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
@ -300,12 +348,12 @@ public abstract class LayoutBase extends AbstractLayoutBase {
if (isPhone) { if (isPhone) {
builder.addKeysOnTheRightOfRow(numberOfRows - 1, DELETE_KEY) builder.addKeysOnTheRightOfRow(numberOfRows - 1, DELETE_KEY)
.addKeysOnTheLeftOfRow(numberOfRows, customizer.getSymbolsKey()) .addKeysOnTheLeftOfRow(numberOfRows, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(numberOfRows, key(ENTER_KEY, EMOJI_ACTION_KEY)); .addKeysOnTheRightOfRow(numberOfRows, customizer.getEnterKey(isPhone));
} else { } else {
builder.addKeysOnTheRightOfRow(1, DELETE_KEY) builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
.addKeysOnTheRightOfRow(numberOfRows - 2, ENTER_KEY) .addKeysOnTheRightOfRow(numberOfRows - 2, customizer.getEnterKey(isPhone))
.addKeysOnTheLeftOfRow(numberOfRows, customizer.getSymbolsKey()) .addKeysOnTheLeftOfRow(numberOfRows, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(numberOfRows, EMOJI_NORMAL_KEY); .addKeysOnTheRightOfRow(numberOfRows, customizer.getEmojiKey(isPhone));
} }
builder.addKeysOnTheLeftOfRow( builder.addKeysOnTheLeftOfRow(
numberOfRows - 1, (Object[])customizer.getLeftShiftKeys(isPhone)); numberOfRows - 1, (Object[])customizer.getLeftShiftKeys(isPhone));

View File

@ -55,14 +55,14 @@ public final class Myanmar extends LayoutBase {
// U+002C: "," COMMA // U+002C: "," COMMA
// U+104A: "၊" MYANMAR SIGN LITTLE SECTION // U+104A: "၊" MYANMAR SIGN LITTLE SECTION
return isPhone ? joinKeys(key("\u002C", SETTINGS_KEY)) return isPhone ? joinKeys(key("\u002C", SETTINGS_KEY))
: joinKeys(key("\u104A", moreKey(","), SETTINGS_KEY), "_"); : joinKeys(key("\u104A", moreKey(","), SETTINGS_KEY));
} }
@Override @Override
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) { public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
// U+104B: "။" MYANMAR SIGN SECTION // U+104B: "။" MYANMAR SIGN SECTION
final ExpectedKey periodKey = key("\u104B", getPunctuationMoreKeys(isPhone)); final ExpectedKey periodKey = key("\u104B", getPunctuationMoreKeys(isPhone));
return isPhone ? joinKeys(periodKey) : joinKeys("/", periodKey); return joinKeys(periodKey);
} }
@Override @Override

View File

@ -41,18 +41,18 @@ public class Symbols extends AbstractLayoutBase {
customizer.getSingleQuoteMoreKeys(), customizer.getSingleAngleQuoteKeys()))); customizer.getSingleQuoteMoreKeys(), customizer.getSingleAngleQuoteKeys())));
if (isPhone) { if (isPhone) {
builder.addKeysOnTheLeftOfRow(3, customizer.getSymbolsShiftKey(isPhone)) builder.addKeysOnTheLeftOfRow(3, customizer.getSymbolsShiftKey(isPhone))
.addKeysOnTheRightOfRow(3, DELETE_KEY) .addKeysOnTheRightOfRow(3, LayoutBase.DELETE_KEY)
.addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey()) .addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey())
.addKeysOnTheRightOfRow(4, key(ENTER_KEY, EMOJI_ACTION_KEY)); .addKeysOnTheRightOfRow(4, customizer.getEnterKey(isPhone));
} else { } else {
// Tablet symbols keyboard has extra two keys at the left edge of the 3rd row. // Tablet symbols keyboard has extra two keys at the left edge of the 3rd row.
builder.addKeysOnTheLeftOfRow(3, (Object[])joinKeys("\\", "=")); builder.addKeysOnTheLeftOfRow(3, (Object[])joinKeys("\\", "="));
builder.addKeysOnTheRightOfRow(1, DELETE_KEY) builder.addKeysOnTheRightOfRow(1, LayoutBase.DELETE_KEY)
.addKeysOnTheRightOfRow(2, ENTER_KEY) .addKeysOnTheRightOfRow(2, customizer.getEnterKey(isPhone))
.addKeysOnTheLeftOfRow(3, customizer.getSymbolsShiftKey(isPhone)) .addKeysOnTheLeftOfRow(3, customizer.getSymbolsShiftKey(isPhone))
.addKeysOnTheRightOfRow(3, customizer.getSymbolsShiftKey(isPhone)) .addKeysOnTheRightOfRow(3, customizer.getSymbolsShiftKey(isPhone))
.addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey()) .addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey())
.addKeysOnTheRightOfRow(4, EMOJI_NORMAL_KEY); .addKeysOnTheRightOfRow(4, customizer.getEmojiKey(isPhone));
} }
return builder.build(); return builder.build();
} }
@ -167,7 +167,7 @@ public class Symbols extends AbstractLayoutBase {
// U+00BF: "¿" INVERTED QUESTION MARK // U+00BF: "¿" INVERTED QUESTION MARK
key("?", moreKey("\u00BF"))) key("?", moreKey("\u00BF")))
.setKeysOfRow(4, .setKeysOfRow(4,
key(","), key("_"), SPACE_KEY, key("/"), key(","), key("_"), LayoutBase.SPACE_KEY, key("/"),
// U+2026: "…" HORIZONTAL ELLIPSIS // U+2026: "…" HORIZONTAL ELLIPSIS
key(".", moreKey("\u2026"))) key(".", moreKey("\u2026")))
.build(); .build();

View File

@ -37,20 +37,20 @@ public class SymbolsShifted extends AbstractLayoutBase {
builder.replaceKeyOfLabel(OTHER_CURRENCIES, (Object[])customizer.getOtherCurrencyKeys()); builder.replaceKeyOfLabel(OTHER_CURRENCIES, (Object[])customizer.getOtherCurrencyKeys());
if (isPhone) { if (isPhone) {
builder.addKeysOnTheLeftOfRow(3, customizer.getBackToSymbolsKey()) builder.addKeysOnTheLeftOfRow(3, customizer.getBackToSymbolsKey())
.addKeysOnTheRightOfRow(3, DELETE_KEY) .addKeysOnTheRightOfRow(3, LayoutBase.DELETE_KEY)
.addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey()) .addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey())
.addKeysOnTheRightOfRow(4, key(ENTER_KEY, EMOJI_ACTION_KEY)); .addKeysOnTheRightOfRow(4, customizer.getEnterKey(isPhone));
} else { } else {
// Tablet symbols shifted keyboard has extra two keys at the right edge of the 3rd row. // Tablet symbols shifted keyboard has extra two keys at the right edge of the 3rd row.
// U+00BF: "¿" INVERTED QUESTION MARK // U+00BF: "¿" INVERTED QUESTION MARK
// U+00A1: "¡" INVERTED EXCLAMATION MARK // U+00A1: "¡" INVERTED EXCLAMATION MARK
builder.addKeysOnTheRightOfRow(3, (Object[])joinKeys("\u00A1", "\u00BF")); builder.addKeysOnTheRightOfRow(3, (Object[])joinKeys("\u00A1", "\u00BF"));
builder.addKeysOnTheRightOfRow(1, DELETE_KEY) builder.addKeysOnTheRightOfRow(1, LayoutBase.DELETE_KEY)
.addKeysOnTheRightOfRow(2, ENTER_KEY) .addKeysOnTheRightOfRow(2, customizer.getEnterKey(isPhone))
.addKeysOnTheLeftOfRow(3, customizer.getBackToSymbolsKey()) .addKeysOnTheLeftOfRow(3, customizer.getBackToSymbolsKey())
.addKeysOnTheRightOfRow(3, customizer.getBackToSymbolsKey()) .addKeysOnTheRightOfRow(3, customizer.getBackToSymbolsKey())
.addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey()) .addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey())
.addKeysOnTheRightOfRow(4, EMOJI_NORMAL_KEY); .addKeysOnTheRightOfRow(4, customizer.getEmojiKey(isPhone));
} }
return builder.build(); return builder.build();
} }
@ -122,7 +122,7 @@ public class SymbolsShifted extends AbstractLayoutBase {
// U+2264: "≤" LESS-THAN OR EQUAL TO // U+2264: "≤" LESS-THAN OR EQUAL TO
// U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
key("<", joinMoreKeys("\u2039", "\u2264", "\u00AB")), key("<", joinMoreKeys("\u2039", "\u2264", "\u00AB")),
SPACE_KEY, LayoutBase.SPACE_KEY,
// U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
// U+2265: "≥" GREATER-THAN EQUAL TO // U+2265: "≥" GREATER-THAN EQUAL TO
// U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK

View File

@ -16,9 +16,7 @@
package com.android.inputmethod.keyboard.layout.expected; package com.android.inputmethod.keyboard.layout.expected;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey; import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey;
import com.android.inputmethod.latin.Constants;
/** /**
* Base class to create an expected keyboard for unit test. * Base class to create an expected keyboard for unit test.
@ -104,36 +102,4 @@ public abstract class AbstractLayoutBase {
public static ExpectedKey[] joinKeys(final Object ... keys) { public static ExpectedKey[] joinKeys(final Object ... keys) {
return ExpectedKeyboardBuilder.joinKeys(keys); return ExpectedKeyboardBuilder.joinKeys(keys);
} }
// Icon ids.
private static final int ICON_DELETE = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_DELETE_KEY);
private static final int ICON_SPACE = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SPACE_KEY);
private static final int ICON_TAB = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_TAB_KEY);
private static final int ICON_SHORTCUT = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SHORTCUT_KEY);
private static final int ICON_SETTINGS = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SETTINGS_KEY);
private static final int ICON_LANGUAGE_SWITCH = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_LANGUAGE_SWITCH_KEY);
private static final int ICON_ENTER = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_ENTER_KEY);
private static final int ICON_EMOJI_ACTION = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_EMOJI_ACTION_KEY);
private static final int ICON_EMOJI_NORMAL = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_EMOJI_NORMAL_KEY);
// Functional keys.
public static final ExpectedKey DELETE_KEY = key(ICON_DELETE, Constants.CODE_DELETE);
public static final ExpectedKey TAB_KEY = key(ICON_TAB, Constants.CODE_TAB);
public static final ExpectedKey SHORTCUT_KEY = key(ICON_SHORTCUT, Constants.CODE_SHORTCUT);
public static final ExpectedKey SETTINGS_KEY = key(ICON_SETTINGS, Constants.CODE_SETTINGS);
public static final ExpectedKey LANGUAGE_SWITCH_KEY = key(
ICON_LANGUAGE_SWITCH, Constants.CODE_LANGUAGE_SWITCH);
public static final ExpectedKey ENTER_KEY = key(ICON_ENTER, Constants.CODE_ENTER);
public static final ExpectedKey EMOJI_ACTION_KEY = key(ICON_EMOJI_ACTION, Constants.CODE_EMOJI);
public static final ExpectedKey EMOJI_NORMAL_KEY = key(ICON_EMOJI_NORMAL, Constants.CODE_EMOJI);
public static final ExpectedKey SPACE_KEY = key(ICON_SPACE, Constants.CODE_SPACE);
} }

View File

@ -148,6 +148,18 @@ public class ExpectedKey {
return newInstance(mVisual.toUpperCase(locale), mOutput.toUpperCase(locale)); return newInstance(mVisual.toUpperCase(locale), mOutput.toUpperCase(locale));
} }
public ExpectedKey preserveCase() {
final ExpectedKey[] moreKeys = getMoreKeys();
final ExpectedKey[] casePreservedMoreKeys = new ExpectedKey[moreKeys.length];
for (int index = 0; index < moreKeys.length; index++) {
final ExpectedKey moreKey = moreKeys[index];
casePreservedMoreKeys[index] = newInstance(
moreKey.getVisual().preserveCase(), moreKey.getOutput().preserveCase());
}
return newInstance(
getVisual().preserveCase(), getOutput().preserveCase(), casePreservedMoreKeys);
}
public boolean equalsTo(final Key key) { public boolean equalsTo(final Key key) {
// This key has no "more keys". // This key has no "more keys".
return mVisual.equalsTo(key) && mOutput.equalsTo(key) && key.getMoreKeys() == null; return mVisual.equalsTo(key) && mOutput.equalsTo(key) && key.getMoreKeys() == null;

View File

@ -42,6 +42,7 @@ abstract class ExpectedKeyOutput {
} }
abstract ExpectedKeyOutput toUpperCase(final Locale locale); abstract ExpectedKeyOutput toUpperCase(final Locale locale);
abstract ExpectedKeyOutput preserveCase();
abstract boolean equalsTo(final String text); abstract boolean equalsTo(final String text);
abstract boolean equalsTo(final Key key); abstract boolean equalsTo(final Key key);
abstract boolean equalsTo(final MoreKeySpec moreKeySpec); abstract boolean equalsTo(final MoreKeySpec moreKeySpec);
@ -68,6 +69,11 @@ abstract class ExpectedKeyOutput {
return this; return this;
} }
@Override
ExpectedKeyOutput preserveCase() {
return new CasePreservedCode(mCode);
}
@Override @Override
boolean equalsTo(final String text) { boolean equalsTo(final String text) {
return StringUtils.codePointCount(text) == 1 && text.codePointAt(0) == mCode; return StringUtils.codePointCount(text) == 1 && text.codePointAt(0) == mCode;
@ -93,6 +99,16 @@ abstract class ExpectedKeyOutput {
return Constants.isLetterCode(mCode) ? StringUtils.newSingleCodePointString(mCode) return Constants.isLetterCode(mCode) ? StringUtils.newSingleCodePointString(mCode)
: Constants.printableCode(mCode); : Constants.printableCode(mCode);
} }
private static class CasePreservedCode extends Code {
CasePreservedCode(final int code) { super(code); }
@Override
ExpectedKeyOutput toUpperCase(final Locale locale) { return this; }
@Override
ExpectedKeyOutput preserveCase() { return this; }
}
} }
/** /**
@ -108,6 +124,11 @@ abstract class ExpectedKeyOutput {
return newInstance(mText.toUpperCase(locale)); return newInstance(mText.toUpperCase(locale));
} }
@Override
ExpectedKeyOutput preserveCase() {
return new CasePreservedText(mText);
}
@Override @Override
boolean equalsTo(final String text) { boolean equalsTo(final String text) {
return text.equals(text); return text.equals(text);
@ -134,5 +155,15 @@ abstract class ExpectedKeyOutput {
public String toString() { public String toString() {
return mText; return mText;
} }
private static class CasePreservedText extends Text {
CasePreservedText(final String text) { super(text); }
@Override
ExpectedKeyOutput toUpperCase(final Locale locale) { return this; }
@Override
ExpectedKeyOutput preserveCase() { return this; }
}
} }
} }

View File

@ -37,6 +37,7 @@ abstract class ExpectedKeyVisual {
} }
abstract ExpectedKeyVisual toUpperCase(final Locale locale); abstract ExpectedKeyVisual toUpperCase(final Locale locale);
abstract ExpectedKeyVisual preserveCase();
abstract boolean equalsTo(final String text); abstract boolean equalsTo(final String text);
abstract boolean equalsTo(final Key key); abstract boolean equalsTo(final Key key);
abstract boolean equalsTo(final MoreKeySpec moreKeySpec); abstract boolean equalsTo(final MoreKeySpec moreKeySpec);
@ -58,6 +59,11 @@ abstract class ExpectedKeyVisual {
return this; return this;
} }
@Override
ExpectedKeyVisual preserveCase() {
return this;
}
@Override @Override
boolean equalsTo(final String text) { boolean equalsTo(final String text) {
return false; return false;
@ -102,6 +108,11 @@ abstract class ExpectedKeyVisual {
return new Label(mLabel.toUpperCase(locale)); return new Label(mLabel.toUpperCase(locale));
} }
@Override
ExpectedKeyVisual preserveCase() {
return new CasePreservedLabel(mLabel);
}
@Override @Override
boolean equalsTo(final String text) { boolean equalsTo(final String text) {
return mLabel.equals(text); return mLabel.equals(text);
@ -131,5 +142,15 @@ abstract class ExpectedKeyVisual {
public String toString() { public String toString() {
return mLabel; return mLabel;
} }
private static class CasePreservedLabel extends Label {
CasePreservedLabel(final String label) { super(label); }
@Override
ExpectedKeyVisual toUpperCase(final Locale locale) { return this; }
@Override
ExpectedKeyVisual preserveCase() { return this; }
}
} }
} }

View File

@ -0,0 +1,91 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.keyboard.layout.tests;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.InputType;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.keyboard.KeyboardLayoutSet;
import com.android.inputmethod.keyboard.layout.Dvorak;
import com.android.inputmethod.keyboard.layout.LayoutBase;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
import com.android.inputmethod.keyboard.layout.tests.TestsEnglishDvorak.EnglishDvorakCustomizer;
import java.util.Locale;
/**
* en_US: English (United States)/dvorak, email input field.
*/
@SmallTest
public class TestsDvorakEmail extends LayoutTestsBase {
private static final Locale LOCALE = new Locale("en", "US");
private static final LayoutBase LAYOUT = new DvorakEmail(new DvorakEmailCustomizer(LOCALE));
@Override
LayoutBase getLayout() { return LAYOUT; }
@Override
protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
final EditorInfo editorInfo, final boolean voiceInputKeyEnabled,
final boolean languageSwitchKeyEnabled) {
final EditorInfo emailField = new EditorInfo();
emailField.inputType =
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
return super.createKeyboardLayoutSet(
subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled);
}
private static class DvorakEmailCustomizer extends EnglishDvorakCustomizer {
DvorakEmailCustomizer(final Locale locale) {
super(locale);
}
@Override
public ExpectedKey getEnterKey(final boolean isPhone) {
return isPhone ? LayoutBase.ENTER_KEY : super.getEnterKey(isPhone);
}
@Override
public ExpectedKey getEmojiKey(final boolean isPhone) {
return LayoutBase.DOMAIN_KEY;
}
@Override
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
return isPhone ? super.getKeysLeftToSpacebar(isPhone)
: joinKeys(key("@", LayoutBase.SETTINGS_KEY));
}
}
private static class DvorakEmail extends Dvorak {
public DvorakEmail(final LayoutCustomizer customizer) {
super(customizer);
}
@Override
protected ExpectedKey getRow1_1Key(final boolean isPhone, final int elementId) {
if (isPhone && (elementId == KeyboardId.ELEMENT_ALPHABET
|| elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED)) {
return key("@", joinMoreKeys(additionalMoreKey("1")));
}
return super.getRow1_1Key(isPhone, elementId);
}
}
}

View File

@ -0,0 +1,91 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.keyboard.layout.tests;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.InputType;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.keyboard.KeyboardLayoutSet;
import com.android.inputmethod.keyboard.layout.Dvorak;
import com.android.inputmethod.keyboard.layout.LayoutBase;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
import com.android.inputmethod.keyboard.layout.tests.TestsEnglishDvorak.EnglishDvorakCustomizer;
import java.util.Locale;
/**
* en_US: English (United States)/dvorak, URL input field.
*/
@SmallTest
public class TestsDvorakUrl extends LayoutTestsBase {
private static final Locale LOCALE = new Locale("en", "US");
private static final LayoutBase LAYOUT = new DvorakEmail(new DvorakUrlCustomizer(LOCALE));
@Override
LayoutBase getLayout() { return LAYOUT; }
@Override
protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
final EditorInfo editorInfo, final boolean voiceInputKeyEnabled,
final boolean languageSwitchKeyEnabled) {
final EditorInfo emailField = new EditorInfo();
emailField.inputType =
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI;
return super.createKeyboardLayoutSet(
subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled);
}
private static class DvorakUrlCustomizer extends EnglishDvorakCustomizer {
DvorakUrlCustomizer(final Locale locale) {
super(locale);
}
@Override
public ExpectedKey getEnterKey(final boolean isPhone) {
return isPhone ? LayoutBase.ENTER_KEY : super.getEnterKey(isPhone);
}
@Override
public ExpectedKey getEmojiKey(final boolean isPhone) {
return LayoutBase.DOMAIN_KEY;
}
@Override
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
return isPhone ? super.getKeysLeftToSpacebar(isPhone)
: joinKeys(key("/", LayoutBase.SETTINGS_KEY));
}
}
private static class DvorakEmail extends Dvorak {
public DvorakEmail(final LayoutCustomizer customizer) {
super(customizer);
}
@Override
protected ExpectedKey getRow1_1Key(final boolean isPhone, final int elementId) {
if (isPhone && (elementId == KeyboardId.ELEMENT_ALPHABET
|| elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED)) {
return key("/", joinMoreKeys(additionalMoreKey("1")));
}
return super.getRow1_1Key(isPhone, elementId);
}
}
}

View File

@ -36,7 +36,7 @@ public class TestsEnglishDvorak extends LayoutTestsBase {
@Override @Override
LayoutBase getLayout() { return LAYOUT; } LayoutBase getLayout() { return LAYOUT; }
private static class EnglishDvorakCustomizer extends DvorakCustomizer { public static class EnglishDvorakCustomizer extends DvorakCustomizer {
private final EnglishCustomizer mEnglishCustomizer; private final EnglishCustomizer mEnglishCustomizer;
EnglishDvorakCustomizer(final Locale locale) { EnglishDvorakCustomizer(final Locale locale) {

View File

@ -0,0 +1,73 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.keyboard.layout.tests;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.InputType;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.keyboard.KeyboardLayoutSet;
import com.android.inputmethod.keyboard.layout.LayoutBase;
import com.android.inputmethod.keyboard.layout.Qwerty;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
import java.util.Locale;
/**
* en_US: English (United States)/qwerty, email input field.
*/
@SmallTest
public class TestsQwertyEmail extends LayoutTestsBase {
private static final Locale LOCALE = new Locale("en", "US");
private static final LayoutBase LAYOUT = new Qwerty(new EnglishEmailCustomizer(LOCALE));
@Override
LayoutBase getLayout() { return LAYOUT; }
@Override
protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
final EditorInfo editorInfo, final boolean voiceInputKeyEnabled,
final boolean languageSwitchKeyEnabled) {
final EditorInfo emailField = new EditorInfo();
emailField.inputType =
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
return super.createKeyboardLayoutSet(
subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled);
}
private static class EnglishEmailCustomizer extends EnglishCustomizer {
EnglishEmailCustomizer(final Locale locale) {
super(locale);
}
@Override
public ExpectedKey getEnterKey(final boolean isPhone) {
return isPhone ? LayoutBase.ENTER_KEY : super.getEnterKey(isPhone);
}
@Override
public ExpectedKey getEmojiKey(final boolean isPhone) {
return LayoutBase.DOMAIN_KEY;
}
@Override
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
return joinKeys(key("@", LayoutBase.SETTINGS_KEY));
}
}
}

View File

@ -0,0 +1,73 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.keyboard.layout.tests;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.InputType;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.keyboard.KeyboardLayoutSet;
import com.android.inputmethod.keyboard.layout.LayoutBase;
import com.android.inputmethod.keyboard.layout.Qwerty;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
import java.util.Locale;
/**
* en_US: English (United States)/qwerty, URL input field.
*/
@SmallTest
public class TestsQwertyUrl extends LayoutTestsBase {
private static final Locale LOCALE = new Locale("en", "US");
private static final LayoutBase LAYOUT = new Qwerty(new EnglishUrlCustomizer(LOCALE));
@Override
LayoutBase getLayout() { return LAYOUT; }
@Override
protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
final EditorInfo editorInfo, final boolean voiceInputKeyEnabled,
final boolean languageSwitchKeyEnabled) {
final EditorInfo emailField = new EditorInfo();
emailField.inputType =
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI;
return super.createKeyboardLayoutSet(
subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled);
}
private static class EnglishUrlCustomizer extends EnglishCustomizer {
EnglishUrlCustomizer(final Locale locale) {
super(locale);
}
@Override
public ExpectedKey getEnterKey(final boolean isPhone) {
return isPhone ? LayoutBase.ENTER_KEY : super.getEnterKey(isPhone);
}
@Override
public ExpectedKey getEmojiKey(final boolean isPhone) {
return LayoutBase.DOMAIN_KEY;
}
@Override
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
return joinKeys(key("/", LayoutBase.SETTINGS_KEY));
}
}
}