Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66e4924d authored by Ben Murdoch's avatar Ben Murdoch
Browse files

Minor TextView Context Menu refactor

Extract code to add text editing functions in the context menu to
it's own function to enable easier testing.

Bug: 345709107
Flag: EXEMPT minor refactoring only
Test: atest TextViewContextMenuTest

Change-Id: I3a973fe392bc7c93b1cabd0d98faaf82c6249cea
parent 9e701690
Loading
Loading
Loading
Loading
+27 −17
Original line number Diff line number Diff line
@@ -474,7 +474,11 @@ public class Editor {
    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 @@ public class Editor {
            }
        }

        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,6 +3218,17 @@ public class Editor {
        final int keyboard = mTextView.getResources().getConfiguration().keyboard;
        menu.setQwertyMode(keyboard == Configuration.KEYBOARD_QWERTY);

        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,
@@ -3235,6 +3240,16 @@ public class Editor {
                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 @@ public class Editor {
                .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);
    }

    /**
+10 −2
Original line number Diff line number Diff line
@@ -12255,7 +12255,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        return selectionMin >= 0 && selectionMax > 0 && selectionMin != selectionMax;
    }
    String getSelectedText() {
    /**
     * @hide
     */
    @VisibleForTesting
    public String getSelectedText() {
        if (!hasSelection()) {
            return null;
        }
@@ -14080,7 +14084,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        structure.setInputType(getInputType());
    }
    boolean canRequestAutofill() {
    /**
     * @hide
     */
    @VisibleForTesting
    public boolean canRequestAutofill() {
        if (!isAutofillable()) {
            return false;
        }
+10 −7
Original line number Diff line number Diff line
@@ -23,7 +23,9 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
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 @@ public class TextViewContextMenuTest {
        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 @@ public class TextViewContextMenuTest {
        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);