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