Do not invoke textclassifier when dimissing the selection

Problem: When dismissing the selection by clicking the TextView,
invalidateActionModeAsync is called to ask text classifier to
generate a new smart action for the selected text. It is not necessary
because the selection is going to be dismissed.

Cause:
To update the smart action chip when a user adjusts the selection
span by dragging the selection handle, we call showFloatingToolbar()
when we get an ACTION_UP event. The problem is that we also get
an ACTION_UP event when user dismisses the seletion by clicking
the textview. In that case, we don't need to update the smart action
chip or show the floating toolbar.

Solution:
Only call ShowFloatingToolbar() when we get an ACTION_UP and also
the user is modifying the selection/insertion curosr.

Test: Added a test in TextViewIntegrationTest.
Test: Manual. Input a long phone number. Change the selection span to
select fewer digits. Click "Call" and check the prefilled number.
Test: Manual. Drag the insertion curosr(w EditText), floating toolbar is
reshown when lifting the finger.

Fixes: 169042542

Change-Id: Ic398a8521d99218b14689fe0668adc22e6b143c5
This commit is contained in:
Tony Mak
2021-01-22 21:51:34 +00:00
parent 7ee87037f5
commit 90e8a19f7c

View File

@@ -1705,15 +1705,23 @@ public class Editor {
}
private void updateFloatingToolbarVisibility(MotionEvent event) {
if (mTextActionMode != null) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_MOVE:
hideFloatingToolbar(ActionMode.DEFAULT_HIDE_DURATION);
break;
case MotionEvent.ACTION_UP: // fall through
case MotionEvent.ACTION_CANCEL:
if (mTextActionMode == null) {
return;
}
switch (event.getActionMasked()) {
case MotionEvent.ACTION_MOVE:
hideFloatingToolbar(ActionMode.DEFAULT_HIDE_DURATION);
break;
case MotionEvent.ACTION_UP: // fall through
case MotionEvent.ACTION_CANCEL:
final SelectionModifierCursorController selectionController =
getSelectionController();
final InsertionPointCursorController insertionController = getInsertionController();
if ((selectionController != null && selectionController.isCursorBeingModified())
|| (insertionController != null
&& insertionController.isCursorBeingModified())) {
showFloatingToolbar();
}
}
}
}