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