19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#ifndef _ANDROIDFW_KEY_CHARACTER_MAP_H
18b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#define _ANDROIDFW_KEY_CHARACTER_MAP_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#if HAVE_ANDROID_OS
239f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <binder/IBinder.h>
249f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#endif
259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
26b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/Input.h>
276b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#include <utils/Errors.h>
286b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#include <utils/KeyedVector.h>
296b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#include <utils/Tokenizer.h>
306b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#include <utils/String8.h>
316b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#include <utils/Unicode.h>
329f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <utils/RefBase.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
346b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownnamespace android {
356b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
366b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown/**
376b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown * Describes a mapping from Android key codes to characters.
386b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown * Also specifies other functions of the keyboard such as the keyboard type
396b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown * and key modifier semantics.
409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * This object is immutable after it has been loaded.
426b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown */
439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownclass KeyCharacterMap : public RefBase {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
456b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    enum KeyboardType {
466b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        KEYBOARD_TYPE_UNKNOWN = 0,
476b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        KEYBOARD_TYPE_NUMERIC = 1,
486b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        KEYBOARD_TYPE_PREDICTIVE = 2,
496b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        KEYBOARD_TYPE_ALPHA = 3,
506b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        KEYBOARD_TYPE_FULL = 4,
516b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        KEYBOARD_TYPE_SPECIAL_FUNCTION = 5,
526ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        KEYBOARD_TYPE_OVERLAY = 6,
536ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    };
546ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown
556ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    enum Format {
566ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        // Base keyboard layout, may contain device-specific options, such as "type" declaration.
576ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        FORMAT_BASE = 0,
586ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        // Overlay keyboard layout, more restrictive, may be published by applications,
596ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        // cannot override device-specific options.
606ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        FORMAT_OVERLAY = 1,
616ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        // Either base or overlay layout ok.
626ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        FORMAT_ANY = 2,
636b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    };
646b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
6549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    // Substitute key code and meta state for fallback action.
6649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    struct FallbackAction {
6749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        int32_t keyCode;
6849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        int32_t metaState;
6949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    };
7049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
719f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /* Loads a key character map from a file. */
726ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    static status_t load(const String8& filename, Format format, sp<KeyCharacterMap>* outMap);
736ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown
746ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    /* Loads a key character map from its string contents. */
756ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    static status_t loadContents(const String8& filename,
766ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown            const char* contents, Format format, sp<KeyCharacterMap>* outMap);
776ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown
786ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    /* Combines a base key character map and an overlay. */
796ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    static sp<KeyCharacterMap> combine(const sp<KeyCharacterMap>& base,
806ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown            const sp<KeyCharacterMap>& overlay);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /* Returns an empty key character map. */
839f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    static sp<KeyCharacterMap> empty();
846b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
856b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    /* Gets the keyboard type. */
866b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    int32_t getKeyboardType() const;
876b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
886b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    /* Gets the primary character for this key as in the label physically printed on it.
896b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns 0 if none (eg. for non-printing keys). */
906b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    char16_t getDisplayLabel(int32_t keyCode) const;
916b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
926b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    /* Gets the Unicode character for the number or symbol generated by the key
936b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * when the keyboard is used as a dialing pad.
946b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns 0 if no number or symbol is generated.
956b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     */
966b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    char16_t getNumber(int32_t keyCode) const;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
986b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    /* Gets the Unicode character generated by the key and meta key modifiers.
996b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns 0 if no character is generated.
1006b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     */
1016b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    char16_t getCharacter(int32_t keyCode, int32_t metaState) const;
1026b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
10349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    /* Gets the fallback action to use by default if the application does not
10449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * handle the specified key.
10549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * Returns true if an action was available, false if none.
10649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     */
10749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    bool getFallbackAction(int32_t keyCode, int32_t metaState,
10849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            FallbackAction* outFallbackAction) const;
10949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
1106b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    /* Gets the first matching Unicode character that can be generated by the key,
1116b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * preferring the one with the specified meta key modifiers.
1126b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns 0 if no matching character is generated.
1136b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     */
1146b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    char16_t getMatch(int32_t keyCode, const char16_t* chars,
1156b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            size_t numChars, int32_t metaState) const;
1166b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1176b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    /* Gets a sequence of key events that could plausibly generate the specified
1186b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * character sequence.  Returns false if some of the characters cannot be generated.
1196b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     */
1206b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    bool getEvents(int32_t deviceId, const char16_t* chars, size_t numChars,
1216b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            Vector<KeyEvent>& outEvents) const;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1234a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown    /* Maps a scan code and usage code to a key code, in case this key map overrides
1244a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown     * the mapping in some way. */
1254a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown    status_t mapKey(int32_t scanCode, int32_t usageCode, int32_t* outKeyCode) const;
1264a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown
1279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#if HAVE_ANDROID_OS
1289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /* Reads a key map from a parcel. */
1299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    static sp<KeyCharacterMap> readFromParcel(Parcel* parcel);
1309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /* Writes a key map to a parcel. */
1329f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    void writeToParcel(Parcel* parcel) const;
1339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#endif
1349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownprotected:
1369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    virtual ~KeyCharacterMap();
1379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1396b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    struct Behavior {
1406b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        Behavior();
1416ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        Behavior(const Behavior& other);
1426b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1436b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        /* The next behavior in the list, or NULL if none. */
1446b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        Behavior* next;
1456b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1466b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        /* The meta key modifiers for this behavior. */
1476b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        int32_t metaState;
1486b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1496b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        /* The character to insert. */
1506b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        char16_t character;
1516b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1526b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        /* The fallback keycode if the key is not handled. */
1536b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        int32_t fallbackKeyCode;
1546b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    };
1556b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1566b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    struct Key {
1576b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        Key();
1586ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        Key(const Key& other);
1596b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        ~Key();
1606b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1616b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        /* The single character label printed on the key, or 0 if none. */
1626b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        char16_t label;
1636b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1646b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        /* The number or symbol character generated by the key, or 0 if none. */
1656b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        char16_t number;
1666b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1676b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        /* The list of key behaviors sorted from most specific to least specific
1686b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown         * meta key binding. */
1696b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        Behavior* firstBehavior;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1726b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    class Parser {
1736b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        enum State {
1746b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            STATE_TOP = 0,
1756b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            STATE_KEY = 1,
1766b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        };
1776b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1786b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        enum {
1796b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            PROPERTY_LABEL = 1,
1806b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            PROPERTY_NUMBER = 2,
1816b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            PROPERTY_META = 3,
1826b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        };
1836b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1846b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        struct Property {
1856b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            inline Property(int32_t property = 0, int32_t metaState = 0) :
1866b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown                    property(property), metaState(metaState) { }
1876b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1886b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t property;
1896b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t metaState;
1906b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        };
1916b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1926b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        KeyCharacterMap* mMap;
1936b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        Tokenizer* mTokenizer;
1946ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        Format mFormat;
1956b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        State mState;
1966b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        int32_t mKeyCode;
1976b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1986b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    public:
1996ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        Parser(KeyCharacterMap* map, Tokenizer* tokenizer, Format format);
2006b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        ~Parser();
2016b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        status_t parse();
2026b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
2036b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    private:
2046b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        status_t parseType();
2054a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown        status_t parseMap();
2064a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown        status_t parseMapKey();
2076b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        status_t parseKey();
2086b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        status_t parseKeyProperty();
2099a2bbf680e3b5b98051b9f2913ab6bd31b77f79aJeff Brown        status_t finishKey(Key* key);
2106b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        status_t parseModifier(const String8& token, int32_t* outMetaState);
2116b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        status_t parseCharacterLiteral(char16_t* outCharacter);
2126b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    };
2136b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
2149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    static sp<KeyCharacterMap> sEmpty;
2159f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
2166b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    KeyedVector<int32_t, Key*> mKeys;
2176b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    int mType;
2186b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
2194a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown    KeyedVector<int32_t, int32_t> mKeysByScanCode;
2204a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown    KeyedVector<int32_t, int32_t> mKeysByUsageCode;
2214a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    KeyCharacterMap();
2236ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    KeyCharacterMap(const KeyCharacterMap& other);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    bool getKey(int32_t keyCode, const Key** outKey) const;
22649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    bool getKeyBehavior(int32_t keyCode, int32_t metaState,
22749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            const Key** outKey, const Behavior** outBehavior) const;
2289a2bbf680e3b5b98051b9f2913ab6bd31b77f79aJeff Brown    static bool matchesMetaState(int32_t eventMetaState, int32_t behaviorMetaState);
22949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
2306b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    bool findKey(char16_t ch, int32_t* outKeyCode, int32_t* outMetaState) const;
2316b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
2326ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    static status_t load(Tokenizer* tokenizer, Format format, sp<KeyCharacterMap>* outMap);
2336ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown
2346b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    static void addKey(Vector<KeyEvent>& outEvents,
2356b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t deviceId, int32_t keyCode, int32_t metaState, bool down, nsecs_t time);
2366b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    static void addMetaKeys(Vector<KeyEvent>& outEvents,
2376b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t deviceId, int32_t metaState, bool down, nsecs_t time,
2386b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t* currentMetaState);
2396b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    static bool addSingleEphemeralMetaKey(Vector<KeyEvent>& outEvents,
2406b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t deviceId, int32_t metaState, bool down, nsecs_t time,
2416b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t keyCode, int32_t keyMetaState,
2426b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t* currentMetaState);
2436b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    static void addDoubleEphemeralMetaKey(Vector<KeyEvent>& outEvents,
2446b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t deviceId, int32_t metaState, bool down, nsecs_t time,
2456b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t leftKeyCode, int32_t leftKeyMetaState,
2466b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t rightKeyCode, int32_t rightKeyMetaState,
2476b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t eitherKeyMetaState,
2486b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t* currentMetaState);
2496b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    static void addLockedMetaKey(Vector<KeyEvent>& outEvents,
2506b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t deviceId, int32_t metaState, nsecs_t time,
2516b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t keyCode, int32_t keyMetaState,
2526b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            int32_t* currentMetaState);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2556b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown} // namespace android
2566b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
257b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#endif // _ANDROIDFW_KEY_CHARACTER_MAP_H
258