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 b8bf0efad5cf23d3dfacf3f6fc60184db1c8d8ac..157f6851950cdf036966292c7cc84734e06a0a07 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. |
* |
@@ -233,7 +255,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
public void showActionModeOrClearOnFailure() { |
mPendingShowActionMode = false; |
- if (!isActionModeSupported() || !mHasSelection) return; |
+ if (!isActionModeSupported() || !hasSelection()) return; |
// Just refresh the view if action mode already exists. |
if (isActionModeValid()) { |
@@ -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() { |
@@ -493,7 +511,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); |
@@ -730,8 +748,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()) { |
@@ -908,7 +924,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
if (mWebContents == null || resultCode != Activity.RESULT_OK || data == null) return; |
// Do not handle the result if no text is selected or current selection is not editable. |
- if (!mHasSelection || !isSelectionEditable()) return; |
+ if (!hasSelection() || !isSelectionEditable()) return; |
yosin_UTC9
2017/05/25 04:47:20
It is better to have another patch to replace |mHa
amaralp1
2017/05/25 07:11:56
Done. https://codereview.chromium.org/2904033002
|
CharSequence result = data.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT); |
if (result != null) { |
@@ -919,7 +935,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
} |
void restoreSelectionPopupsIfNecessary() { |
- if (mHasSelection && !isActionModeValid()) { |
+ if (hasSelection() && !isActionModeValid()) { |
showActionModeOrClearOnFailure(); |
} |
} |
@@ -933,17 +949,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: |
@@ -956,7 +961,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
break; |
case SelectionEventType.SELECTION_HANDLES_CLEARED: |
- mHasSelection = false; |
+ mLastSelectedText = ""; |
mUnselectAllOnDismiss = false; |
mSelectionRect.setEmpty(); |
if (mSelectionClient != null) mSelectionClient.cancelAllRequests(); |
@@ -968,13 +973,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: |
@@ -1096,12 +1095,12 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
*/ |
@VisibleForTesting |
public boolean hasSelection() { |
- return mHasSelection; |
+ return mLastSelectedText.length() != 0; |
} |
@Override |
public String getSelectedText() { |
- return mHasSelection ? mLastSelectedText : ""; |
+ return mLastSelectedText; |
} |
private boolean isShareAvailable() { |
@@ -1142,7 +1141,7 @@ public class SelectionPopupController extends ActionModeCallbackHelper { |
@Override |
public void onClassified(SmartSelectionProvider.Result result) { |
// If the selection does not exist any more, discard |result|. |
- if (!mHasSelection) { |
+ if (!hasSelection()) { |
assert !mHidden; |
assert mClassificationResult == null; |
mPendingShowActionMode = false; |