From 15b68bae2351f7cf1879265fbd627a386ec07998 Mon Sep 17 00:00:00 2001 From: Taran Singh Date: Mon, 2 May 2022 18:19:05 +0000 Subject: [PATCH] Add RichGesture modes to Handwriting Ime some fixes and Rich gesture support. Test: none Bug: none Change-Id: I220793ec93d0fce138aea42aa7a170f8e4008be7 --- .../test/handwritingime/HandwritingIme.java | 108 ++++++++++++++++-- .../android/test/handwritingime/InkView.java | 2 +- 2 files changed, 97 insertions(+), 13 deletions(-) diff --git a/tests/HandwritingIme/src/com/google/android/test/handwritingime/HandwritingIme.java b/tests/HandwritingIme/src/com/google/android/test/handwritingime/HandwritingIme.java index bf8bd14645a06..8b69db707d41f 100644 --- a/tests/HandwritingIme/src/com/google/android/test/handwritingime/HandwritingIme.java +++ b/tests/HandwritingIme/src/com/google/android/test/handwritingime/HandwritingIme.java @@ -16,15 +16,21 @@ package com.google.android.test.handwritingime; import android.annotation.Nullable; +import android.graphics.PointF; +import android.graphics.RectF; import android.inputmethodservice.InputMethodService; +import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; +import android.view.inputmethod.CursorAnchorInfo; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.FrameLayout; -import android.widget.TextView; +import android.widget.Spinner; import android.widget.Toast; import java.util.Random; @@ -33,10 +39,21 @@ public class HandwritingIme extends InputMethodService { public static final int HEIGHT_DP = 100; + + private static final int OP_NONE = 0; + private static final int OP_SELECT = 1; + private static final int OP_DELETE = 2; + private static final int OP_DELETE_SPACE = 3; + private static final int OP_INSERT = 4; + private Window mInkWindow; private InkView mInk; static final String TAG = "HandwritingIme"; + private int mRichGestureMode = OP_NONE; + private Spinner mRichGestureModeSpinner; + private PointF mRichGestureStartPoint; + interface HandwritingFinisher { void finish(); @@ -66,8 +83,32 @@ public class HandwritingIme extends InputMethodService { private void onStylusEvent(@Nullable MotionEvent event) { // TODO Hookup recognizer here - if (event.getAction() == MotionEvent.ACTION_UP) { - sendKeyChar((char) (56 + new Random().nextInt(66))); + switch (event.getAction()) { + case MotionEvent.ACTION_UP: { + if (areRichGesturesEnabled()) { + Bundle bundle = new Bundle(); + bundle.putInt("operation", mRichGestureMode); + bundle.putFloat("left", mRichGestureStartPoint.x); + bundle.putFloat("top", mRichGestureStartPoint.y); + bundle.putFloat("right", event.getX()); + bundle.putFloat("bottom", event.getY()); + performPrivateCommand("android.widget.RichGesture", bundle); + + Log.d(TAG, "Sending RichGesture " + mRichGestureMode + " (Screen) Left: " + + mRichGestureStartPoint.x + ", Top: " + mRichGestureStartPoint.y + + ", Right: " + event.getX() + ", Bottom: " + event.getY()); + } else { + // insert random ASCII char + sendKeyChar((char) (56 + new Random().nextInt(66))); + } + return; + } + case MotionEvent.ACTION_DOWN: { + if (areRichGesturesEnabled()) { + mRichGestureStartPoint = new PointF(event.getX(), event.getY()); + } + return; + } } } @@ -81,19 +122,44 @@ public class HandwritingIme extends InputMethodService { view.setPadding(0, 0, 0, 0); view.addView(inner, new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, height)); - TextView text = new TextView(this); - text.setText("Handwriting IME"); - text.setTextSize(13f); - text.setTextColor(getColor(android.R.color.white)); - text.setGravity(Gravity.CENTER); - text.setLayoutParams(new FrameLayout.LayoutParams( - FrameLayout.LayoutParams.MATCH_PARENT, height)); - view.addView(text); - inner.setBackgroundColor(0xff0110fe); // blue + + view.addView(getRichGestureActionsSpinner()); + inner.setBackgroundColor(getColor(R.color.abc_tint_spinner)); return view; } + private View getRichGestureActionsSpinner() { + if (mRichGestureModeSpinner != null) { + return mRichGestureModeSpinner; + } + //get the spinner from the xml. + mRichGestureModeSpinner = new Spinner(this); + mRichGestureModeSpinner.setPadding(100, 0, 100, 0); + mRichGestureModeSpinner.setTooltipText("Handwriting IME mode"); + String[] items = + new String[] { "Handwriting IME - Rich gesture disabled", "Rich gesture SELECT", + "Rich gesture DELETE", "Rich gesture DELETE SPACE", + "Rich gesture INSERT" }; + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_dropdown_item, items); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mRichGestureModeSpinner.setAdapter(adapter); + mRichGestureModeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + mRichGestureMode = position; + Log.d(TAG, "Setting RichGesture Mode " + mRichGestureMode); + } + + @Override + public void onNothingSelected(AdapterView parent) { + mRichGestureMode = OP_NONE; + } + }); + return mRichGestureModeSpinner; + } + public void onPrepareStylusHandwriting() { Log.d(TAG, "onPrepareStylusHandwriting "); if (mInk == null) { @@ -118,4 +184,22 @@ public class HandwritingIme extends InputMethodService { ((ViewGroup) mInk.getParent()).removeView(mInk); mInk = null; } + + @Override + public boolean onEvaluateFullscreenMode() { + return false; + } + + boolean performPrivateCommand(String action, Bundle bundle) { + if (!getCurrentInputStarted()) { + Log.e(TAG, "Input hasnt started, can't performPrivateCommand"); + return false; + } + + return getCurrentInputConnection().performPrivateCommand(action, bundle); + } + + private boolean areRichGesturesEnabled() { + return mRichGestureMode != OP_NONE; + } } diff --git a/tests/HandwritingIme/src/com/google/android/test/handwritingime/InkView.java b/tests/HandwritingIme/src/com/google/android/test/handwritingime/InkView.java index 87a5b900cc181..c9e429b6f4c89 100644 --- a/tests/HandwritingIme/src/com/google/android/test/handwritingime/InkView.java +++ b/tests/HandwritingIme/src/com/google/android/test/handwritingime/InkView.java @@ -30,7 +30,7 @@ import android.view.WindowManager; import android.view.WindowMetrics; class InkView extends View { - private static final long FINISH_TIMEOUT = 2500; + private static final long FINISH_TIMEOUT = 600; private final HandwritingIme.HandwritingFinisher mHwCanceller; private final HandwritingIme.StylusConsumer mConsumer; private final int mTopInset;