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