Merge "Fix Floating tool bar covers text during long press + drag" into mnc-dev

This commit is contained in:
Clara Bayarri
2015-06-03 22:33:58 +00:00
committed by Android (Google) Code Review

View File

@@ -1004,14 +1004,14 @@ public class Editor {
stopSelectionActionMode(); stopSelectionActionMode();
} else { } else {
stopSelectionActionMode(); stopSelectionActionMode();
startSelectionActionModeWithSelectionAndStartDrag(); selectCurrentWordAndStartDrag();
} }
handled = true; handled = true;
} }
// Start a new selection // Start a new selection
if (!handled) { if (!handled) {
handled = startSelectionActionModeWithSelectionAndStartDrag(); handled = selectCurrentWordAndStartDrag();
} }
return handled; return handled;
@@ -1723,23 +1723,10 @@ public class Editor {
return mSelectionActionMode != null; return mSelectionActionMode != null;
} }
/**
* Starts a Selection Action Mode with the current selection and enters drag mode. This should
* be used whenever the mode is started from a touch event.
*
* @return true if the selection mode was actually started.
*/
private boolean startSelectionActionModeWithSelectionAndStartDrag() {
boolean selectionStarted = startSelectionActionModeWithSelectionInternal();
if (selectionStarted) {
getSelectionController().enterDrag();
}
return selectionStarted;
}
/** /**
* Starts a Selection Action Mode with the current selection and ensures the selection handles * Starts a Selection Action Mode with the current selection and ensures the selection handles
* are shown. This should be used when the mode is started from a non-touch event. * are shown if there is a selection, otherwise the insertion handle is shown. This should be
* used when the mode is started from a non-touch event.
* *
* @return true if the selection mode was actually started. * @return true if the selection mode was actually started.
*/ */
@@ -1747,40 +1734,67 @@ public class Editor {
boolean selectionStarted = startSelectionActionModeWithSelectionInternal(); boolean selectionStarted = startSelectionActionModeWithSelectionInternal();
if (selectionStarted) { if (selectionStarted) {
getSelectionController().show(); getSelectionController().show();
} else if (getInsertionController() != null) {
getInsertionController().show();
} }
return selectionStarted; return selectionStarted;
} }
private boolean startSelectionActionModeWithSelectionInternal() { /**
* If the TextView allows text selection, selects the current word when no existing selection
* was available and starts a drag.
*
* @return true if the drag was started.
*/
private boolean selectCurrentWordAndStartDrag() {
if (extractedTextModeWillBeStarted()) { if (extractedTextModeWillBeStarted()) {
// Cancel the single tap delayed runnable. // Cancel the single tap delayed runnable.
if (mSelectionModeWithoutSelectionRunnable != null) { if (mSelectionModeWithoutSelectionRunnable != null) {
mTextView.removeCallbacks(mSelectionModeWithoutSelectionRunnable); mTextView.removeCallbacks(mSelectionModeWithoutSelectionRunnable);
} }
return false;
}
if (mSelectionActionMode != null) {
mSelectionActionMode.finish();
}
if (!checkFieldAndSelectCurrentWord()) {
return false;
}
getSelectionController().enterDrag();
return true;
}
/**
* Checks whether a selection can be performed on the current TextView and if so selects
* the current word.
*
* @return true if there already was a selection or if the current word was selected.
*/
private boolean checkFieldAndSelectCurrentWord() {
if (!mTextView.canSelectText() || !mTextView.requestFocus()) {
Log.w(TextView.LOG_TAG,
"TextView does not support text selection. Selection cancelled.");
return false; return false;
} }
if (!mTextView.hasSelection()) {
// There may already be a selection on device rotation
return selectCurrentWord();
}
return true;
}
private boolean startSelectionActionModeWithSelectionInternal() {
if (mSelectionActionMode != null) { if (mSelectionActionMode != null) {
// Selection action mode is already started // Selection action mode is already started
mSelectionActionMode.invalidate(); mSelectionActionMode.invalidate();
return false; return false;
} }
if (!mTextView.canSelectText() || !mTextView.requestFocus()) { if (!checkFieldAndSelectCurrentWord()) {
Log.w(TextView.LOG_TAG,
"TextView does not support text selection. Action mode cancelled.");
return false; return false;
} }
if (!mTextView.hasSelection()) {
// There may already be a selection on device rotation
if (!selectCurrentWord()) {
// No word found under cursor or text selection not permitted.
return false;
}
}
boolean willExtract = extractedTextModeWillBeStarted(); boolean willExtract = extractedTextModeWillBeStarted();
// Do not start the action mode when extracted text will show up full screen, which would // Do not start the action mode when extracted text will show up full screen, which would
@@ -4387,7 +4401,7 @@ public class Editor {
boolean stayedInArea = distanceSquared < doubleTapSlop * doubleTapSlop; boolean stayedInArea = distanceSquared < doubleTapSlop * doubleTapSlop;
if (stayedInArea && isPositionOnText(eventX, eventY)) { if (stayedInArea && isPositionOnText(eventX, eventY)) {
startSelectionActionModeWithSelectionAndStartDrag(); selectCurrentWordAndStartDrag();
mDiscardNextActionUp = true; mDiscardNextActionUp = true;
} }
} }
@@ -4490,6 +4504,7 @@ public class Editor {
mEndHandle.showAtLocation(endOffset); mEndHandle.showAtLocation(endOffset);
// No longer the first dragging motion, reset. // No longer the first dragging motion, reset.
startSelectionActionModeWithSelection();
mDragAcceleratorActive = false; mDragAcceleratorActive = false;
mStartOffset = -1; mStartOffset = -1;
} }