summaryrefslogtreecommitdiff
path: root/src/us/minak/IMEGestureOverlayView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/us/minak/IMEGestureOverlayView.java')
-rw-r--r--src/us/minak/IMEGestureOverlayView.java97
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;
}
}