KeyboardIconsSet.java revision 6efe9ae1c073bdfbc36bd88e4d71c1b7505b39e9
1c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling/* 2c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * Copyright (C) 2011 The Android Open Source Project 3c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * 4c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License"); 5c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * you may not use this file except in compliance with the License. 6c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * You may obtain a copy of the License at 7c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * 8c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * http://www.apache.org/licenses/LICENSE-2.0 9c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * 10c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * Unless required by applicable law or agreed to in writing, software 11c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS, 12c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * See the License for the specific language governing permissions and 14c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * limitations under the License. 15c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling */ 16c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 17c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingpackage com.android.inputmethod.keyboard.internal; 18c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 19c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport android.content.res.Resources; 20c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport android.content.res.TypedArray; 2116029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberlingimport android.graphics.drawable.Drawable; 2216029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberlingimport android.util.Log; 2316029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberlingimport android.util.SparseIntArray; 24c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 25c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport com.android.inputmethod.latin.R; 26c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 27c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport java.util.HashMap; 28aeed91f3777d08a4160d68ddfc2626808a08b92dSam Judd 29c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingpublic final class KeyboardIconsSet { 30c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static final String TAG = KeyboardIconsSet.class.getSimpleName(); 31c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 32c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String PREFIX_ICON = "!icon/"; 33c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final int ICON_UNDEFINED = 0; 34c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static final int ATTR_UNDEFINED = 0; 35c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 36c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static final String NAME_UNDEFINED = "undefined"; 37c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SHIFT_KEY = "shift_key"; 38c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SHIFT_KEY_SHIFTED = "shift_key_shifted"; 39c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_DELETE_KEY = "delete_key"; 40c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SETTINGS_KEY = "settings_key"; 41c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SPACE_KEY = "space_key"; 42c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SPACE_KEY_FOR_NUMBER_LAYOUT = "space_key_for_number_layout"; 43c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_ENTER_KEY = "enter_key"; 44c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_GO_KEY = "go_key"; 45c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SEARCH_KEY = "search_key"; 46c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SEND_KEY = "send_key"; 47c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_NEXT_KEY = "next_key"; 48c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_DONE_KEY = "done_key"; 49c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_PREVIOUS_KEY = "previous_key"; 50571a8c389798bd3f01429f6be34cd3e606ab34dfAngus Kong public static final String NAME_TAB_KEY = "tab_key"; 51c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SHORTCUT_KEY = "shortcut_key"; 52c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_SHORTCUT_KEY_DISABLED = "shortcut_key_disabled"; 53c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public static final String NAME_LANGUAGE_SWITCH_KEY = "language_switch_key"; 5416029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling public static final String NAME_ZWNJ_KEY = "zwnj_key"; 5516029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling public static final String NAME_ZWJ_KEY = "zwj_key"; 5616029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling public static final String NAME_EMOJI_KEY = "emoji_key"; 57c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 58c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static final SparseIntArray ATTR_ID_TO_ICON_ID = new SparseIntArray(); 59c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 60c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling // Icon name to icon id map. 61c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static final HashMap<String, Integer> sNameToIdsMap = new HashMap<>(); 6216029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling 6316029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling private static final Object[] NAMES_AND_ATTR_IDS = { 6416029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_UNDEFINED, ATTR_UNDEFINED, 6516029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_SHIFT_KEY, R.styleable.Keyboard_iconShiftKey, 6616029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_DELETE_KEY, R.styleable.Keyboard_iconDeleteKey, 6716029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_SETTINGS_KEY, R.styleable.Keyboard_iconSettingsKey, 6816029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_SPACE_KEY, R.styleable.Keyboard_iconSpaceKey, 6916029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_ENTER_KEY, R.styleable.Keyboard_iconEnterKey, 7016029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_GO_KEY, R.styleable.Keyboard_iconGoKey, 7116029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_SEARCH_KEY, R.styleable.Keyboard_iconSearchKey, 7216029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_SEND_KEY, R.styleable.Keyboard_iconSendKey, 7316029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_NEXT_KEY, R.styleable.Keyboard_iconNextKey, 7416029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_DONE_KEY, R.styleable.Keyboard_iconDoneKey, 7516029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_PREVIOUS_KEY, R.styleable.Keyboard_iconPreviousKey, 7616029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_TAB_KEY, R.styleable.Keyboard_iconTabKey, 7716029b4a9e0d16cb05ca2202c0b91fe04d412443Sascha Haeberling NAME_SHORTCUT_KEY, R.styleable.Keyboard_iconShortcutKey, 78c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling NAME_SPACE_KEY_FOR_NUMBER_LAYOUT, R.styleable.Keyboard_iconSpaceKeyForNumberLayout, 79c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling NAME_SHIFT_KEY_SHIFTED, R.styleable.Keyboard_iconShiftKeyShifted, 80c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling NAME_SHORTCUT_KEY_DISABLED, R.styleable.Keyboard_iconShortcutKeyDisabled, 81c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling NAME_LANGUAGE_SWITCH_KEY, R.styleable.Keyboard_iconLanguageSwitchKey, 82c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling NAME_ZWNJ_KEY, R.styleable.Keyboard_iconZwnjKey, 83c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling NAME_ZWJ_KEY, R.styleable.Keyboard_iconZwjKey, 84c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling NAME_EMOJI_KEY, R.styleable.Keyboard_iconEmojiKey, 85c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling }; 86571a8c389798bd3f01429f6be34cd3e606ab34dfAngus Kong 87c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static int NUM_ICONS = NAMES_AND_ATTR_IDS.length / 2; 88c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static final String[] ICON_NAMES = new String[NUM_ICONS]; 89c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private final Drawable[] mIcons = new Drawable[NUM_ICONS]; 90c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private final int[] mIconResourceIds = new int[NUM_ICONS]; 91571a8c389798bd3f01429f6be34cd3e606ab34dfAngus Kong 92c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling static { 93c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling int iconId = ICON_UNDEFINED; 94c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling for (int i = 0; i < NAMES_AND_ATTR_IDS.length; i += 2) { 95c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling final String name = (String)NAMES_AND_ATTR_IDS[i]; 96571a8c389798bd3f01429f6be34cd3e606ab34dfAngus Kong final Integer attrId = (Integer)NAMES_AND_ATTR_IDS[i + 1]; 97c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling if (attrId != ATTR_UNDEFINED) { 98c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling ATTR_ID_TO_ICON_ID.put(attrId, iconId); 99aeed91f3777d08a4160d68ddfc2626808a08b92dSam Judd } 100aeed91f3777d08a4160d68ddfc2626808a08b92dSam Judd sNameToIdsMap.put(name, iconId); 101aeed91f3777d08a4160d68ddfc2626808a08b92dSam Judd ICON_NAMES[iconId] = name; 102aeed91f3777d08a4160d68ddfc2626808a08b92dSam Judd iconId++; 103aeed91f3777d08a4160d68ddfc2626808a08b92dSam Judd } 104aeed91f3777d08a4160d68ddfc2626808a08b92dSam Judd } 105c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 106c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public void loadIcons(final TypedArray keyboardAttrs) { 107c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling final int size = ATTR_ID_TO_ICON_ID.size(); 108c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling for (int index = 0; index < size; index++) { 109c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling final int attrId = ATTR_ID_TO_ICON_ID.keyAt(index); 110c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling try { 111c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling final Drawable icon = keyboardAttrs.getDrawable(attrId); 112c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling setDefaultBounds(icon); 113c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling final Integer iconId = ATTR_ID_TO_ICON_ID.get(attrId); 114c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mIcons[iconId] = icon; 115c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mIconResourceIds[iconId] = keyboardAttrs.getResourceId(attrId, 0); 116c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } catch (Resources.NotFoundException e) { 117c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling Log.w(TAG, "Drawable resource for icon #" 118c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling + keyboardAttrs.getResources().getResourceEntryName(attrId) 119c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling + " not found"); 120c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 121c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 122c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 123c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 124c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static boolean isValidIconId(final int iconId) { 125 return iconId >= 0 && iconId < ICON_NAMES.length; 126 } 127 128 public static String getIconName(final int iconId) { 129 return isValidIconId(iconId) ? ICON_NAMES[iconId] : "unknown<" + iconId + ">"; 130 } 131 132 public static int getIconId(final String name) { 133 Integer iconId = sNameToIdsMap.get(name); 134 if (iconId != null) { 135 return iconId; 136 } 137 throw new RuntimeException("unknown icon name: " + name); 138 } 139 140 public int getIconResourceId(final String name) { 141 final int iconId = getIconId(name); 142 if (isValidIconId(iconId)) { 143 return mIconResourceIds[iconId]; 144 } 145 throw new RuntimeException("unknown icon name: " + name); 146 } 147 148 public Drawable getIconDrawable(final int iconId) { 149 if (isValidIconId(iconId)) { 150 return mIcons[iconId]; 151 } 152 throw new RuntimeException("unknown icon id: " + getIconName(iconId)); 153 } 154 155 private static void setDefaultBounds(final Drawable icon) { 156 if (icon != null) { 157 icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight()); 158 } 159 } 160} 161