Index: content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java b/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java |
index 4b7f15f970e1099bb8ba5f00db47253472a00134..db2ef0f4ace013bacd2ddc5b62938f8f521489fc 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java |
@@ -118,10 +118,6 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
private boolean mUnselectAllOnDismiss; |
private String mLastSelectedText; |
- // Tracks whether a selection is currently active. When applied to selected text, indicates |
- // whether the last selected text is still highlighted. |
- private boolean mHasSelection; |
- |
// Lazily created paste popup menu, triggered either via long press in an |
// editable region or from tapping the insertion handle. |
private PastePopupMenu mPastePopupMenu; |
@@ -176,6 +172,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
mSelectionClient = |
SmartSelectionClient.create(new SmartSelectionCallback(), window, webContents); |
+ mLastSelectedText = ""; |
// TODO(timav): Use android.R.id.textAssist for the Assist item id once we switch to |
// Android O SDK and remove |mAssistMenuItemId|. |
if (BuildInfo.isAtLeastO()) { |
@@ -223,6 +220,31 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
mAllowedMenuItems = allowedMenuItems; |
} |
+ public void showSelectionMenu(int left, int top, int right, int bottom, boolean isEditable, |
+ boolean isPasswordType, String selectionText, boolean canSelectAll, |
+ boolean canRichlyEdit, boolean shouldSuggest) { |
+ mSelectionRect.set(left, top, right, bottom); |
+ mEditable = isEditable; |
+ mLastSelectedText = selectionText; |
+ mIsPasswordType = isPasswordType; |
+ mCanSelectAllForPastePopup = canSelectAll; |
+ mCanEditRichlyForPastePopup = canRichlyEdit; |
+ mUnselectAllOnDismiss = true; |
+ if (hasSelection()) { |
+ if (mSelectionClient != null |
+ && mSelectionClient.requestSelectionPopupUpdates(shouldSuggest)) { |
+ // Rely on |mSelectionClient| sending a classification request and the request |
+ // always calling onClassified() callback. |
+ mPendingShowActionMode = true; |
+ } else { |
+ showActionModeOrClearOnFailure(); |
+ } |
+ |
+ } else { |
+ createAndShowPastePopup(); |
+ } |
+ } |
+ |
/** |
* Show (activate) android action mode by starting it. |
* |
@@ -268,17 +290,13 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
return actionMode; |
} |
- void createAndShowPastePopup( |
- int left, int top, int right, int bottom, boolean canSelectAll, boolean canEditRichly) { |
+ private void createAndShowPastePopup() { |
if (mView.getParent() == null || mView.getVisibility() != View.VISIBLE) { |
return; |
} |
if (!supportsFloatingActionMode() && !canPaste()) return; |
destroyPastePopup(); |
- mSelectionRect.set(left, top, right, bottom); |
- mCanSelectAllForPastePopup = canSelectAll; |
- mCanEditRichlyForPastePopup = canEditRichly; |
PastePopupMenuDelegate delegate = new PastePopupMenuDelegate() { |
@Override |
public void paste() { |
@@ -494,7 +512,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
descriptor.removeItem(R.id.select_action_menu_paste); |
} |
- if (isInsertion()) { |
+ if (!hasSelection()) { |
descriptor.removeItem(R.id.select_action_menu_select_all); |
descriptor.removeItem(R.id.select_action_menu_cut); |
descriptor.removeItem(R.id.select_action_menu_copy); |
@@ -731,8 +749,6 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
void selectAll() { |
mWebContents.selectAll(); |
mClassificationResult = null; |
- if (needsActionMenuUpdate()) showActionModeOrClearOnFailure(); |
- |
// Even though the above statement logged a SelectAll user action, we want to |
// track whether the focus was in an editable field, so log that too. |
if (isSelectionEditable()) { |
@@ -934,17 +950,6 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
if (top == bottom) ++bottom; |
switch (eventType) { |
case SelectionEventType.SELECTION_HANDLES_SHOWN: |
- mSelectionRect.set(left, top, right, bottom); |
- mHasSelection = true; |
- mUnselectAllOnDismiss = true; |
- if (mSelectionClient != null |
- && mSelectionClient.requestSelectionPopupUpdates(true /* suggest */)) { |
- // Rely on |mSelectionClient| sending a classification request and the request |
- // always calling onClassified() callback. |
- mPendingShowActionMode = true; |
- } else { |
- showActionModeOrClearOnFailure(); |
- } |
break; |
case SelectionEventType.SELECTION_HANDLES_MOVED: |
@@ -957,7 +962,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
break; |
case SelectionEventType.SELECTION_HANDLES_CLEARED: |
- mHasSelection = false; |
+ mLastSelectedText = ""; |
mUnselectAllOnDismiss = false; |
mSelectionRect.setEmpty(); |
if (mSelectionClient != null) mSelectionClient.cancelAllRequests(); |
@@ -969,13 +974,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
break; |
case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED: |
- if (mSelectionClient != null |
- && mSelectionClient.requestSelectionPopupUpdates(false /* suggest */)) { |
- // Rely on |mSelectionClient| sending a classification request and the request |
- // always calling onClassified() callback. |
- } else { |
- hideActionMode(false); |
- } |
+ mWebContents.showContextMenuAtTouchHandle(left, bottom); |
break; |
case SelectionEventType.INSERTION_HANDLE_SHOWN: |
@@ -1097,12 +1096,12 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
*/ |
@VisibleForTesting |
public boolean hasSelection() { |
- return mHasSelection; |
+ return mLastSelectedText.length() != 0; |
} |
@Override |
public String getSelectedText() { |
- return hasSelection() ? mLastSelectedText : ""; |
+ return mLastSelectedText; |
} |
private boolean isShareAvailable() { |