diff options
-rw-r--r-- | java/AndroidManifest.xml | 1 | ||||
-rw-r--r-- | java/res/layout/input_view.xml | 4 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java | 6 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/keyboard/KeyboardView.java | 2 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/latin/InputView.java | 112 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/latin/SuggestionsView.java | 2 | ||||
-rw-r--r-- | native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp | 30 | ||||
-rw-r--r-- | native/jni/jni_common.h | 18 | ||||
-rw-r--r-- | native/src/proximity_info.cpp | 23 | ||||
-rw-r--r-- | tools/makedict/src/com/android/inputmethod/latin/FusionDictionary.java | 4 |
10 files changed, 168 insertions, 34 deletions
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 703258b6a..2baae54fb 100644 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,4 +1,5 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" + coreApp="true" package="com.android.inputmethod.latin"> <uses-permission android:name="android.permission.VIBRATE"/> diff --git a/java/res/layout/input_view.xml b/java/res/layout/input_view.xml index 13560e0cf..2e0cddc28 100644 --- a/java/res/layout/input_view.xml +++ b/java/res/layout/input_view.xml @@ -18,7 +18,7 @@ */ --> -<LinearLayout +<com.android.inputmethod.latin.InputView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" android:orientation="vertical" @@ -61,4 +61,4 @@ android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" /> -</LinearLayout> +</com.android.inputmethod.latin.InputView> diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index 2d123699e..a4684358d 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -32,6 +32,7 @@ import android.view.inputmethod.EditorInfo; import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy; import com.android.inputmethod.keyboard.internal.ModifierKeyState; import com.android.inputmethod.keyboard.internal.ShiftKeyState; +import com.android.inputmethod.latin.InputView; import com.android.inputmethod.latin.LatinIME; import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.LocaleUtils; @@ -62,7 +63,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private SubtypeSwitcher mSubtypeSwitcher; private SharedPreferences mPrefs; - private View mCurrentInputView; + private InputView mCurrentInputView; private LatinKeyboardView mKeyboardView; private LatinIME mInputMethodService; private String mPackageName; @@ -230,6 +231,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private void setKeyboard(final Keyboard keyboard) { final Keyboard oldKeyboard = mKeyboardView.getKeyboard(); mKeyboardView.setKeyboard(keyboard); + mCurrentInputView.setKeyboardGeometry(keyboard.mTopPadding); mCurrentId = keyboard.mId; mSwitchState = getSwitchState(mCurrentId); updateShiftLockState(keyboard); @@ -762,7 +764,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { try { setContextThemeWrapper(mInputMethodService, newThemeIndex); - mCurrentInputView = LayoutInflater.from(mThemeContext).inflate( + mCurrentInputView = (InputView)LayoutInflater.from(mThemeContext).inflate( R.layout.input_view, null); tryGC = false; } catch (OutOfMemoryError e) { diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index c94ffd940..6af4123c9 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -968,7 +968,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { } @Override - public void onDetachedFromWindow() { + protected void onDetachedFromWindow() { super.onDetachedFromWindow(); closing(); if (mPreviewPlacer != null) { diff --git a/java/src/com/android/inputmethod/latin/InputView.java b/java/src/com/android/inputmethod/latin/InputView.java new file mode 100644 index 000000000..0dcb811b5 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/InputView.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2011 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.latin; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.LinearLayout; + +public class InputView extends LinearLayout { + private View mSuggestionsContainer; + private View mKeyboardView; + private int mKeyboardTopPadding; + + private boolean mIsForwardingEvent; + private final Rect mInputViewRect = new Rect(); + private final Rect mEventForwardingRect = new Rect(); + private final Rect mEventReceivingRect = new Rect(); + + public InputView(Context context, AttributeSet attrs) { + super(context, attrs, 0); + } + + public void setKeyboardGeometry(int keyboardTopPadding) { + mKeyboardTopPadding = keyboardTopPadding; + } + + @Override + protected void onFinishInflate() { + mSuggestionsContainer = findViewById(R.id.suggestions_container); + mKeyboardView = findViewById(R.id.keyboard_view); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent me) { + if (mSuggestionsContainer.getVisibility() == VISIBLE + && mKeyboardView.getVisibility() == VISIBLE + && forwardTouchEvent(me)) { + return true; + } + return super.dispatchTouchEvent(me); + } + + // The touch events that hit the top padding of keyboard should be forwarded to SuggestionsView. + private boolean forwardTouchEvent(MotionEvent me) { + final Rect rect = mInputViewRect; + this.getGlobalVisibleRect(rect); + final int x = (int)me.getX() + rect.left; + final int y = (int)me.getY() + rect.top; + + final Rect forwardingRect = mEventForwardingRect; + mKeyboardView.getGlobalVisibleRect(forwardingRect); + if (!mIsForwardingEvent && !forwardingRect.contains(x, y)) { + return false; + } + + final int forwardingLimitY = forwardingRect.top + mKeyboardTopPadding; + boolean sendToTarget = false; + + switch (me.getAction()) { + case MotionEvent.ACTION_DOWN: + if (y < forwardingLimitY) { + // This down event and further move and up events should be forwarded to the target. + mIsForwardingEvent = true; + sendToTarget = true; + } + break; + case MotionEvent.ACTION_MOVE: + sendToTarget = mIsForwardingEvent; + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + sendToTarget = mIsForwardingEvent; + mIsForwardingEvent = false; + break; + } + + if (!sendToTarget) { + return false; + } + + final Rect receivingRect = mEventReceivingRect; + mSuggestionsContainer.getGlobalVisibleRect(receivingRect); + final int translatedX = x - receivingRect.left; + final int translatedY; + if (y < forwardingLimitY) { + // The forwarded event should have coordinates that are inside of the target. + translatedY = Math.min(y - receivingRect.top, receivingRect.height() - 1); + } else { + translatedY = y - receivingRect.top; + } + me.setLocation(translatedX, translatedY); + mSuggestionsContainer.dispatchTouchEvent(me); + return true; + } +} diff --git a/java/src/com/android/inputmethod/latin/SuggestionsView.java b/java/src/com/android/inputmethod/latin/SuggestionsView.java index 196148731..9d0e42a18 100644 --- a/java/src/com/android/inputmethod/latin/SuggestionsView.java +++ b/java/src/com/android/inputmethod/latin/SuggestionsView.java @@ -862,7 +862,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener, } @Override - public void onDetachedFromWindow() { + protected void onDetachedFromWindow() { super.onDetachedFromWindow(); mHandler.cancelAllMessages(); hidePreview(); diff --git a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp index d4fa436cc..7647a08eb 100644 --- a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp +++ b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp @@ -33,21 +33,21 @@ static jint latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object, jint gridHeight, jintArray proximityCharsArray, jint keyCount, jintArray keyXCoordinateArray, jintArray keyYCoordinateArray, jintArray keyWidthArray, jintArray keyHeightArray, jintArray keyCharCodeArray) { - jint* proximityChars = env->GetIntArrayElements(proximityCharsArray, NULL); - jint* keyXCoordinates = env->GetIntArrayElements(keyXCoordinateArray, NULL); - jint* keyYCoordinates = env->GetIntArrayElements(keyYCoordinateArray, NULL); - jint* keyWidths = env->GetIntArrayElements(keyWidthArray, NULL); - jint* keyHeights = env->GetIntArrayElements(keyHeightArray, NULL); - jint* keyCharCodes = env->GetIntArrayElements(keyCharCodeArray, NULL); + jint *proximityChars = env->GetIntArrayElements(proximityCharsArray, NULL); + jint *keyXCoordinates = safeGetIntArrayElements(env, keyXCoordinateArray); + jint *keyYCoordinates = safeGetIntArrayElements(env, keyYCoordinateArray); + jint *keyWidths = safeGetIntArrayElements(env, keyWidthArray); + jint *keyHeights = safeGetIntArrayElements(env, keyHeightArray); + jint *keyCharCodes = safeGetIntArrayElements(env, keyCharCodeArray); ProximityInfo *proximityInfo = new ProximityInfo(maxProximityCharsSize, displayWidth, - displayHeight, gridWidth, gridHeight, (const uint32_t *)proximityChars, - keyCount, (const int32_t *)keyXCoordinates, (const int32_t *)keyYCoordinates, - (const int32_t *)keyWidths, (const int32_t *)keyHeights, (const int32_t *)keyCharCodes); - env->ReleaseIntArrayElements(keyCharCodeArray, keyCharCodes, 0); - env->ReleaseIntArrayElements(keyHeightArray, keyHeights, 0); - env->ReleaseIntArrayElements(keyWidthArray, keyWidths, 0); - env->ReleaseIntArrayElements(keyYCoordinateArray, keyYCoordinates, 0); - env->ReleaseIntArrayElements(keyXCoordinateArray, keyXCoordinates, 0); + displayHeight, gridWidth, gridHeight, (const uint32_t*)proximityChars, + keyCount, (const int32_t*)keyXCoordinates, (const int32_t*)keyYCoordinates, + (const int32_t*)keyWidths, (const int32_t*)keyHeights, (const int32_t*)keyCharCodes); + safeReleaseIntArrayElements(env, keyCharCodeArray, keyCharCodes); + safeReleaseIntArrayElements(env, keyHeightArray, keyHeights); + safeReleaseIntArrayElements(env, keyWidthArray, keyWidths); + safeReleaseIntArrayElements(env, keyYCoordinateArray, keyYCoordinates); + safeReleaseIntArrayElements(env, keyXCoordinateArray, keyXCoordinates); env->ReleaseIntArrayElements(proximityCharsArray, proximityChars, 0); return (jint)proximityInfo; } @@ -64,7 +64,7 @@ static JNINativeMethod sKeyboardMethods[] = { }; int register_ProximityInfo(JNIEnv *env) { - const char* const kClassPathName = "com/android/inputmethod/keyboard/ProximityInfo"; + const char *const kClassPathName = "com/android/inputmethod/keyboard/ProximityInfo"; return registerNativeMethods(env, kClassPathName, sKeyboardMethods, sizeof(sKeyboardMethods) / sizeof(sKeyboardMethods[0])); } diff --git a/native/jni/jni_common.h b/native/jni/jni_common.h index c502fa3a8..dbf6d3e19 100644 --- a/native/jni/jni_common.h +++ b/native/jni/jni_common.h @@ -18,13 +18,29 @@ #ifndef LATINIME_JNI_COMMON_H #define LATINIME_JNI_COMMON_H +#include <stdlib.h> + #include "jni.h" namespace latinime { -int registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* methods, +int registerNativeMethods(JNIEnv *env, const char *className, JNINativeMethod *methods, int numMethods); +inline jint *safeGetIntArrayElements(JNIEnv *env, jintArray jArray) { + if (jArray) { + return env->GetIntArrayElements(jArray, NULL); + } else { + return NULL; + } +} + +inline void safeReleaseIntArrayElements(JNIEnv *env, jintArray jArray, jint *cArray) { + if (jArray) { + env->ReleaseIntArrayElements(jArray, cArray, 0); + } +} + } // namespace latinime #endif // LATINIME_JNI_COMMON_H diff --git a/native/src/proximity_info.cpp b/native/src/proximity_info.cpp index 94cccc382..87cacd938 100644 --- a/native/src/proximity_info.cpp +++ b/native/src/proximity_info.cpp @@ -26,6 +26,14 @@ namespace latinime { +inline void copyOrFillZero(void *to, const void *from, size_t size) { + if (from) { + memcpy(to, from, size); + } else { + memset(to, 0, size); + } +} + ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth, const int keyboardHeight, const int gridWidth, const int gridHeight, const uint32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates, @@ -43,16 +51,11 @@ ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboard } memcpy(mProximityCharsArray, proximityCharsArray, len * sizeof(mProximityCharsArray[0])); - if (KEY_COUNT > 0) { - if (DEBUG_PROXIMITY_INFO) { - LOGI("Create key coordinate array %d", keyCount); - } - memcpy(mKeyXCoordinates, keyXCoordinates, KEY_COUNT * sizeof(mKeyXCoordinates[0])); - memcpy(mKeyYCoordinates, keyYCoordinates, KEY_COUNT * sizeof(mKeyYCoordinates[0])); - memcpy(mKeyWidths, keyWidths, KEY_COUNT * sizeof(mKeyWidths[0])); - memcpy(mKeyHeights, keyHeights, KEY_COUNT * sizeof(mKeyHeights[0])); - memcpy(mKeyCharCodes, keyCharCodes, KEY_COUNT * sizeof(mKeyCharCodes[0])); - } + copyOrFillZero(mKeyXCoordinates, keyXCoordinates, KEY_COUNT * sizeof(mKeyXCoordinates[0])); + copyOrFillZero(mKeyYCoordinates, keyYCoordinates, KEY_COUNT * sizeof(mKeyYCoordinates[0])); + copyOrFillZero(mKeyWidths, keyWidths, KEY_COUNT * sizeof(mKeyWidths[0])); + copyOrFillZero(mKeyHeights, keyHeights, KEY_COUNT * sizeof(mKeyHeights[0])); + copyOrFillZero(mKeyCharCodes, keyCharCodes, KEY_COUNT * sizeof(mKeyCharCodes[0])); initializeCodeToGroup(); initializeCodeToKeyIndex(); diff --git a/tools/makedict/src/com/android/inputmethod/latin/FusionDictionary.java b/tools/makedict/src/com/android/inputmethod/latin/FusionDictionary.java index 031f35dfe..f6220eea2 100644 --- a/tools/makedict/src/com/android/inputmethod/latin/FusionDictionary.java +++ b/tools/makedict/src/com/android/inputmethod/latin/FusionDictionary.java @@ -217,7 +217,7 @@ public class FusionDictionary implements Iterable<Word> { int nodeIndex = findIndexOfChar(mRoot, word[charIndex]); while (CHARACTER_NOT_FOUND != nodeIndex) { currentGroup = currentNode.mData.get(nodeIndex); - differentCharIndex = compareArrays(currentGroup.mChars, word, charIndex) ; + differentCharIndex = compareArrays(currentGroup.mChars, word, charIndex); if (ARRAYS_ARE_EQUAL != differentCharIndex && differentCharIndex < currentGroup.mChars.length) break; if (null == currentGroup.mChildren) break; @@ -268,7 +268,7 @@ public class FusionDictionary implements Iterable<Word> { + new String(word, 0, word.length)); } final CharGroup newGroup = new CharGroup(word, - currentGroup.mBigrams, frequency); + currentGroup.mBigrams, frequency, currentGroup.mChildren); currentNode.mData.set(nodeIndex, newGroup); } } else { |