Fix the empty selection issue when onCreateActionMode returns false
One of the optimizations ag/12911059 did was calling
SelectionModifierCursorController.show() before
startActionModeInternal(). The rationale was that if we start the action
mode first, SelectionModifierCursorController.show() would end up
invalidating the action mode twice unnecessarily, once for each handle.
However, with this optimization, we are calling
SelectionModifierCursorController.show() even when onCreateActionMode
returns false.
Reverted this particular optimization to fix the issue.
Added a test which was failing without this fix but passing with it.
Fixes: 199380016
Fixes: 214341747
Test: atest TextViewActivityTest
Merged-In: I793f76a23978cbbbbde2d16e8a522615174bcdd5
Change-Id: I793f76a23978cbbbbde2d16e8a522615174bcdd5
(cherry picked from commit 11bd644822
)
This commit is contained in:
@ -297,12 +297,12 @@ public final class SelectionActionModeHelper {
|
||||
} else {
|
||||
mTextClassification = null;
|
||||
}
|
||||
final SelectionModifierCursorController controller = mEditor.getSelectionController();
|
||||
if (controller != null
|
||||
&& (mTextView.isTextSelectable() || mTextView.isTextEditable())) {
|
||||
controller.show();
|
||||
}
|
||||
if (mEditor.startActionModeInternal(actionMode)) {
|
||||
final SelectionModifierCursorController controller = mEditor.getSelectionController();
|
||||
if (controller != null
|
||||
&& (mTextView.isTextSelectable() || mTextView.isTextEditable())) {
|
||||
controller.show();
|
||||
}
|
||||
if (result != null) {
|
||||
switch (actionMode) {
|
||||
case Editor.TextActionMode.SELECTION:
|
||||
|
@ -17,6 +17,7 @@
|
||||
package android.widget;
|
||||
|
||||
import static android.widget.espresso.CustomViewActions.longPressAtRelativeCoordinates;
|
||||
import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles;
|
||||
import static android.widget.espresso.DragHandleUtils.onHandleView;
|
||||
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem;
|
||||
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem;
|
||||
@ -425,6 +426,41 @@ public class TextViewActivityTest {
|
||||
assertEquals(latestItem[0], clickedItem[0]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSelectionOnCreateActionModeReturnsFalse() throws Throwable {
|
||||
final String text = "hello world";
|
||||
mActivityRule.runOnUiThread(() -> {
|
||||
final TextView textView = mActivity.findViewById(R.id.textview);
|
||||
textView.setText(text);
|
||||
textView.setCustomSelectionActionModeCallback(
|
||||
new ActionMode.Callback() {
|
||||
@Override
|
||||
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDestroyActionMode(ActionMode mode) {
|
||||
}
|
||||
});
|
||||
});
|
||||
mInstrumentation.waitForIdleSync();
|
||||
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf("d")));
|
||||
mInstrumentation.waitForIdleSync();
|
||||
assertNoSelectionHandles();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSelectionRemovedWhenNonselectableTextLosesFocus() throws Throwable {
|
||||
final TextLinks.TextLink textLink = addLinkifiedTextToTextView(R.id.nonselectable_textview);
|
||||
|
Reference in New Issue
Block a user