16959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka/* 26959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Copyright (C) 2014 The Android Open Source Project 36959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * 46959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 56959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * you may not use this file except in compliance with the License. 66959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * You may obtain a copy of the License at 76959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * 86959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 96959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * 106959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 116959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 126959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * See the License for the specific language governing permissions and 146959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * limitations under the License. 156959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 166959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 176959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaokapackage com.android.inputmethod.keyboard.layout.customizer; 186959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 196959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.layout.Symbols; 206959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.layout.SymbolsShifted; 216959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.layout.expected.AbstractLayoutBase; 226959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.layout.expected.ExpectedKey; 236959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder; 246959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 256959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaokaimport java.util.Locale; 266959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 276959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka/** 286959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * This class is used to customize common keyboard layout to language specific layout. 296959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 306959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaokapublic class LayoutCustomizer extends AbstractLayoutBase { 316959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka private final Locale mLocale; 326959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 336959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka // Empty keys definition to remove keys by adding this. 346959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka protected static final ExpectedKey[] EMPTY_KEYS = joinKeys(); 356959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 366959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public LayoutCustomizer(final Locale locale) { mLocale = locale; } 376959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 386959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public final Locale getLocale() { return mLocale; } 396959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 406959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public int getNumberOfRows() { return 4; } 416959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 426959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 436959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Set accented letters to a specific keyboard element. 446959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard 456959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * layout. 466959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param elementId the element id of keyboard 476959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as 486959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * "more keys". 496959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 506959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder, 516959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka final int elementId) { 526959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka // This method can be overridden by an extended class to provide customized expected 536959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka // accented letters depending on the shift state of keyboard. 546959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka // This is a default behavior to call a shift-state-independent 556959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka // {@link #setAccentedLetters(ExpectedKeyboardBuilder)} implementation, so that 566959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka // <code>elementId</code> is ignored here. 576959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return setAccentedLetters(builder); 586959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 596959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 606959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 616959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Set accented letters to common layout. 626959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard 636959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * layout. 646959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as 656959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * "more keys". 666959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 676959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) { 686959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return builder; 696959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 706959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 716959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 726959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the function key to switch to alphabet layout. 736959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the {@link ExpectedKey} of the alphabet key. 746959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 756959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey getAlphabetKey() { return ALPHABET_KEY; } 766959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 776959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 786959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the function key to switch to symbols layout. 796959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the {@link ExpectedKey} of the symbols key. 806959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 816959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey getSymbolsKey() { return SYMBOLS_KEY; } 826959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 836959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 846959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the function key to switch to symbols shift layout. 856959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's key. 866959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the {@link ExpectedKey} of the symbols shift key. 876959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 886959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey getSymbolsShiftKey(boolean isPhone) { 896959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return isPhone ? SYMBOLS_SHIFT_KEY : TABLET_SYMBOLS_SHIFT_KEY; 906959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 916959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 926959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 936959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the function key to switch from symbols shift to symbols layout. 946959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the {@link ExpectedKey} of the back to symbols key. 956959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 966959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey getBackToSymbolsKey() { return BACK_TO_SYMBOLS_KEY; } 976959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 986959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 996959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the currency key. 1006959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the {@link ExpectedKey} of the currency key. 1016959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1026959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey getCurrencyKey() { return Symbols.CURRENCY_DOLLAR; } 1036959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1046959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1056959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get other currencies keys. 1066959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that represents other currency keys. 1076959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1086959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getOtherCurrencyKeys() { 1096959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return SymbolsShifted.CURRENCIES_OTHER_THAN_DOLLAR; 1106959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 1116959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1126959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1136959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get "more keys" of double quotation mark. 1146959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} of more double quotation marks in natural order. 1156959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1166959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_9LR; } 1176959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1186959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1196959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get "more keys" of single quotation mark. 1206959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} of more single quotation marks in natural order. 1216959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1226959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_9LR; } 1236959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1246959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1256959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get double angle quotation marks in natural order. 1266959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} of double angle quotation marks in natural 1276959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * order. 1286959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1296959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_LR; } 1306959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1316959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1326959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get single angle quotation marks in natural order. 1336959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} of single angle quotation marks in natural 1346959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * order. 1356959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1366959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_LR; } 1376959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1386959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1396959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the left shift keys. 1406959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's keys. 1416959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that should be placed at left edge of the 1426959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * keyboard. 1436959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1446959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) { 1456959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return joinKeys(SHIFT_KEY); 1466959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 1476959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1486959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1496959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the right shift keys. 1506959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's keys. 1516959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that should be placed at right edge of the 1526959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * keyboard. 1536959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1546959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getRightShiftKeys(final boolean isPhone) { 1556959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return isPhone ? EMPTY_KEYS : joinKeys(EXCLAMATION_AND_QUESTION_MARKS, SHIFT_KEY); 1566959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 1576959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1586959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1596959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the enter key. 1606959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's key. 1616959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that should be placed as an enter key. 1626959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1636959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey getEnterKey(final boolean isPhone) { 1646959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return isPhone ? key(ENTER_KEY, EMOJI_ACTION_KEY) : ENTER_KEY; 1656959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 1666959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1676959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1686959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the emoji key. 1696959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's key. 1706959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that should be placed as an emoji key. 1716959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1726959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey getEmojiKey(final boolean isPhone) { 1736959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return EMOJI_NORMAL_KEY; 1746959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 1756959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1766959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1776959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the space keys. 1786959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's keys. 1796959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that should be placed at the center of the 1806959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * keyboard. 1816959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1826959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getSpaceKeys(final boolean isPhone) { 1836959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY); 1846959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 1856959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1866959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1876959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the keys left to the spacebar. 1886959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's keys. 1896959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that should be placed at left of the spacebar. 1906959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 1916959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) { 1926959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka // U+002C: "," COMMA 1936959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return joinKeys(key("\u002C", SETTINGS_KEY)); 1946959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 1956959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 1966959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 1976959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get the keys right to the spacebar. 1986959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's keys. 1996959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that should be placed at right of the spacebar. 2006959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 2016959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) { 2026959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka final ExpectedKey periodKey = key(".", getPunctuationMoreKeys(isPhone)); 2036959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return joinKeys(periodKey); 2046959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 2056959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka 2066959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka /** 2076959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * Get "more keys" for the punctuation key (usually the period key). 2086959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @param isPhone true if requesting phone's keys. 2096959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka * @return the array of {@link ExpectedKey} that are "more keys" of the punctuation key. 2106959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka */ 2116959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) { 2126959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka return isPhone ? PHONE_PUNCTUATION_MORE_KEYS : TABLET_PUNCTUATION_MORE_KEYS; 2136959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka } 2146959a0f214fc18e314f54213877956d95a1631e8Tadashi G. Takaoka} 215