diff options
Diffstat (limited to 'src/us/minak/IMEGestureOverlayView.java')
-rw-r--r-- | src/us/minak/IMEGestureOverlayView.java | 97 |
1 files changed, 69 insertions, 28 deletions
diff --git a/src/us/minak/IMEGestureOverlayView.java b/src/us/minak/IMEGestureOverlayView.java index e27b70a..35fe1eb 100644 --- a/src/us/minak/IMEGestureOverlayView.java +++ b/src/us/minak/IMEGestureOverlayView.java @@ -1,20 +1,5 @@ -/* - ******************************************************************************** - * Copyright (c) 2012 Samsung Electronics, Inc. - * All rights reserved. - * - * This software is a confidential and proprietary information of Samsung - * Electronics, Inc. ("Confidential Information"). You shall not disclose such - * Confidential Information and shall use it only in accordance with the terms - * of the license agreement you entered into with Samsung Electronics. - ******************************************************************************** - */ - package us.minak; -import java.util.LinkedList; -import java.util.List; - import android.content.Context; import android.gesture.Gesture; import android.gesture.GestureLibrary; @@ -23,16 +8,24 @@ import android.gesture.GestureOverlayView.OnGesturePerformedListener; import android.gesture.Prediction; import android.graphics.Canvas; import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.KeyCharacterMap; +import android.view.MotionEvent; +import android.view.inputmethod.InputConnection; + +import java.util.List; -/** - * Represent a space where drawing gestures are performed. - */ public class IMEGestureOverlayView extends GestureOverlayView implements OnGesturePerformedListener { private static final double SCORE_TRESHOLD = 3.0; private final GestureLibrary mGestureLibrary; - private StringReciever mOnGestureRecognizedListener; - public List<IMEModifierCircle> circles = new LinkedList<IMEModifierCircle>(); + private InputConnectionGetter icGetter = new InputConnectionGetter.NullGetter(); private final IMEModifiers modifiers = new IMEModifiers(); + private final KeyCharacterMap charMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); + float x = -1, y = -1; + int meta = 0; + + // cache for repeated calls + InputConnection ic = null; public IMEGestureOverlayView(Context context, AttributeSet attrs) { super(context, attrs); @@ -41,10 +34,26 @@ public class IMEGestureOverlayView extends GestureOverlayView implements OnGestu addOnGesturePerformedListener(this); } - public void setOnGestureRecognizedListener(StringReciever onGestureRecognizedListener) { - mOnGestureRecognizedListener = onGestureRecognizedListener; + public void setInputConnectionGetter(InputConnectionGetter icGetter) { + this.icGetter = icGetter; + } + + private void sendKeyEvent(KeyEvent keyEvent) { + if (ic != null) { + ic.sendKeyEvent(new KeyEvent( + keyEvent.getDownTime(), + keyEvent.getEventTime(), + keyEvent.getAction(), + keyEvent.getKeyCode(), + keyEvent.getRepeatCount(), + keyEvent.getMetaState() | meta)); + } } + /** + * This function is pretty strongly based on the code in + * Samsung's "Penboard" whitepaper. + */ @Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { final List<Prediction> predictions = mGestureLibrary.recognize(gesture); @@ -52,18 +61,50 @@ public class IMEGestureOverlayView extends GestureOverlayView implements OnGestu if (!predictions.isEmpty()) { bestPrediction = predictions.get(0); } - if (mOnGestureRecognizedListener != null && bestPrediction != null) { - if (bestPrediction.score > SCORE_TRESHOLD) { - mOnGestureRecognizedListener.putString(bestPrediction.name); - } else { - clear(false); + + ic = icGetter.getCurrentInputConnection(); + if (ic != null) { + if (bestPrediction != null) { + if (bestPrediction.score > SCORE_TRESHOLD) { + for (KeyEvent keyEvent : charMap.getEvents(bestPrediction.name.toCharArray())) + sendKeyEvent(keyEvent); + } else { + clear(false); + } + } + for (IMEModifier modifier : modifiers.getSelection()) { + sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, modifier.keycode)); } } + modifiers.clearSelection(); + meta = 0; + invalidate(); + x = y = -1; } @Override public void onDraw(Canvas canvas) { float d = Math.min(canvas.getWidth(), canvas.getHeight()); - modifiers.draw(canvas, d/2, d/2, d*.4F); + modifiers.draw(canvas, d/2, d/2, d*.47F); + } + + @Override + public boolean onTouchEvent (MotionEvent event) { + if (x < 0 && y < 0 && event.getActionMasked() == MotionEvent.ACTION_DOWN) { + x = event.getX(); + y = event.getY(); + modifiers.setSelectionPoint(x, y); + invalidate(); + + ic = icGetter.getCurrentInputConnection(); + if (ic != null) { + for (IMEModifier modifier : modifiers.getSelection()) { + sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, modifier.keycode)); + meta |= modifier.metamask; + } + return true; + } + } + return false; } } |