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");
** you may not use this file except in compliance with the License.
@ -21,27 +21,36 @@
<merge
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>
<case
latin:clobberSettingsKey="true"
latin:mode="url"
>
<Key
latin:moreKeys="!text/morekeys_tablet_comma"
latin:keyStyle="baseTabletCommaKeyStyle" />
latin:keySpec="/"
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>
<!-- clobberSettingsKey="false" -->
<default>
<Key
latin:moreKeys="!text/morekeys_tablet_comma,!text/keyspec_settings"
latin:keyStyle="baseTabletCommaKeyStyle" />
latin:keySpec="!text/keyspec_tablet_comma"
latin:moreKeys="!text/morekeys_tablet_comma,%"
latin:keyHintLabel="!text/keyhintlabel_tablet_comma"
latin:keyLabelFlags="hasPopupHint"
latin:keyStyle="settingsMoreKeysStyle" />
</default>
</switch>
</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:backgroundType="functional" />
</case>
<case
latin:keyboardLayoutSet="dvorak"
>
<Key
latin:keySpec="\?"
latin:moreKeys="!text/morekeys_tablet_period,!text/morekeys_question" />
</case>
<default>
<Key
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" />
<Key
latin:keyStyle="spaceKeyStyle"
latin:keyWidth="27.0%p" />
latin:keyWidth="45.0%p" />
<Key
latin:keyStyle="zwnjKeyStyle" />
</case>
@ -44,7 +44,7 @@
>
<Key
latin:keyStyle="spaceKeyStyle"
latin:keyWidth="36.0%p" />
latin:keyWidth="54.0%p" />
<Key
latin:keyStyle="zwnjKeyStyle" />
</case>
@ -55,13 +55,13 @@
latin:keyStyle="languageSwitchKeyStyle" />
<Key
latin:keyStyle="spaceKeyStyle"
latin:keyWidth="36.0%p" />
latin:keyWidth="54.0%p" />
</case>
<!-- languageSwitchKeyEnabled="false" -->
<default>
<Key
latin:keyStyle="spaceKeyStyle"
latin:keyWidth="45.0%p" />
latin:keyWidth="63.0%p" />
</default>
</switch>
</merge>

View File

@ -36,6 +36,9 @@
</default>
</switch>
<!-- Base key style for the key which may have settings key as more keys. -->
<key-style
latin:styleName="baseSettingsMoreKeysStyle"
latin:parentStyle="hasShiftedLetterHintStyle" />
<include
latin:keyboardLayout="@xml/key_styles_settings" />
<!-- 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:keyWidth="9.0%p"
latin:backgroundType="functional"
latin:keyboardLayout="@xml/key_f2" />
latin:keyboardLayout="@xml/key_emoji" />
</Row>
</merge>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -29,15 +29,17 @@
>
<key-style
latin:styleName="settingsMoreKeysStyle"
latin:backgroundType="functional" />
latin:backgroundType="functional"
latin:parentStyle="baseSettingsMoreKeysStyle" />
</case>
<!-- clobberSettingsKey="false" -->
<default>
<key-style
latin:styleName="settingsMoreKeysStyle"
latin:keyLabelFlags="hasPopupHint"
latin:moreKeys="!text/keyspec_settings"
latin:backgroundType="functional" />
latin:additionalMoreKeys="!text/keyspec_settings"
latin:backgroundType="functional"
latin:parentStyle="baseSettingsMoreKeysStyle" />
</default>
</switch>
</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:keyWidth="15%p" />
<include
latin:keyboardLayout="@xml/key_f1" />
latin:keyboardLayout="@xml/key_comma" />
<include
latin:keyXPos="25%p"
latin:keyboardLayout="@xml/key_space_5kw" />

View File

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

View File

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

View File

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

View File

@ -62,14 +62,14 @@ public final class ArmenianPhonetic extends LayoutBase {
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
// U+055D: "՝" ARMENIAN COMMA
return isPhone ? joinKeys(key("\u055D", SETTINGS_KEY))
: joinKeys(key("\u055D", SETTINGS_KEY), "_");
: joinKeys(key("\u055D", SETTINGS_KEY));
}
@Override
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
// U+0589: "։" ARMENIAN FULL STOP
final ExpectedKey fullStopKey = key("\u0589", getPunctuationMoreKeys(isPhone));
return isPhone ? joinKeys(fullStopKey) : joinKeys("/", fullStopKey);
return joinKeys(fullStopKey);
}
@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.ExpectedKeyboardBuilder;
import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey;
import com.android.inputmethod.latin.settings.CustomInputStyleSettingsFragment;
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";
public Dvorak(final LayoutCustomizer customizer) {
@ -51,17 +52,19 @@ public final class Dvorak extends LayoutBase {
@Override
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
return isPhone ? joinKeys(key("q", SETTINGS_KEY)) :
joinKeys(SETTINGS_KEY, key("_", moreKey("-")));
// U+00A1: "¡" INVERTED EXCLAMATION MARK
return isPhone ? joinKeys(key("q", SETTINGS_KEY))
: joinKeys(key("!", joinMoreKeys("\u00A1", SETTINGS_KEY)));
}
@Override
public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
final ExpectedAdditionalMoreKey[] punctuationMoreKeys =
convertToAdditionalMoreKeys(getPunctuationMoreKeys(isPhone));
// U+00BF: "¿" INVERTED QUESTION MARK
return isPhone
? joinKeys(key("z", punctuationMoreKeys))
: joinKeys("/", key("?", moreKey("!")));
: joinKeys(key("?", joinMoreKeys(punctuationMoreKeys, "\u00BF")));
}
private static ExpectedAdditionalMoreKey[] convertToAdditionalMoreKeys(
@ -76,7 +79,33 @@ public final class Dvorak extends LayoutBase {
}
@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
public ExpectedKey[][] getLayout(final boolean isPhone, final int elementId) {
@ -86,18 +115,9 @@ public final class Dvorak extends LayoutBase {
}
final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(
getCommonAlphabetLayout(isPhone));
if (elementId == KeyboardId.ELEMENT_ALPHABET
|| elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
builder.addKeysOnTheLeftOfRow(1,
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")));
}
builder.replaceKeyOfLabel(ROW1_1, getRow1_1Key(isPhone, elementId))
.replaceKeyOfLabel(ROW1_2, getRow1_2Key(isPhone, elementId))
.replaceKeyOfLabel(ROW1_3, getRow1_3Key(isPhone, elementId));
convertCommonLayoutToKeyboard(builder, isPhone);
getCustomizer().setAccentedLetters(builder);
if (elementId != KeyboardId.ELEMENT_ALPHABET) {
@ -107,8 +127,13 @@ public final class Dvorak extends LayoutBase {
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()
.setKeysOfRow(1,
ROW1_1, ROW1_2, ROW1_3,
key("p", additionalMoreKey("4")),
key("y", additionalMoreKey("5")),
key("f", additionalMoreKey("6")),

View File

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

View File

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

View File

@ -148,6 +148,24 @@ public abstract class LayoutBase extends AbstractLayoutBase {
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.
* @param isPhone true if requesting phone's keys.
@ -165,8 +183,7 @@ public abstract class LayoutBase extends AbstractLayoutBase {
*/
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
// U+002C: "," COMMA
return isPhone ? joinKeys(key("\u002C", SETTINGS_KEY))
: joinKeys(key("\u002C", SETTINGS_KEY), "_");
return joinKeys(key("\u002C", SETTINGS_KEY));
}
/**
@ -176,7 +193,7 @@ public abstract class LayoutBase extends AbstractLayoutBase {
*/
public ExpectedKey[] getKeysRightToSpacebar(final boolean 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; }
// 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(
KeyboardIconsSet.NAME_SHIFT_KEY);
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(
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 SHIFT_KEY = key(ICON_SHIFT,
public static final ExpectedKey SHIFT_KEY = key(ICON_SHIFT,
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);
static final ExpectedKey ALPHABET_KEY = key("ABC", 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
static final ExpectedKey ZWNJ_KEY = key(ICON_ZWNJ, "\u200C");
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.
public static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
@ -300,12 +348,12 @@ public abstract class LayoutBase extends AbstractLayoutBase {
if (isPhone) {
builder.addKeysOnTheRightOfRow(numberOfRows - 1, DELETE_KEY)
.addKeysOnTheLeftOfRow(numberOfRows, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(numberOfRows, key(ENTER_KEY, EMOJI_ACTION_KEY));
.addKeysOnTheRightOfRow(numberOfRows, customizer.getEnterKey(isPhone));
} else {
builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
.addKeysOnTheRightOfRow(numberOfRows - 2, ENTER_KEY)
.addKeysOnTheRightOfRow(numberOfRows - 2, customizer.getEnterKey(isPhone))
.addKeysOnTheLeftOfRow(numberOfRows, customizer.getSymbolsKey())
.addKeysOnTheRightOfRow(numberOfRows, EMOJI_NORMAL_KEY);
.addKeysOnTheRightOfRow(numberOfRows, customizer.getEmojiKey(isPhone));
}
builder.addKeysOnTheLeftOfRow(
numberOfRows - 1, (Object[])customizer.getLeftShiftKeys(isPhone));

View File

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

View File

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

View File

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

View File

@ -16,9 +16,7 @@
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.latin.Constants;
/**
* 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) {
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));
}
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) {
// This key has no "more keys".
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 preserveCase();
abstract boolean equalsTo(final String text);
abstract boolean equalsTo(final Key key);
abstract boolean equalsTo(final MoreKeySpec moreKeySpec);
@ -68,6 +69,11 @@ abstract class ExpectedKeyOutput {
return this;
}
@Override
ExpectedKeyOutput preserveCase() {
return new CasePreservedCode(mCode);
}
@Override
boolean equalsTo(final String text) {
return StringUtils.codePointCount(text) == 1 && text.codePointAt(0) == mCode;
@ -93,6 +99,16 @@ abstract class ExpectedKeyOutput {
return Constants.isLetterCode(mCode) ? StringUtils.newSingleCodePointString(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));
}
@Override
ExpectedKeyOutput preserveCase() {
return new CasePreservedText(mText);
}
@Override
boolean equalsTo(final String text) {
return text.equals(text);
@ -134,5 +155,15 @@ abstract class ExpectedKeyOutput {
public String toString() {
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 preserveCase();
abstract boolean equalsTo(final String text);
abstract boolean equalsTo(final Key key);
abstract boolean equalsTo(final MoreKeySpec moreKeySpec);
@ -58,6 +59,11 @@ abstract class ExpectedKeyVisual {
return this;
}
@Override
ExpectedKeyVisual preserveCase() {
return this;
}
@Override
boolean equalsTo(final String text) {
return false;
@ -102,6 +108,11 @@ abstract class ExpectedKeyVisual {
return new Label(mLabel.toUpperCase(locale));
}
@Override
ExpectedKeyVisual preserveCase() {
return new CasePreservedLabel(mLabel);
}
@Override
boolean equalsTo(final String text) {
return mLabel.equals(text);
@ -131,5 +142,15 @@ abstract class ExpectedKeyVisual {
public String toString() {
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
LayoutBase getLayout() { return LAYOUT; }
private static class EnglishDvorakCustomizer extends DvorakCustomizer {
public static class EnglishDvorakCustomizer extends DvorakCustomizer {
private final EnglishCustomizer mEnglishCustomizer;
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));
}
}
}