Merge "Fix Floating tool bar covers text during long press + drag" into mnc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
eb66533716
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user