diff options
Diffstat (limited to 'java/src')
5 files changed, 82 insertions, 56 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java index f77155ee3..9e4c1ea79 100644 --- a/java/src/com/android/inputmethod/keyboard/Keyboard.java +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -138,7 +138,7 @@ public class Keyboard { mProximityInfo = new ProximityInfo( params.GRID_WIDTH, params.GRID_HEIGHT, mOccupiedWidth, mOccupiedHeight, - mMostCommonKeyWidth, mKeys, params.mTouchPositionCorrectionXs, + mMostCommonKeyWidth, mMostCommonKeyHeight, mKeys, params.mTouchPositionCorrectionXs, params.mTouchPositionCorrectionYs, params.mTouchPositionCorrectionRadii); } diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java index 210ab48a1..d35b1a939 100644 --- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java +++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java @@ -16,6 +16,9 @@ package com.android.inputmethod.keyboard; +import android.graphics.Rect; + +import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.latin.Utils; import com.android.inputmethod.latin.spellcheck.SpellCheckerProximityInfo; @@ -27,9 +30,9 @@ public class ProximityInfo { public static final int MAX_PROXIMITY_CHARS_SIZE = 16; /** Number of key widths from current touch point to search for nearest keys. */ private static float SEARCH_DISTANCE = 1.2f; - private static final int UNKNOWN_THEME = -1; private static final int[] EMPTY_INT_ARRAY = new int[0]; + private final int mKeyHeight; private final int mGridWidth; private final int mGridHeight; private final int mGridSize; @@ -45,8 +48,8 @@ public class ProximityInfo { private final float[] mTouchPositionCorrectionRadii; ProximityInfo(int gridWidth, int gridHeight, int minWidth, int height, int keyWidth, - List<Key> keys, float[] touchPositionCorrectionXs, float[] touchPositionCorrectionYs, - float[] touchPositionCorrectionRadii) { + int keyHeight, List<Key> keys, float[] touchPositionCorrectionXs, + float[] touchPositionCorrectionYs, float[] touchPositionCorrectionRadii) { mGridWidth = gridWidth; mGridHeight = gridHeight; mGridSize = mGridWidth * mGridHeight; @@ -54,6 +57,7 @@ public class ProximityInfo { mCellHeight = (height + mGridHeight - 1) / mGridHeight; mKeyboardMinWidth = minWidth; mKeyboardHeight = height; + mKeyHeight = keyHeight; mTouchPositionCorrectionXs = touchPositionCorrectionXs; mTouchPositionCorrectionYs = touchPositionCorrectionYs; mTouchPositionCorrectionRadii = touchPositionCorrectionRadii; @@ -66,7 +70,7 @@ public class ProximityInfo { } public static ProximityInfo createDummyProximityInfo() { - return new ProximityInfo(1, 1, 1, 1, 1, Collections.<Key>emptyList(), null, null, null); + return new ProximityInfo(1, 1, 1, 1, 1, 1, Collections.<Key>emptyList(), null, null, null); } public static ProximityInfo createSpellCheckerProximityInfo() { @@ -75,7 +79,7 @@ public class ProximityInfo { spellCheckerProximityInfo.setProximityInfoNative( SpellCheckerProximityInfo.ROW_SIZE, 480, 300, 10, 3, SpellCheckerProximityInfo.PROXIMITY, - 0, null, null, null, null, null, UNKNOWN_THEME); + 0, null, null, null, null, null, null, null, null); return spellCheckerProximityInfo; } @@ -86,7 +90,8 @@ public class ProximityInfo { private native int setProximityInfoNative(int maxProximityCharsSize, int displayWidth, int displayHeight, int gridWidth, int gridHeight, int[] proximityCharsArray, int keyCount, int[] keyXCoordinates, int[] keyYCoordinates, - int[] keyWidths, int[] keyHeights, int[] keyCharCodes, int themeId); + int[] keyWidths, int[] keyHeights, int[] keyCharCodes, + float[] sweetSpotCenterX, float[] sweetSpotCenterY, float[] sweetSpotRadii); private native void releaseProximityInfoNative(int nativeProximityInfo); private final void setProximityInfo(int[][] gridNeighborKeyIndexes, int keyboardWidth, @@ -101,12 +106,11 @@ public class ProximityInfo { } } final int keyCount = keys.size(); - int[] keyXCoordinates = new int[keyCount]; - int[] keyYCoordinates = new int[keyCount]; - int[] keyWidths = new int[keyCount]; - int[] keyHeights = new int[keyCount]; - int[] keyCharCodes = new int[keyCount]; - final int themeId = 5; // TODO: Use real theme id. + final int[] keyXCoordinates = new int[keyCount]; + final int[] keyYCoordinates = new int[keyCount]; + final int[] keyWidths = new int[keyCount]; + final int[] keyHeights = new int[keyCount]; + final int[] keyCharCodes = new int[keyCount]; for (int i = 0; i < keyCount; ++i) { final Key key = keys.get(i); keyXCoordinates[i] = key.mX; @@ -115,10 +119,51 @@ public class ProximityInfo { keyHeights[i] = key.mHeight; keyCharCodes[i] = key.mCode; } + + final boolean hasTouchPositionCorrectionData = + mTouchPositionCorrectionXs != null + && mTouchPositionCorrectionYs != null + && mTouchPositionCorrectionRadii != null + && mTouchPositionCorrectionXs.length > 0 + && mTouchPositionCorrectionYs.length > 0 + && mTouchPositionCorrectionRadii.length > 0; + final float[] sweetSpotCenterXs = + hasTouchPositionCorrectionData ? new float[keyCount] : null; + final float[] sweetSpotCenterYs = + hasTouchPositionCorrectionData ? new float[keyCount] : null; + final float[] sweetSpotRadii = + hasTouchPositionCorrectionData ? new float[keyCount] : null; + if (hasTouchPositionCorrectionData) { + calculateSweetSpot(keys, sweetSpotCenterXs, sweetSpotCenterYs, sweetSpotRadii); + } + mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE, keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray, keyCount, keyXCoordinates, keyYCoordinates, keyWidths, keyHeights, keyCharCodes, - themeId); + sweetSpotCenterXs, sweetSpotCenterYs, sweetSpotRadii); + } + + private void calculateSweetSpot(List<Key> keys, float[] sweetSpotCenterXs, + float[] sweetSpotCenterYs, float[] sweetSpotRadii) { + final int keyCount = keys.size(); + for (int i = 0; i < keyCount; ++i) { + final Key key = keys.get(i); + final Rect hitBox = key.mHitBox; + final int row = hitBox.top / mKeyHeight; + if (row < mTouchPositionCorrectionRadii.length) { + final float hitBoxCenterX = (hitBox.left + hitBox.right) * 0.5f; + final float hitBoxCenterY = (hitBox.top + hitBox.bottom) * 0.5f; + final float hitBoxWidth = hitBox.right - hitBox.left; + final float hitBoxHeight = hitBox.bottom - hitBox.top; + final float x = mTouchPositionCorrectionXs[row]; + final float y = mTouchPositionCorrectionYs[row]; + final float radius = mTouchPositionCorrectionRadii[row]; + sweetSpotCenterXs[i] = hitBoxCenterX + x * hitBoxWidth; + sweetSpotCenterYs[i] = hitBoxCenterY + y * hitBoxHeight; + sweetSpotRadii[i] = radius + * (float)Math.sqrt(hitBoxWidth * hitBoxWidth + hitBoxHeight * hitBoxHeight); + } + } } public int getNativeProximityInfo() { diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 48a1f8bd7..cf1cb8f25 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1661,9 +1661,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion( autoCorrectionAvailable); } else { - final SuggestedWords previousSuggestions = mSuggestionsView.getSuggestions(); - if (previousSuggestions == mSettingsValues.mSuggestPuncList) - return; + SuggestedWords previousSuggestions = mSuggestionsView.getSuggestions(); + if (previousSuggestions == mSettingsValues.mSuggestPuncList) { + if (builder.size() == 0) { + return; + } + previousSuggestions = SuggestedWords.EMPTY; + } builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions); } } diff --git a/java/src/com/android/inputmethod/latin/MoreSuggestionsView.java b/java/src/com/android/inputmethod/latin/MoreSuggestionsView.java index 5a2eb1632..51f6c040d 100644 --- a/java/src/com/android/inputmethod/latin/MoreSuggestionsView.java +++ b/java/src/com/android/inputmethod/latin/MoreSuggestionsView.java @@ -163,8 +163,6 @@ public class MoreSuggestionsView extends KeyboardView implements MoreKeysPanel { - (container.getMeasuredHeight() - container.getPaddingBottom()) + parentView.getPaddingTop() + mCoordinates[1]; - window.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); - window.setOutsideTouchable(true); window.setContentView(container); window.setWidth(container.getMeasuredWidth()); window.setHeight(container.getMeasuredHeight()); @@ -221,22 +219,6 @@ public class MoreSuggestionsView extends KeyboardView implements MoreKeysPanel { }; @Override - public boolean dispatchTouchEvent(MotionEvent me) { - final int index = me.getActionIndex(); - final int id = me.getPointerId(index); - final PointerTracker tracker = PointerTracker.getPointerTracker(id, this); - final int x = (int)me.getX(index); - final int y = (int)me.getY(index); - final boolean inside = (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()); - if (inside || tracker.isInSlidingKeyInput()) { - return super.dispatchTouchEvent(me); - } else { - dismissMoreKeysPanel(); - return true; - } - } - - @Override public boolean onTouchEvent(MotionEvent me) { final int action = me.getAction(); final long eventTime = me.getEventTime(); diff --git a/java/src/com/android/inputmethod/latin/SuggestionsView.java b/java/src/com/android/inputmethod/latin/SuggestionsView.java index 9d0e42a18..fe54f4ae1 100644 --- a/java/src/com/android/inputmethod/latin/SuggestionsView.java +++ b/java/src/com/android/inputmethod/latin/SuggestionsView.java @@ -27,6 +27,7 @@ import android.graphics.Paint.Align; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Message; import android.os.SystemClock; @@ -506,10 +507,22 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener, mMoreSuggestionsView = (MoreSuggestionsView)mMoreSuggestionsContainer .findViewById(R.id.more_suggestions_view); mMoreSuggestionsBuilder = new MoreSuggestions.Builder(mMoreSuggestionsView); - mMoreSuggestionsWindow = new PopupWindow(context); - mMoreSuggestionsWindow.setWindowLayoutMode( + + final PopupWindow moreWindow = new PopupWindow(context); + moreWindow.setWindowLayoutMode( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - mMoreSuggestionsWindow.setBackgroundDrawable(null); + moreWindow.setBackgroundDrawable(new ColorDrawable(android.R.color.transparent)); + moreWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + moreWindow.setFocusable(true); + moreWindow.setOutsideTouchable(true); + moreWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + mKeyboardView.dimEntireKeyboard(false); + } + }); + mMoreSuggestionsWindow = moreWindow; + final Resources res = context.getResources(); mMoreSuggestionsModalTolerance = res.getDimensionPixelOffset( R.dimen.more_suggestions_modal_tolerance); @@ -517,21 +530,6 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener, context, mMoreSuggestionsSlidingListener); } - private final View.OnTouchListener mMoreSuggestionsCanceller = new View.OnTouchListener() { - @Override - public boolean onTouch(View view, MotionEvent me) { - if (!mMoreSuggestionsWindow.isShowing()) return false; - - switch (me.getAction()) { - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - return mMoreSuggestionsView.dismissMoreKeysPanel(); - default: - return true; - } - } - }; - /** * A connection back to the input method. * @param listener @@ -726,8 +724,6 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener, private boolean dismissMoreSuggestions() { if (mMoreSuggestionsWindow.isShowing()) { mMoreSuggestionsWindow.dismiss(); - mKeyboardView.dimEntireKeyboard(false); - mKeyboardView.setOnTouchListener(null); return true; } return false; @@ -767,7 +763,6 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener, mOriginX = mLastX; mOriginY = mLastY; mKeyboardView.dimEntireKeyboard(true); - mKeyboardView.setOnTouchListener(mMoreSuggestionsCanceller); for (int i = 0; i < params.mSuggestionsCountInStrip; i++) { mWords.get(i).setPressed(false); } |