diff options
author | 2013-01-08 12:57:50 +0900 | |
---|---|---|
committer | 2013-01-10 15:47:21 +0900 | |
commit | 6a26de1d7e3bb3b277c0af6d678023b862c22a86 (patch) | |
tree | 428946318c9e0fff3e79ea5e6035de53f4891578 /java/src/com/android/inputmethod/event/DeadKeyCombiner.java | |
parent | 424d76fbf59bea5f96694a31918568a7479b89be (diff) | |
download | latinime-6a26de1d7e3bb3b277c0af6d678023b862c22a86.tar.gz latinime-6a26de1d7e3bb3b277c0af6d678023b862c22a86.tar.xz latinime-6a26de1d7e3bb3b277c0af6d678023b862c22a86.zip |
Initial implementation for dead keys (B3)
Bug: 5037589
Change-Id: I9e1ff92df7d0c58eb7a0f33603adebc9efb86585
Diffstat (limited to 'java/src/com/android/inputmethod/event/DeadKeyCombiner.java')
-rw-r--r-- | java/src/com/android/inputmethod/event/DeadKeyCombiner.java | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java new file mode 100644 index 000000000..52987d571 --- /dev/null +++ b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.event; + +import android.text.TextUtils; +import android.view.KeyCharacterMap; + +import com.android.inputmethod.latin.Constants; + +/** + * A combiner that handles dead keys. + */ +public class DeadKeyCombiner implements Combiner { + final StringBuilder mDeadSequence = new StringBuilder(); + + @Override + public Event combine(final Event event) { + if (null == event) return null; // Just in case some combiner is broken + if (TextUtils.isEmpty(mDeadSequence)) { + if (event.isDead()) { + mDeadSequence.appendCodePoint(event.mCodePoint); + } + return event; + } else { + // TODO: Allow combining for several dead chars rather than only the first one. + // The framework doesn't know how to do this now. + final int deadCodePoint = mDeadSequence.codePointAt(0); + mDeadSequence.setLength(0); + final int resultingCodePoint = + KeyCharacterMap.getDeadChar(deadCodePoint, event.mCodePoint); + if (0 == resultingCodePoint) { + // We can't combine both characters. We need to commit the dead key as a committable + // character, and the next char too unless it's a space (because as a special case, + // dead key + space should result in only the dead key being committed - that's + // how dead keys work). + // If the event is a space, we should commit the dead char alone, but if it's + // not, we need to commit both. + return Event.createCommittableEvent(deadCodePoint, + Constants.CODE_SPACE == event.mCodePoint ? null : event /* next */); + } else { + // We could combine the characters. + return Event.createCommittableEvent(resultingCodePoint, null /* next */); + } + } + } + +} |