1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.inputmethod.keyboard.layout.customizer; 18 19 import com.android.inputmethod.keyboard.layout.Symbols; 20 import com.android.inputmethod.keyboard.layout.SymbolsShifted; 21 import com.android.inputmethod.keyboard.layout.expected.AbstractLayoutBase; 22 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey; 23 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder; 24 25 import java.util.Locale; 26 27 /** 28 * This class is used to customize common keyboard layout to language specific layout. 29 */ 30 public class LayoutCustomizer extends AbstractLayoutBase { 31 private final Locale mLocale; 32 33 // Empty keys definition to remove keys by adding this. 34 protected static final ExpectedKey[] EMPTY_KEYS = joinKeys(); 35 36 public LayoutCustomizer(final Locale locale) { mLocale = locale; } 37 38 public final Locale getLocale() { return mLocale; } 39 40 public int getNumberOfRows() { return 4; } 41 42 /** 43 * Set accented letters to a specific keyboard element. 44 * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard 45 * layout. 46 * @param elementId the element id of keyboard 47 * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as 48 * "more keys". 49 */ 50 public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder, 51 final int elementId) { 52 // This method can be overridden by an extended class to provide customized expected 53 // accented letters depending on the shift state of keyboard. 54 // This is a default behavior to call a shift-state-independent 55 // {@link #setAccentedLetters(ExpectedKeyboardBuilder)} implementation, so that 56 // <code>elementId</code> is ignored here. 57 return setAccentedLetters(builder); 58 } 59 60 /** 61 * Set accented letters to common layout. 62 * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard 63 * layout. 64 * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as 65 * "more keys". 66 */ 67 public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) { 68 return builder; 69 } 70 71 /** 72 * Get the function key to switch to alphabet layout. 73 * @return the {@link ExpectedKey} of the alphabet key. 74 */ 75 public ExpectedKey getAlphabetKey() { return ALPHABET_KEY; } 76 77 /** 78 * Get the function key to switch to symbols layout. 79 * @return the {@link ExpectedKey} of the symbols key. 80 */ 81 public ExpectedKey getSymbolsKey() { return SYMBOLS_KEY; } 82 83 /** 84 * Get the function key to switch to symbols shift layout. 85 * @param isPhone true if requesting phone's key. 86 * @return the {@link ExpectedKey} of the symbols shift key. 87 */ 88 public ExpectedKey getSymbolsShiftKey(boolean isPhone) { 89 return isPhone ? SYMBOLS_SHIFT_KEY : TABLET_SYMBOLS_SHIFT_KEY; 90 } 91 92 /** 93 * Get the function key to switch from symbols shift to symbols layout. 94 * @return the {@link ExpectedKey} of the back to symbols key. 95 */ 96 public ExpectedKey getBackToSymbolsKey() { return BACK_TO_SYMBOLS_KEY; } 97 98 /** 99 * Get the currency key. 100 * @return the {@link ExpectedKey} of the currency key. 101 */ 102 public ExpectedKey getCurrencyKey() { return Symbols.CURRENCY_DOLLAR; } 103 104 /** 105 * Get other currencies keys. 106 * @return the array of {@link ExpectedKey} that represents other currency keys. 107 */ 108 public ExpectedKey[] getOtherCurrencyKeys() { 109 return SymbolsShifted.CURRENCIES_OTHER_THAN_DOLLAR; 110 } 111 112 /** 113 * Get "more keys" of double quotation mark. 114 * @return the array of {@link ExpectedKey} of more double quotation marks in natural order. 115 */ 116 public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_9LR; } 117 118 /** 119 * Get "more keys" of single quotation mark. 120 * @return the array of {@link ExpectedKey} of more single quotation marks in natural order. 121 */ 122 public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_9LR; } 123 124 /** 125 * Get double angle quotation marks in natural order. 126 * @return the array of {@link ExpectedKey} of double angle quotation marks in natural 127 * order. 128 */ 129 public ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_LR; } 130 131 /** 132 * Get single angle quotation marks in natural order. 133 * @return the array of {@link ExpectedKey} of single angle quotation marks in natural 134 * order. 135 */ 136 public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_LR; } 137 138 /** 139 * Get the left shift keys. 140 * @param isPhone true if requesting phone's keys. 141 * @return the array of {@link ExpectedKey} that should be placed at left edge of the 142 * keyboard. 143 */ 144 public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) { 145 return joinKeys(SHIFT_KEY); 146 } 147 148 /** 149 * Get the right shift keys. 150 * @param isPhone true if requesting phone's keys. 151 * @return the array of {@link ExpectedKey} that should be placed at right edge of the 152 * keyboard. 153 */ 154 public ExpectedKey[] getRightShiftKeys(final boolean isPhone) { 155 return isPhone ? EMPTY_KEYS : joinKeys(EXCLAMATION_AND_QUESTION_MARKS, SHIFT_KEY); 156 } 157 158 /** 159 * Get the enter key. 160 * @param isPhone true if requesting phone's key. 161 * @return the array of {@link ExpectedKey} that should be placed as an enter key. 162 */ 163 public ExpectedKey getEnterKey(final boolean isPhone) { 164 return isPhone ? key(ENTER_KEY, EMOJI_ACTION_KEY) : ENTER_KEY; 165 } 166 167 /** 168 * Get the emoji key. 169 * @param isPhone true if requesting phone's key. 170 * @return the array of {@link ExpectedKey} that should be placed as an emoji key. 171 */ 172 public ExpectedKey getEmojiKey(final boolean isPhone) { 173 return EMOJI_NORMAL_KEY; 174 } 175 176 /** 177 * Get the space keys. 178 * @param isPhone true if requesting phone's keys. 179 * @return the array of {@link ExpectedKey} that should be placed at the center of the 180 * keyboard. 181 */ 182 public ExpectedKey[] getSpaceKeys(final boolean isPhone) { 183 return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY); 184 } 185 186 /** 187 * Get the keys left to the spacebar. 188 * @param isPhone true if requesting phone's keys. 189 * @return the array of {@link ExpectedKey} that should be placed at left of the spacebar. 190 */ 191 public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) { 192 // U+002C: "," COMMA 193 return joinKeys(key("\u002C", SETTINGS_KEY)); 194 } 195 196 /** 197 * Get the keys right to the spacebar. 198 * @param isPhone true if requesting phone's keys. 199 * @return the array of {@link ExpectedKey} that should be placed at right of the spacebar. 200 */ 201 public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) { 202 final ExpectedKey periodKey = key(".", getPunctuationMoreKeys(isPhone)); 203 return joinKeys(periodKey); 204 } 205 206 /** 207 * Get "more keys" for the punctuation key (usually the period key). 208 * @param isPhone true if requesting phone's keys. 209 * @return the array of {@link ExpectedKey} that are "more keys" of the punctuation key. 210 */ 211 public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) { 212 return isPhone ? PHONE_PUNCTUATION_MORE_KEYS : TABLET_PUNCTUATION_MORE_KEYS; 213 } 214 } 215