Chromium Code Reviews| Index: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
| diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
| index 74a0dfa5c03ae60a22a7fe6ded23520da90f3414..296c39ee18d2716f73ea4f06449bfdf2c3b8f54f 100644 |
| --- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
| +++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
| @@ -7,6 +7,7 @@ package org.chromium.content.browser; |
| import android.annotation.SuppressLint; |
| import android.app.Activity; |
| import android.app.SearchManager; |
| +import android.content.ClipboardManager; |
| import android.content.ContentResolver; |
| import android.content.Context; |
| import android.content.Intent; |
| @@ -61,16 +62,18 @@ import org.chromium.content.browser.accessibility.AccessibilityInjector; |
| import org.chromium.content.browser.accessibility.BrowserAccessibilityManager; |
| import org.chromium.content.browser.input.AdapterInputConnection; |
| import org.chromium.content.browser.input.GamepadList; |
| -import org.chromium.content.browser.input.HandleView; |
| import org.chromium.content.browser.input.ImeAdapter; |
| import org.chromium.content.browser.input.ImeAdapter.AdapterInputConnectionFactory; |
| import org.chromium.content.browser.input.InputMethodManagerWrapper; |
| -import org.chromium.content.browser.input.InsertionHandleController; |
| +import org.chromium.content.browser.input.PastePopupMenu; |
| +import org.chromium.content.browser.input.PastePopupMenu.PastePopupMenuDelegate; |
| +import org.chromium.content.browser.input.PopupTouchHandleDrawable; |
| +import org.chromium.content.browser.input.PopupTouchHandleDrawable.PopupTouchHandleDrawableDelegate; |
| import org.chromium.content.browser.input.SelectPopup; |
| import org.chromium.content.browser.input.SelectPopupDialog; |
| import org.chromium.content.browser.input.SelectPopupDropdown; |
| import org.chromium.content.browser.input.SelectPopupItem; |
| -import org.chromium.content.browser.input.SelectionHandleController; |
| +import org.chromium.content.browser.input.SelectionEventType; |
| import org.chromium.content.common.ContentSwitches; |
| import org.chromium.content_public.browser.GestureStateListener; |
| import org.chromium.content_public.browser.WebContents; |
| @@ -107,9 +110,6 @@ public class ContentViewCore |
| private static final int IS_LONG_PRESS = 1; |
| private static final int IS_LONG_TAP = 2; |
| - // Length of the delay (in ms) before fading in handles after the last page movement. |
| - private static final int TEXT_HANDLE_FADE_IN_DELAY = 300; |
| - |
| // If the embedder adds a JavaScript interface object that contains an indirect reference to |
| // the ContentViewCore, then storing a strong ref to the interface object on the native |
| // side would prevent garbage collection of the ContentViewCore (as that strong ref would |
| @@ -259,13 +259,14 @@ public class ContentViewCore |
| private AdapterInputConnection mInputConnection; |
| private InputMethodManagerWrapper mInputMethodManagerWrapper; |
| - private SelectionHandleController mSelectionHandleController; |
| - private InsertionHandleController mInsertionHandleController; |
| + // Lazily created paste popup menu, triggered either via long press in an |
| + // editable region or from tapping the insertion handle. |
| + private PastePopupMenu mPastePopupMenu; |
| + private boolean mAllowAutomaticPastePopupShowing; |
| - private Runnable mDeferredHandleFadeInRunnable; |
| + private PopupTouchHandleDrawableDelegate mTouchHandleDelegate; |
| private PositionObserver mPositionObserver; |
| - private PositionObserver.Listener mPositionListener; |
| // Size of the viewport in physical pixels as set from onSizeChanged. |
| private int mViewportWidthPix; |
| @@ -279,13 +280,10 @@ public class ContentViewCore |
| // Cached copy of all positions and scales as reported by the renderer. |
| private final RenderCoordinates mRenderCoordinates; |
| - private final RenderCoordinates.NormalizedPoint mStartHandlePoint; |
| - private final RenderCoordinates.NormalizedPoint mEndHandlePoint; |
| - private final RenderCoordinates.NormalizedPoint mInsertionHandlePoint; |
| - |
| // Tracks whether a selection is currently active. When applied to selected text, indicates |
| // whether the last selected text is still highlighted. |
| private boolean mHasSelection; |
| + private boolean mHasInsertion; |
| private String mLastSelectedText; |
| private boolean mSelectionEditable; |
| private ActionMode mActionMode; |
| @@ -379,9 +377,6 @@ public class ContentViewCore |
| deviceScaleFactor = Float.valueOf(forceScaleFactor); |
| } |
| mRenderCoordinates.setDeviceScaleFactor(deviceScaleFactor); |
| - mStartHandlePoint = mRenderCoordinates.createNormalizedPoint(); |
| - mEndHandlePoint = mRenderCoordinates.createNormalizedPoint(); |
| - mInsertionHandlePoint = mRenderCoordinates.createNormalizedPoint(); |
| mAccessibilityManager = (AccessibilityManager) |
| getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); |
| mGestureStateListeners = new ObserverList<GestureStateListener>(); |
| @@ -539,7 +534,7 @@ public class ContentViewCore |
| public void onImeEvent(boolean isFinish) { |
| getContentViewClient().onImeEvent(); |
| if (!isFinish) { |
| - hideHandles(); |
| + hideTextHandles(); |
| } |
| } |
| @@ -602,15 +597,6 @@ public class ContentViewCore |
| long nativeWebContents, WindowAndroid windowAndroid) { |
| setContainerView(containerView); |
| - mPositionListener = new PositionObserver.Listener() { |
| - @Override |
| - public void onPositionChanged(int x, int y) { |
| - if (isSelectionHandleShowing() || isInsertionHandleShowing()) { |
| - temporarilyHideTextHandles(); |
| - } |
| - } |
| - }; |
| - |
| long windowNativePointer = windowAndroid != null ? windowAndroid.getNativePointer() : 0; |
| long viewAndroidNativePointer = 0; |
| @@ -682,9 +668,7 @@ public class ContentViewCore |
| public void setContainerView(ViewGroup containerView) { |
| TraceEvent.begin(); |
| if (mContainerView != null) { |
| - mPositionObserver.removeListener(mPositionListener); |
| - mSelectionHandleController = null; |
| - mInsertionHandleController = null; |
| + mPastePopupMenu = null; |
| mInputConnection = null; |
| } |
| @@ -1125,18 +1109,7 @@ public class ContentViewCore |
| cancelRequestToScrollFocusedEditableNodeIntoView(); |
| final int eventAction = event.getActionMasked(); |
| - |
| - // Only these actions have any effect on gesture detection. Other |
| - // actions have no corresponding WebTouchEvent type and may confuse the |
| - // touch pipline, so we ignore them entirely. |
| - if (eventAction != MotionEvent.ACTION_DOWN |
| - && eventAction != MotionEvent.ACTION_UP |
| - && eventAction != MotionEvent.ACTION_CANCEL |
| - && eventAction != MotionEvent.ACTION_MOVE |
| - && eventAction != MotionEvent.ACTION_POINTER_DOWN |
| - && eventAction != MotionEvent.ACTION_POINTER_UP) { |
| - return false; |
| - } |
| + if (!isValidTouchEventActionForNative(eventAction)) return false; |
| if (mNativeContentViewCore == 0) return false; |
| @@ -1168,6 +1141,18 @@ public class ContentViewCore |
| } |
| } |
| + private static boolean isValidTouchEventActionForNative(int eventAction) { |
| + // Only these actions have any effect on gesture detection. Other |
| + // actions have no corresponding WebTouchEvent type and may confuse the |
| + // touch pipline, so we ignore them entirely. |
| + return eventAction == MotionEvent.ACTION_DOWN |
| + || eventAction == MotionEvent.ACTION_UP |
| + || eventAction == MotionEvent.ACTION_CANCEL |
| + || eventAction == MotionEvent.ACTION_MOVE |
| + || eventAction == MotionEvent.ACTION_POINTER_DOWN |
| + || eventAction == MotionEvent.ACTION_POINTER_UP; |
| + } |
| + |
| public void setIgnoreRemainingTouchEvents() { |
| resetGestureDetection(); |
| } |
| @@ -1181,7 +1166,6 @@ public class ContentViewCore |
| private void onFlingStartEventConsumed(int vx, int vy) { |
| mTouchScrollInProgress = false; |
| mPotentiallyActiveFlingCount++; |
| - temporarilyHideTextHandles(); |
| for (mGestureStateListenersIterator.rewind(); |
| mGestureStateListenersIterator.hasNext();) { |
| mGestureStateListenersIterator.next().onFlingStartGesture( |
| @@ -1208,8 +1192,8 @@ public class ContentViewCore |
| @SuppressWarnings("unused") |
| @CalledByNative |
| private void onScrollBeginEventAck() { |
| + hidePastePopup(); |
| mTouchScrollInProgress = true; |
| - temporarilyHideTextHandles(); |
| mZoomControlsDelegate.invokeZoomPicker(); |
| updateGestureStateListener(GestureEventType.SCROLL_START); |
| } |
| @@ -1235,7 +1219,6 @@ public class ContentViewCore |
| @SuppressWarnings("unused") |
| @CalledByNative |
| private void onPinchBeginEventAck() { |
| - temporarilyHideTextHandles(); |
| updateGestureStateListener(GestureEventType.PINCH_BEGIN); |
| } |
| @@ -1254,12 +1237,6 @@ public class ContentViewCore |
| } |
| } |
| - @SuppressWarnings("unused") |
| - @CalledByNative |
| - private void onDoubleTapEventAck() { |
| - temporarilyHideTextHandles(); |
| - } |
| - |
| /** |
| * Called just prior to a tap or press gesture being forwarded to the renderer. |
| */ |
| @@ -1425,9 +1402,11 @@ public class ContentViewCore |
| } |
| private void hidePopups() { |
| - hideSelectPopup(); |
| - hideHandles(); |
| + mUnselectAllOnActionModeDismiss = true; |
| hideSelectActionBar(); |
| + hidePastePopup(); |
| + hideSelectPopup(); |
| + hideTextHandles(); |
| } |
| public void hideSelectActionBar() { |
| @@ -1882,13 +1861,7 @@ public class ContentViewCore |
| mLastTapX = (int) xPix; |
| mLastTapY = (int) yPix; |
| - if (type == GestureEventType.LONG_PRESS |
| - || type == GestureEventType.LONG_TAP) { |
| - getInsertionHandleController().allowAutomaticShowing(); |
| - getSelectionHandleController().allowAutomaticShowing(); |
| - } else { |
| - if (mSelectionEditable) getInsertionHandleController().allowAutomaticShowing(); |
| - } |
| + if (type == GestureEventType.LONG_PRESS) mAllowAutomaticPastePopupShowing = true; |
| } |
| /** |
| @@ -1951,101 +1924,6 @@ public class ContentViewCore |
| return mDownloadDelegate; |
| } |
| - private SelectionHandleController getSelectionHandleController() { |
| - if (mSelectionHandleController == null) { |
| - mSelectionHandleController = new SelectionHandleController( |
| - getContainerView(), mPositionObserver) { |
| - @Override |
| - public void selectBetweenCoordinates(int x1, int y1, int x2, int y2) { |
| - if (mNativeContentViewCore != 0 && !(x1 == x2 && y1 == y2)) { |
| - nativeSelectBetweenCoordinates(mNativeContentViewCore, |
| - x1, y1 - mRenderCoordinates.getContentOffsetYPix(), |
| - x2, y2 - mRenderCoordinates.getContentOffsetYPix()); |
| - } |
| - } |
| - |
| - @Override |
| - public void showHandles(int startDir, int endDir) { |
| - final boolean wasShowing = isShowing(); |
| - super.showHandles(startDir, endDir); |
| - if (!wasShowing || mActionMode == null) showSelectActionBar(); |
| - } |
| - |
| - }; |
| - |
| - mSelectionHandleController.hideAndDisallowAutomaticShowing(); |
| - } |
| - |
| - return mSelectionHandleController; |
| - } |
| - |
| - private InsertionHandleController getInsertionHandleController() { |
| - if (mInsertionHandleController == null) { |
| - mInsertionHandleController = new InsertionHandleController( |
| - getContainerView(), mPositionObserver) { |
| - private static final int AVERAGE_LINE_HEIGHT = 14; |
| - |
| - @Override |
| - public void setCursorPosition(int x, int y) { |
| - if (mNativeContentViewCore != 0) { |
| - nativeMoveCaret(mNativeContentViewCore, |
| - x, y - mRenderCoordinates.getContentOffsetYPix()); |
| - } |
| - } |
| - |
| - @Override |
| - public void paste() { |
| - mImeAdapter.paste(); |
| - hideHandles(); |
| - } |
| - |
| - @Override |
| - public int getLineHeight() { |
| - return (int) Math.ceil( |
| - mRenderCoordinates.fromLocalCssToPix(AVERAGE_LINE_HEIGHT)); |
| - } |
| - }; |
| - |
| - mInsertionHandleController.hideAndDisallowAutomaticShowing(); |
| - } |
| - |
| - return mInsertionHandleController; |
| - } |
| - |
| - @VisibleForTesting |
| - public InsertionHandleController getInsertionHandleControllerForTest() { |
| - return mInsertionHandleController; |
| - } |
| - |
| - @VisibleForTesting |
| - public SelectionHandleController getSelectionHandleControllerForTest() { |
| - return mSelectionHandleController; |
| - } |
| - |
| - private void updateHandleScreenPositions() { |
| - if (isSelectionHandleShowing()) { |
| - mSelectionHandleController.setStartHandlePosition( |
| - mStartHandlePoint.getXPix(), mStartHandlePoint.getYPix()); |
| - mSelectionHandleController.setEndHandlePosition( |
| - mEndHandlePoint.getXPix(), mEndHandlePoint.getYPix()); |
| - } |
| - |
| - if (isInsertionHandleShowing()) { |
| - mInsertionHandleController.setHandlePosition( |
| - mInsertionHandlePoint.getXPix(), mInsertionHandlePoint.getYPix()); |
| - } |
| - } |
| - |
| - private void hideHandles() { |
| - if (mSelectionHandleController != null) { |
| - mSelectionHandleController.hideAndDisallowAutomaticShowing(); |
| - } |
| - if (mInsertionHandleController != null) { |
| - mInsertionHandleController.hideAndDisallowAutomaticShowing(); |
| - } |
| - mPositionObserver.removeListener(mPositionListener); |
| - } |
| - |
| private void showSelectActionBar() { |
| if (mActionMode != null) { |
| mActionMode.invalidate(); |
| @@ -2175,6 +2053,63 @@ public class ContentViewCore |
| } |
| } |
| + private void hidePastePopup() { |
| + mAllowAutomaticPastePopupShowing = false; |
| + if (mPastePopupMenu == null) return; |
| + mPastePopupMenu.hide(); |
| + } |
| + |
| + @CalledByNative |
| + private void onSelectionEvent(int eventType, float posXDip, float posYDip) { |
| + boolean shouldShowPastePopup = false; |
| + switch (eventType) { |
| + case SelectionEventType.SELECTION_SHOWN: |
| + mHasSelection = true; |
| + // TODO(cjhopman): Remove this when there is a better signal that long press caused |
| + // a selection. See http://crbug.com/150151. |
| + mContainerView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); |
| + showSelectActionBar(); |
| + break; |
| + |
| + case SelectionEventType.SELECTION_CLEARED: |
| + mHasSelection = false; |
| + mUnselectAllOnActionModeDismiss = false; |
| + hideSelectActionBar(); |
| + break; |
| + |
| + case SelectionEventType.INSERTION_SHOWN: |
| + mHasInsertion = true; |
| + shouldShowPastePopup = mAllowAutomaticPastePopupShowing; |
| + break; |
| + |
| + case SelectionEventType.INSERTION_MOVED: |
| + // TODO(jdduke): Handle case where movement triggered by focus. |
| + hidePastePopup(); |
| + break; |
| + |
| + case SelectionEventType.INSERTION_TAPPED: |
| + if (getPastePopup().isShowing()) |
| + mPastePopupMenu.hide(); |
| + else |
| + shouldShowPastePopup = true; |
| + break; |
| + |
| + case SelectionEventType.INSERTION_CLEARED: |
| + mHasInsertion = false; |
| + hidePastePopup(); |
| + break; |
| + |
| + default: |
| + assert false : "Invalid selection event type."; |
| + } |
| + if (shouldShowPastePopup) { |
| + final float contentOffsetYPix = mRenderCoordinates.getContentOffsetYPix(); |
| + getPastePopup().showAt( |
| + (int) mRenderCoordinates.fromDipToPix(posXDip), |
| + (int) (mRenderCoordinates.fromDipToPix(posYDip) + contentOffsetYPix)); |
| + } |
| + } |
| + |
| public boolean getUseDesktopUserAgent() { |
| if (mNativeContentViewCore != 0) { |
| return nativeGetUseDesktopUserAgent(mNativeContentViewCore); |
| @@ -2197,59 +2132,10 @@ public class ContentViewCore |
| if (mNativeContentViewCore != 0) nativeClearSslPreferences(mNativeContentViewCore); |
| } |
| - private boolean isSelectionHandleShowing() { |
| - return mSelectionHandleController != null && mSelectionHandleController.isShowing(); |
| - } |
| - |
| - private boolean isInsertionHandleShowing() { |
| - return mInsertionHandleController != null && mInsertionHandleController.isShowing(); |
| - } |
| - |
| - // Makes the insertion/selection handles invisible. They will fade back in shortly after the |
| - // last call to scheduleTextHandleFadeIn (or temporarilyHideTextHandles). |
| - private void temporarilyHideTextHandles() { |
| - if (isSelectionHandleShowing() && !mSelectionHandleController.isDragging()) { |
| - mSelectionHandleController.setHandleVisibility(HandleView.INVISIBLE); |
| - } |
| - if (isInsertionHandleShowing() && !mInsertionHandleController.isDragging()) { |
| - mInsertionHandleController.setHandleVisibility(HandleView.INVISIBLE); |
| - } |
| - scheduleTextHandleFadeIn(); |
| - } |
| - |
| - private boolean allowTextHandleFadeIn() { |
| - if (mTouchScrollInProgress) return false; |
| - |
| - if (mPopupZoomer.isShowing()) return false; |
| - |
| - return true; |
| - } |
| - |
| - // Cancels any pending fade in and schedules a new one. |
| - private void scheduleTextHandleFadeIn() { |
| - if (!isInsertionHandleShowing() && !isSelectionHandleShowing()) return; |
| - |
| - if (mDeferredHandleFadeInRunnable == null) { |
| - mDeferredHandleFadeInRunnable = new Runnable() { |
| - @Override |
| - public void run() { |
| - if (!allowTextHandleFadeIn()) { |
| - // Delay fade in until it is allowed. |
| - scheduleTextHandleFadeIn(); |
| - } else { |
| - if (isSelectionHandleShowing()) { |
| - mSelectionHandleController.beginHandleFadeIn(); |
| - } |
| - if (isInsertionHandleShowing()) { |
| - mInsertionHandleController.beginHandleFadeIn(); |
| - } |
| - } |
| - } |
| - }; |
| - } |
| - |
| - mContainerView.removeCallbacks(mDeferredHandleFadeInRunnable); |
| - mContainerView.postDelayed(mDeferredHandleFadeInRunnable, TEXT_HANDLE_FADE_IN_DELAY); |
| + private void hideTextHandles() { |
| + mHasSelection = false; |
| + mHasInsertion = false; |
| + if (mNativeContentViewCore != 0) nativeHideTextHandles(mNativeContentViewCore); |
| } |
| /** |
| @@ -2313,7 +2199,6 @@ public class ContentViewCore |
| final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged; |
| final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChanged; |
| - final boolean needTemporarilyHideHandles = scrollChanged; |
| if (needHidePopupZoomer) mPopupZoomer.hide(true); |
| @@ -2341,9 +2226,7 @@ public class ContentViewCore |
| } |
| } |
| - if (needTemporarilyHideHandles) temporarilyHideTextHandles(); |
| if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); |
| - if (contentOffsetChanged) updateHandleScreenPositions(); |
| // Update offsets for fullscreen. |
| final float controlsOffsetPix = controlsOffsetYCss * deviceScale; |
| @@ -2363,6 +2246,7 @@ public class ContentViewCore |
| boolean isNonImeChange) { |
| TraceEvent.begin(); |
| mSelectionEditable = (textInputType != ImeAdapter.getTextInputTypeNone()); |
| + if (!mSelectionEditable) hidePastePopup(); |
| mImeAdapter.updateKeyboardVisibility( |
| nativeImeAdapterAndroid, textInputType, showImeIfNeeded); |
| @@ -2432,7 +2316,6 @@ public class ContentViewCore |
| private void showDisambiguationPopup(Rect targetRect, Bitmap zoomedBitmap) { |
| mPopupZoomer.setBitmap(zoomedBitmap); |
| mPopupZoomer.show(targetRect); |
| - temporarilyHideTextHandles(); |
| } |
| @SuppressWarnings("unused") |
| @@ -2443,72 +2326,25 @@ public class ContentViewCore |
| @SuppressWarnings("unused") |
| @CalledByNative |
| - private void onSelectionChanged(String text) { |
| - mLastSelectedText = text; |
| - getContentViewClient().onSelectionChanged(text); |
| - } |
| - |
| - @SuppressWarnings("unused") |
| - @CalledByNative |
| - private void showSelectionHandlesAutomatically() { |
| - getSelectionHandleController().allowAutomaticShowing(); |
| + private PopupTouchHandleDrawable createPopupTouchHandleDrawable() { |
| + if (mTouchHandleDelegate == null) { |
| + mTouchHandleDelegate = new PopupTouchHandleDrawableDelegate() { |
| + public boolean onTouchHandleEvent(MotionEvent event) { |
| + if (mNativeContentViewCore == 0) return false; |
| + if (!isValidTouchEventActionForNative(event.getActionMasked())) return false; |
| + return nativeOnTouchHandleEvent(mNativeContentViewCore, event); |
| + } |
| + }; |
| + } |
| + return new PopupTouchHandleDrawable( |
| + mTouchHandleDelegate, getContainerView(), mPositionObserver); |
| } |
| @SuppressWarnings("unused") |
| @CalledByNative |
| - private void onSelectionBoundsChanged( |
| - float anchorXDip, float anchorYDip, float focusXDip, float focusYDip, |
| - int anchorDir, int focusDir, |
| - boolean isAnchorVisible, boolean isFocusVisible) { |
| - // TODO(jdduke): Use |is{Anchor,Focus}Visible|, as well as the action |
| - // bar height, to set handle visibility, see crbug.com/164819. |
| - if (focusXDip != anchorXDip || focusYDip != anchorYDip || |
| - (mSelectionHandleController != null && mSelectionHandleController.isDragging())) { |
| - if (mInsertionHandleController != null) { |
| - mInsertionHandleController.hide(); |
| - } |
| - mStartHandlePoint.setLocalDip(anchorXDip, anchorYDip); |
| - mEndHandlePoint.setLocalDip(focusXDip, focusYDip); |
| - |
| - boolean wereSelectionHandlesShowing = getSelectionHandleController().isShowing(); |
| - |
| - getSelectionHandleController().onSelectionChanged(anchorDir, focusDir); |
| - updateHandleScreenPositions(); |
| - mHasSelection = true; |
| - |
| - if (!wereSelectionHandlesShowing && getSelectionHandleController().isShowing()) { |
| - // TODO(cjhopman): Remove this when there is a better signal that long press caused |
| - // a selection. See http://crbug.com/150151. |
| - mContainerView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); |
| - } |
| - |
| - } else { |
| - mUnselectAllOnActionModeDismiss = false; |
| - hideSelectActionBar(); |
| - if (anchorXDip != 0 && anchorYDip != 0 && mSelectionEditable) { |
| - // Selection is a caret, and a text field is focused. |
| - if (mSelectionHandleController != null) { |
| - mSelectionHandleController.hide(); |
| - } |
| - mInsertionHandlePoint.setLocalDip(anchorXDip, anchorYDip); |
| - |
| - getInsertionHandleController().onCursorPositionChanged(); |
| - updateHandleScreenPositions(); |
| - if (mInputMethodManagerWrapper.isWatchingCursor(mContainerView)) { |
| - final int xPix = (int) mInsertionHandlePoint.getXPix(); |
| - final int yPix = (int) mInsertionHandlePoint.getYPix(); |
| - mInputMethodManagerWrapper.updateCursor( |
| - mContainerView, xPix, yPix, xPix, yPix); |
| - } |
| - } else { |
| - // Deselection |
| - hideHandles(); |
| - } |
| - mHasSelection = false; |
| - } |
| - if (isSelectionHandleShowing() || isInsertionHandleShowing()) { |
| - mPositionObserver.addListener(mPositionListener); |
| - } |
| + private void onSelectionChanged(String text) { |
| + mLastSelectedText = text; |
| + getContentViewClient().onSelectionChanged(text); |
| } |
| @SuppressWarnings("unused") |
| @@ -2521,10 +2357,36 @@ public class ContentViewCore |
| @SuppressWarnings("unused") |
| @CalledByNative |
| private void showPastePopup(int xDip, int yDip) { |
|
cjhopman
2014/07/09 22:29:12
Is this called by native? Should it show the paste
jdduke (slow)
2014/07/10 02:08:39
Yeah, I was debating what to do here. I'd like to
|
| - mInsertionHandlePoint.setLocalDip(xDip, yDip); |
| - getInsertionHandleController().showHandle(); |
| - updateHandleScreenPositions(); |
| - getInsertionHandleController().showHandleWithPastePopup(); |
| + /* |
| + if (mPastePopupMenu == null) { |
| + mPastePopupMenu = new PastePopupMenu(getContainerView(), |
| + new PastePopupMenuDelegate() { |
| + public void paste() { |
| + mImeAdapter.paste(); |
| + } |
| + }); |
| + } |
| + final float contentOffsetYPix = mRenderCoordinates.getContentOffsetYPix(); |
| + mPastePopupMenu.showAt((int) mRenderCoordinates.fromDipToPix(xDip), |
| + (int) (mRenderCoordinates.fromDipToPix(yDip) + contentOffsetYPix)); |
| + */ |
| + } |
| + |
| + private PastePopupMenu getPastePopup() { |
| + if (mPastePopupMenu == null) { |
| + mPastePopupMenu = new PastePopupMenu(getContainerView(), |
| + new PastePopupMenuDelegate() { |
| + public void paste() { |
| + mImeAdapter.paste(); |
| + } |
| + public boolean canPaste() { |
| + if (!mSelectionEditable) return false; |
| + return ((ClipboardManager) mContext.getSystemService( |
| + Context.CLIPBOARD_SERVICE)).hasPrimaryClip(); |
| + } |
| + }); |
| + } |
| + return mPastePopupMenu; |
| } |
| @SuppressWarnings("unused") |
| @@ -3205,6 +3067,9 @@ public class ContentViewCore |
| float rawX, float rawY, |
| int androidToolType0, int androidToolType1, int androidButtonState); |
| + private native boolean nativeOnTouchHandleEvent( |
| + long nativeContentViewCoreImpl, MotionEvent event); |
| + |
| private native int nativeSendMouseMoveEvent( |
| long nativeContentViewCoreImpl, long timeMs, float x, float y); |
| @@ -3248,6 +3113,8 @@ public class ContentViewCore |
| private native void nativeMoveCaret(long nativeContentViewCoreImpl, float x, float y); |
| + private native void nativeHideTextHandles(long nativeContentViewCoreImpl); |
| + |
| private native void nativeResetGestureDetection(long nativeContentViewCoreImpl); |
| private native void nativeSetDoubleTapSupportEnabled( |
| long nativeContentViewCoreImpl, boolean enabled); |