Merge "Minor TextView Context Menu refactor" into main
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index d28c953..03a2672 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -474,7 +474,11 @@
private final AccessibilitySmartActions mA11ySmartActions;
private InsertModeController mInsertModeController;
- Editor(TextView textView) {
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ public Editor(TextView textView) {
mTextView = textView;
// Synchronize the filter list, which places the undo input filter at the end.
mTextView.setFilters(mTextView.getFilters());
@@ -3206,16 +3210,6 @@
}
}
- final int menuItemOrderUndo = 2;
- final int menuItemOrderRedo = 3;
- final int menuItemOrderCut = 4;
- final int menuItemOrderCopy = 5;
- final int menuItemOrderPaste = 6;
- final int menuItemOrderPasteAsPlainText = 7;
- final int menuItemOrderSelectAll = 8;
- final int menuItemOrderShare = 9;
- final int menuItemOrderAutofill = 10;
-
menu.setOptionalIconsVisible(true);
menu.setGroupDividerEnabled(true);
@@ -3224,7 +3218,18 @@
final int keyboard = mTextView.getResources().getConfiguration().keyboard;
menu.setQwertyMode(keyboard == Configuration.KEYBOARD_QWERTY);
- final TypedArray a = mTextView.getContext().obtainStyledAttributes(new int[] {
+ setTextContextMenuItems(menu);
+
+ mPreserveSelection = true;
+
+ // No-op for the old context menu because it doesn't have icons.
+ adjustIconSpacing(menu);
+ }
+
+ /** @hide */
+ @VisibleForTesting
+ public void setTextContextMenuItems(ContextMenu menu) {
+ final TypedArray a = mTextView.getContext().obtainStyledAttributes(new int[]{
// TODO: Make Undo/Redo be public attribute.
com.android.internal.R.attr.actionModeUndoDrawable,
com.android.internal.R.attr.actionModeRedoDrawable,
@@ -3235,6 +3240,16 @@
android.R.attr.actionModeShareDrawable,
});
+ final int menuItemOrderUndo = 2;
+ final int menuItemOrderRedo = 3;
+ final int menuItemOrderCut = 4;
+ final int menuItemOrderCopy = 5;
+ final int menuItemOrderPaste = 6;
+ final int menuItemOrderPasteAsPlainText = 7;
+ final int menuItemOrderSelectAll = 8;
+ final int menuItemOrderShare = 9;
+ final int menuItemOrderAutofill = 10;
+
menu.add(CONTEXT_MENU_GROUP_UNDO_REDO, TextView.ID_UNDO, menuItemOrderUndo,
com.android.internal.R.string.undo)
.setAlphabeticShortcut('z')
@@ -3291,12 +3306,7 @@
.setEnabled(mTextView.canRequestAutofill()
&& (selected == null || selected.isEmpty()))
.setOnMenuItemClickListener(mOnContextMenuItemClickListener);
-
- mPreserveSelection = true;
a.recycle();
-
- // No-op for the old context menu because it doesn't have icons.
- adjustIconSpacing(menu);
}
/**
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 61ecc62..72b268b 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -12255,7 +12255,11 @@
return selectionMin >= 0 && selectionMax > 0 && selectionMin != selectionMax;
}
- String getSelectedText() {
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ public String getSelectedText() {
if (!hasSelection()) {
return null;
}
@@ -14080,7 +14084,11 @@
structure.setInputType(getInputType());
}
- boolean canRequestAutofill() {
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ public boolean canRequestAutofill() {
if (!isAutofillable()) {
return false;
}
diff --git a/core/tests/coretests/src/android/widget/TextViewContextMenuTest.java b/core/tests/coretests/src/android/widget/TextViewContextMenuTest.java
index f9da832..b11307e 100644
--- a/core/tests/coretests/src/android/widget/TextViewContextMenuTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewContextMenuTest.java
@@ -23,7 +23,9 @@
import static org.mockito.ArgumentMatchers.anyChar;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -251,8 +253,9 @@
when(menu.add(anyInt(), eq(TextView.ID_AUTOFILL), anyInt(), anyInt()))
.thenReturn(mockAutofillMenuItem);
- EditText et = mActivity.findViewById(R.id.editText);
- et.setText("Test");
+ EditText et = spy(mActivity.findViewById(R.id.editText));
+ doReturn(true).when(et).canRequestAutofill();
+ doReturn(null).when(et).getSelectedText();
Editor editor = et.getEditorForTesting();
editor.onCreateContextMenu(menu);
@@ -271,11 +274,11 @@
when(menu.add(anyInt(), eq(TextView.ID_AUTOFILL), anyInt(), anyInt()))
.thenReturn(mockAutofillMenuItem);
- EditText et = mActivity.findViewById(R.id.editText);
- et.setText("Test");
- et.selectAll();
- Editor editor = et.getEditorForTesting();
- editor.onCreateContextMenu(menu);
+ EditText et = spy(mActivity.findViewById(R.id.editText));
+ doReturn(true).when(et).canRequestAutofill();
+ doReturn("test").when(et).getSelectedText();
+ Editor editor = new Editor(et);
+ editor.setTextContextMenuItems(menu);
verify(menu).add(anyInt(), eq(TextView.ID_AUTOFILL), anyInt(), anyInt());
verify(mockAutofillMenuItem).setEnabled(false);