summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorLeon Scroggins <scroggo@google.com>2009-08-12 18:48:10 -0400
committerLeon Scroggins <scroggo@google.com>2009-08-13 14:21:24 -0400
commit6679f2f70813eb93bf88297dc2de5e56bc7d7ca0 (patch)
treec360a87363680a06eb68aa15aa6b17d59d2ee1b2 /core
parentda83f4674a564007baac03db062a289c8158d940 (diff)
downloadframeworks_base-6679f2f70813eb93bf88297dc2de5e56bc7d7ca0.zip
frameworks_base-6679f2f70813eb93bf88297dc2de5e56bc7d7ca0.tar.gz
frameworks_base-6679f2f70813eb93bf88297dc2de5e56bc7d7ca0.tar.bz2
Pass clicks to webkit's textfield to determine the new selection.
Requires a corresponding change to external/webkit. We were previously letting WebTextView handle clicks, determine the change in selection, and pass that down to webkit. This sometimes resulted in a different placement of the caret if the WebTextView and the webkit-rendered textfield did not line up exactly. Now, we pass the click directly to webkit, which determines the new selection and passes that info back to the WebTextView. This also has the benefit of letting the WebTextView reflect changes in the selection that originated from webkit. Also remove some unused parameters.
Diffstat (limited to 'core')
-rw-r--r--core/java/android/webkit/WebTextView.java25
-rw-r--r--core/java/android/webkit/WebView.java49
-rw-r--r--core/java/android/webkit/WebViewCore.java39
3 files changed, 83 insertions, 30 deletions
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index f22adb7..a1f2223 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -85,6 +85,10 @@ import java.util.ArrayList;
// happens, the next time the user hits a key it is okay for the focus
// pointer to not match the WebTextView's node pointer
private boolean mOkayForFocusNotToMatch;
+ // Whether or not a selection change was generated from webkit. If it was,
+ // we do not need to pass the selection back to webkit.
+ private boolean mFromWebKit;
+ private boolean mGotTouchDown;
// Array to store the final character added in onTextChanged, so that its
// KeyEvents may be determined.
private char[] mCharacter = new char[1];
@@ -342,7 +346,7 @@ import java.util.ArrayList;
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
- if (mWebView != null) {
+ if (!mFromWebKit && mWebView != null) {
if (DebugFlags.WEB_TEXT_VIEW) {
Log.v(LOGTAG, "onSelectionChanged selStart=" + selStart
+ " selEnd=" + selEnd);
@@ -423,6 +427,7 @@ import java.util.ArrayList;
mDragStartTime = event.getEventTime();
mDragSent = false;
mScrolled = false;
+ mGotTouchDown = true;
break;
case MotionEvent.ACTION_MOVE:
Spannable buffer = getText();
@@ -456,14 +461,17 @@ import java.util.ArrayList;
case MotionEvent.ACTION_CANCEL:
if (!mScrolled) {
// If the page scrolled, or the TextView scrolled, we do not
- // want to change the selection, and the long press has already
- // been canceled, so there is no need to call into super.
- super.onTouchEvent(event);
+ // want to change the selection
+ cancelLongPress();
+ if (mGotTouchDown && mWebView != null) {
+ mWebView.touchUpOnTextField(event);
+ }
}
// Necessary for the WebView to reset its state
if (mWebView != null && mDragSent) {
mWebView.onTouchEvent(event);
}
+ mGotTouchDown = false;
break;
default:
break;
@@ -686,6 +694,15 @@ import java.util.ArrayList;
}
/**
+ * Set the selection, and disable our onSelectionChanged action.
+ */
+ /* package */ void setSelectionFromWebKit(int start, int end) {
+ mFromWebKit = true;
+ Selection.setSelection((Spannable) getText(), start, end);
+ mFromWebKit = false;
+ }
+
+ /**
* Set whether this is a single-line textfield or a multi-line textarea.
* Textfields scroll horizontally, and do not handle the enter key.
* Textareas behave oppositely.
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 41ef31c..28e9b6d 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -466,7 +466,7 @@ public class WebView extends AbsoluteLayout
static final int UPDATE_TEXTFIELD_TEXT_MSG_ID = 17;
static final int MOVE_OUT_OF_PLUGIN = 19;
static final int CLEAR_TEXT_ENTRY = 20;
-
+ static final int UPDATE_TEXT_SELECTION_MSG_ID = 21;
static final int UPDATE_CLIPBOARD = 22;
static final int LONG_PRESS_CENTER = 23;
static final int PREVENT_TOUCH_ID = 24;
@@ -496,7 +496,7 @@ public class WebView extends AbsoluteLayout
"18", // = 18;
"MOVE_OUT_OF_PLUGIN", // = 19;
"CLEAR_TEXT_ENTRY", // = 20;
- "21", // = 21;
+ "UPDATE_TEXT_SELECTION_MSG_ID", // = 21;
"UPDATE_CLIPBOARD", // = 22;
"LONG_PRESS_CENTER", // = 23;
"PREVENT_TOUCH_ID", // = 24;
@@ -3065,12 +3065,10 @@ public class WebView extends AbsoluteLayout
*/
/* package */ void deleteSelection(int start, int end) {
mTextGeneration++;
- WebViewCore.DeleteSelectionData data
- = new WebViewCore.DeleteSelectionData();
- data.mStart = start;
- data.mEnd = end;
- data.mTextGeneration = mTextGeneration;
- mWebViewCore.sendMessage(EventHub.DELETE_SELECTION, data);
+ WebViewCore.TextSelectionData data
+ = new WebViewCore.TextSelectionData(start, end);
+ mWebViewCore.sendMessage(EventHub.DELETE_SELECTION, mTextGeneration, 0,
+ data);
}
/**
@@ -4632,12 +4630,26 @@ public class WebView extends AbsoluteLayout
return result;
}
+ /**
+ * Do a touch up from a WebTextView. This will be handled by webkit to
+ * change the selection.
+ * @param event MotionEvent in the WebTextView's coordinates.
+ */
+ /*package*/ void touchUpOnTextField(MotionEvent event) {
+ if (!inEditingMode()) {
+ return;
+ }
+ int x = viewToContent((int) event.getX() + mWebTextView.getLeft());
+ int y = viewToContent((int) event.getY() + mWebTextView.getTop());
+ nativeTextInputMotionUp(x, y);
+ }
+
/*package*/ void shortPressOnTextField() {
if (inEditingMode()) {
View v = mWebTextView;
int x = viewToContent((v.getLeft() + v.getRight()) >> 1);
int y = viewToContent((v.getTop() + v.getBottom()) >> 1);
- nativeMotionUp(x, y, mNavSlop);
+ nativeTextInputMotionUp(x, y);
}
}
@@ -5085,6 +5097,16 @@ public class WebView extends AbsoluteLayout
}
}
break;
+ case UPDATE_TEXT_SELECTION_MSG_ID:
+ if (inEditingMode()
+ && mWebTextView.isSameTextField(msg.arg1)
+ && msg.arg2 == mTextGeneration) {
+ WebViewCore.TextSelectionData tData
+ = (WebViewCore.TextSelectionData) msg.obj;
+ mWebTextView.setSelectionFromWebKit(tData.mStart,
+ tData.mEnd);
+ }
+ break;
case MOVE_OUT_OF_PLUGIN:
if (nativePluginEatsNavKey()) {
navHandledKey(msg.arg1, 1, false, 0, true);
@@ -5449,10 +5471,9 @@ public class WebView extends AbsoluteLayout
// called by JNI
private void sendMotionUp(int touchGeneration,
- int frame, int node, int x, int y, int size) {
+ int frame, int node, int x, int y) {
WebViewCore.TouchUpData touchUpData = new WebViewCore.TouchUpData();
touchUpData.mMoveGeneration = touchGeneration;
- touchUpData.mSize = size;
touchUpData.mFrame = frame;
touchUpData.mNode = node;
touchUpData.mX = x;
@@ -5651,6 +5672,12 @@ public class WebView extends AbsoluteLayout
private native void nativeSetHeightCanMeasure(boolean measure);
// Returns a value corresponding to CachedFrame::ImeAction
/* package */ native int nativeTextFieldAction();
+ /**
+ * Perform a click on a currently focused text input. Since it is already
+ * focused, there is no need to go through the nativeMotionUp code, which
+ * may change the Cursor.
+ */
+ private native void nativeTextInputMotionUp(int x, int y);
private native int nativeTextGeneration();
// Never call this version except by updateCachedTextfield(String) -
// we always want to pass in our generation number.
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 05464b5..0720beb 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -440,8 +440,7 @@ final class WebViewCore {
private native String nativeRetrieveHref(int framePtr, int nodePtr);
private native void nativeTouchUp(int touchGeneration,
- int framePtr, int nodePtr, int x, int y,
- int size);
+ int framePtr, int nodePtr, int x, int y);
private native boolean nativeHandleTouchEvent(int action, int x, int y);
@@ -611,12 +610,6 @@ final class WebViewCore {
byte[] mPostData;
}
- static class DeleteSelectionData {
- int mStart;
- int mEnd;
- int mTextGeneration;
- }
-
static class ReplaceTextData {
String mReplace;
int mNewStart;
@@ -624,13 +617,21 @@ final class WebViewCore {
int mTextGeneration;
}
+ static class TextSelectionData {
+ public TextSelectionData(int start, int end) {
+ mStart = start;
+ mEnd = end;
+ }
+ int mStart;
+ int mEnd;
+ }
+
static class TouchUpData {
int mMoveGeneration;
int mFrame;
int mNode;
int mX;
int mY;
- int mSize;
}
static class TouchEventData {
@@ -1045,8 +1046,7 @@ final class WebViewCore {
TouchUpData touchUpData = (TouchUpData) msg.obj;
nativeTouchUp(touchUpData.mMoveGeneration,
touchUpData.mFrame, touchUpData.mNode,
- touchUpData.mX, touchUpData.mY,
- touchUpData.mSize);
+ touchUpData.mX, touchUpData.mY);
break;
case TOUCH_EVENT: {
@@ -1116,11 +1116,10 @@ final class WebViewCore {
break;
case DELETE_SELECTION:
- DeleteSelectionData deleteSelectionData
- = (DeleteSelectionData) msg.obj;
+ TextSelectionData deleteSelectionData
+ = (TextSelectionData) msg.obj;
nativeDeleteSelection(deleteSelectionData.mStart,
- deleteSelectionData.mEnd,
- deleteSelectionData.mTextGeneration);
+ deleteSelectionData.mEnd, msg.arg1);
break;
case SET_SELECTION:
@@ -1946,6 +1945,16 @@ final class WebViewCore {
}
// called by JNI
+ private void updateTextSelection(int pointer, int start, int end,
+ int textGeneration) {
+ if (mWebView != null) {
+ Message.obtain(mWebView.mPrivateHandler,
+ WebView.UPDATE_TEXT_SELECTION_MSG_ID, pointer, textGeneration,
+ new TextSelectionData(start, end)).sendToTarget();
+ }
+ }
+
+ // called by JNI
private void clearTextEntry() {
if (mWebView == null) return;
Message.obtain(mWebView.mPrivateHandler,