diff options
author | 2012-12-21 19:01:19 +0900 | |
---|---|---|
committer | 2012-12-27 16:17:46 +0900 | |
commit | 581f324ed8314befdf7d8cf1c923791455cc11a5 (patch) | |
tree | 57e82dfd31a172f84305046dd79991a60907dd5c /java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java | |
parent | 0abc48218ee90b1d8df77dfa131ce05fbaba7121 (diff) | |
download | latinime-581f324ed8314befdf7d8cf1c923791455cc11a5.tar.gz latinime-581f324ed8314befdf7d8cf1c923791455cc11a5.tar.xz latinime-581f324ed8314befdf7d8cf1c923791455cc11a5.zip |
Initial implementation for decoding HW key events (B3)
Bug: 5037589
Change-Id: I829f70a258de58ef8d2b836a9b435198a226e37f
Diffstat (limited to 'java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java')
-rw-r--r-- | java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java index 34ce1c3f4..9861816ee 100644 --- a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java +++ b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java @@ -16,10 +16,15 @@ package com.android.inputmethod.event; +import android.view.KeyCharacterMap; import android.view.KeyEvent; /** * A hardware event decoder for a hardware qwerty-ish keyboard. + * + * The events are always hardware keypresses, but they can be key down or key up events, they + * can be dead keys, they can be meta keys like shift or ctrl... This does not deal with + * 10-key like keyboards; a different decoder is used for this. */ public class HardwareKeyboardEventDecoder implements HardwareEventDecoder { final int mDeviceId; @@ -31,6 +36,23 @@ public class HardwareKeyboardEventDecoder implements HardwareEventDecoder { @Override public Event decodeHardwareKey(final KeyEvent keyEvent) { - return Event.obtainEvent(); + final Event event = Event.obtainEvent(); + // KeyEvent#getUnicodeChar() does not exactly returns a unicode char, but rather a value + // that includes both the unicode char in the lower 21 bits and flags in the upper bits, + // hence the name "codePointAndFlags". {@see KeyEvent#getUnicodeChar()} for more info. + final int codePointAndFlags = keyEvent.getUnicodeChar(); + if (keyEvent.isPrintingKey()) { + if (0 != (codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT)) { + // A dead key. + event.setDeadEvent(codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT_MASK); + } else { + // A committable character. This should be committed right away, taking into + // account the current state. + event.setCommittableEvent(codePointAndFlags); + } + } else { + event.setNotHandledEvent(); + } + return event; } } |