From 881c8db37d1bc97c64afd9121adfa38dd4dd1297 Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Wed, 1 Feb 2023 11:26:07 +0900 Subject: [PATCH] Reorder the context menu and add divider The old order is the same to ActionMode but it would be better to reoredr the items for ContextMenu to be same with desktop UI. Also, add divider between undo/redo and clipboard menus, and others. The old order was Undo Redo Cut Copy Paste Share Select All Autofill Paste as plain text The new order is Undo Redo -------------------- Cut Copy Paste Paste as plain text Select All -------------------- Share Autofill Bug: 240385199 Test: Manually done Change-Id: Icae50f8b12467953b4ce3a3fbc1fa7605e769035 --- core/java/android/widget/Editor.java | 100 ++++++++++++++++----------- 1 file changed, 59 insertions(+), 41 deletions(-) diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index d71e82f497aeb..136846a7bf61a 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -187,20 +187,34 @@ public class Editor { // Tag used when the Editor maintains its own separate UndoManager. private static final String UNDO_OWNER_TAG = "Editor"; - // Ordering constants used to place the Action Mode or context menu items in their menu. - private static final int MENU_ITEM_ORDER_ASSIST = 0; - private static final int MENU_ITEM_ORDER_UNDO = 2; - private static final int MENU_ITEM_ORDER_REDO = 3; - private static final int MENU_ITEM_ORDER_CUT = 4; - private static final int MENU_ITEM_ORDER_COPY = 5; - private static final int MENU_ITEM_ORDER_PASTE = 6; - private static final int MENU_ITEM_ORDER_SHARE = 7; - private static final int MENU_ITEM_ORDER_SELECT_ALL = 8; - private static final int MENU_ITEM_ORDER_REPLACE = 9; - private static final int MENU_ITEM_ORDER_AUTOFILL = 10; - private static final int MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT = 11; - private static final int MENU_ITEM_ORDER_SECONDARY_ASSIST_ACTIONS_START = 50; - private static final int MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START = 100; + // Ordering constants used to place the Action Mode items in their menu. + private static final int ACTION_MODE_MENU_ITEM_ORDER_ASSIST = 0; + private static final int ACTION_MODE_MENU_ITEM_ORDER_CUT = 4; + private static final int ACTION_MODE_MENU_ITEM_ORDER_COPY = 5; + private static final int ACTION_MODE_MENU_ITEM_ORDER_PASTE = 6; + private static final int ACTION_MODE_MENU_ITEM_ORDER_SHARE = 7; + private static final int ACTION_MODE_MENU_ITEM_ORDER_SELECT_ALL = 8; + private static final int ACTION_MODE_MENU_ITEM_ORDER_REPLACE = 9; + private static final int ACTION_MODE_MENU_ITEM_ORDER_AUTOFILL = 10; + private static final int ACTION_MODE_MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT = 11; + private static final int ACTION_MODE_MENU_ITEM_ORDER_SECONDARY_ASSIST_ACTIONS_START = 50; + private static final int ACTION_MODE_MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START = 100; + + // Ordering constants used to place the Context Menu items in their menu. + private static final int CONTEXT_MENU_ITEM_ORDER_UNDO = 2; + private static final int CONTEXT_MENU_ITEM_ORDER_REDO = 3; + private static final int CONTEXT_MENU_ITEM_ORDER_CUT = 4; + private static final int CONTEXT_MENU_ITEM_ORDER_COPY = 5; + private static final int CONTEXT_MENU_ITEM_ORDER_PASTE = 6; + private static final int CONTEXT_MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT = 7; + private static final int CONTEXT_MENU_ITEM_ORDER_SELECT_ALL = 8; + private static final int CONTEXT_MENU_ITEM_ORDER_SHARE = 9; + private static final int CONTEXT_MENU_ITEM_ORDER_AUTOFILL = 10; + private static final int CONTEXT_MENU_ITEM_ORDER_REPLACE = 11; + + private static final int CONTEXT_MENU_GROUP_UNDO_REDO = Menu.FIRST; + private static final int CONTEXT_MENU_GROUP_CLIPBOARD = Menu.FIRST + 1; + private static final int CONTEXT_MENU_GROUP_MISC = Menu.FIRST + 2; private static final int FLAG_MISSPELLED_OR_GRAMMAR_ERROR = SuggestionSpan.FLAG_MISSPELLED | SuggestionSpan.FLAG_GRAMMAR_ERROR; @@ -3114,8 +3128,8 @@ public class Editor { for (int i = 0; i < suggestionInfoArray.length; i++) { suggestionInfoArray[i] = new SuggestionInfo(); } - final SubMenu subMenu = menu.addSubMenu(Menu.NONE, Menu.NONE, MENU_ITEM_ORDER_REPLACE, - com.android.internal.R.string.replace); + final SubMenu subMenu = menu.addSubMenu(Menu.NONE, Menu.NONE, + CONTEXT_MENU_ITEM_ORDER_REPLACE, com.android.internal.R.string.replace); final int numItems = mSuggestionHelper.getSuggestionInfo(suggestionInfoArray, null); for (int i = 0; i < numItems; i++) { final SuggestionInfo info = suggestionInfoArray[i]; @@ -3133,47 +3147,51 @@ public class Editor { final int keyboard = mTextView.getResources().getConfiguration().keyboard; menu.setQwertyMode(keyboard == Configuration.KEYBOARD_QWERTY); - menu.add(Menu.NONE, TextView.ID_UNDO, MENU_ITEM_ORDER_UNDO, + menu.setGroupDividerEnabled(true); + + menu.add(CONTEXT_MENU_GROUP_UNDO_REDO, TextView.ID_UNDO, CONTEXT_MENU_ITEM_ORDER_UNDO, com.android.internal.R.string.undo) .setAlphabeticShortcut('z') .setOnMenuItemClickListener(mOnContextMenuItemClickListener) .setEnabled(mTextView.canUndo()); - menu.add(Menu.NONE, TextView.ID_REDO, MENU_ITEM_ORDER_REDO, + menu.add(CONTEXT_MENU_GROUP_UNDO_REDO, TextView.ID_REDO, CONTEXT_MENU_ITEM_ORDER_REDO, com.android.internal.R.string.redo) .setAlphabeticShortcut('z', KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON) .setOnMenuItemClickListener(mOnContextMenuItemClickListener) .setEnabled(mTextView.canRedo()); - menu.add(Menu.NONE, TextView.ID_CUT, MENU_ITEM_ORDER_CUT, + menu.add(CONTEXT_MENU_GROUP_CLIPBOARD, TextView.ID_CUT, CONTEXT_MENU_ITEM_ORDER_CUT, com.android.internal.R.string.cut) .setAlphabeticShortcut('x') .setOnMenuItemClickListener(mOnContextMenuItemClickListener) .setEnabled(mTextView.canCut()); - menu.add(Menu.NONE, TextView.ID_COPY, MENU_ITEM_ORDER_COPY, + menu.add(CONTEXT_MENU_GROUP_CLIPBOARD, TextView.ID_COPY, CONTEXT_MENU_ITEM_ORDER_COPY, com.android.internal.R.string.copy) .setAlphabeticShortcut('c') .setOnMenuItemClickListener(mOnContextMenuItemClickListener) .setEnabled(mTextView.canCopy()); - menu.add(Menu.NONE, TextView.ID_PASTE, MENU_ITEM_ORDER_PASTE, + menu.add(CONTEXT_MENU_GROUP_CLIPBOARD, TextView.ID_PASTE, CONTEXT_MENU_ITEM_ORDER_PASTE, com.android.internal.R.string.paste) .setAlphabeticShortcut('v') .setEnabled(mTextView.canPaste()) .setOnMenuItemClickListener(mOnContextMenuItemClickListener); - menu.add(Menu.NONE, TextView.ID_PASTE_AS_PLAIN_TEXT, MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT, + menu.add(CONTEXT_MENU_GROUP_CLIPBOARD, TextView.ID_PASTE_AS_PLAIN_TEXT, + CONTEXT_MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT, com.android.internal.R.string.paste_as_plain_text) .setAlphabeticShortcut('v', KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON) .setEnabled(mTextView.canPasteAsPlainText()) .setOnMenuItemClickListener(mOnContextMenuItemClickListener); - menu.add(Menu.NONE, TextView.ID_SHARE, MENU_ITEM_ORDER_SHARE, - com.android.internal.R.string.share) - .setEnabled(mTextView.canShare()) - .setOnMenuItemClickListener(mOnContextMenuItemClickListener); - menu.add(Menu.NONE, TextView.ID_SELECT_ALL, MENU_ITEM_ORDER_SELECT_ALL, - com.android.internal.R.string.selectAll) + menu.add(CONTEXT_MENU_GROUP_CLIPBOARD, TextView.ID_SELECT_ALL, + CONTEXT_MENU_ITEM_ORDER_SELECT_ALL, com.android.internal.R.string.selectAll) .setAlphabeticShortcut('a') .setEnabled(mTextView.canSelectAllText()) .setOnMenuItemClickListener(mOnContextMenuItemClickListener); - menu.add(Menu.NONE, TextView.ID_AUTOFILL, MENU_ITEM_ORDER_AUTOFILL, + + menu.add(CONTEXT_MENU_GROUP_MISC, TextView.ID_SHARE, CONTEXT_MENU_ITEM_ORDER_SHARE, + com.android.internal.R.string.share) + .setEnabled(mTextView.canShare()) + .setOnMenuItemClickListener(mOnContextMenuItemClickListener); + menu.add(CONTEXT_MENU_GROUP_MISC, TextView.ID_AUTOFILL, CONTEXT_MENU_ITEM_ORDER_AUTOFILL, android.R.string.autofill) .setEnabled(mTextView.canRequestAutofill()) .setOnMenuItemClickListener(mOnContextMenuItemClickListener); @@ -4355,28 +4373,28 @@ public class Editor { private void populateMenuWithItems(Menu menu) { if (mTextView.canCut()) { - menu.add(Menu.NONE, TextView.ID_CUT, MENU_ITEM_ORDER_CUT, + menu.add(Menu.NONE, TextView.ID_CUT, ACTION_MODE_MENU_ITEM_ORDER_CUT, com.android.internal.R.string.cut) .setAlphabeticShortcut('x') .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } if (mTextView.canCopy()) { - menu.add(Menu.NONE, TextView.ID_COPY, MENU_ITEM_ORDER_COPY, + menu.add(Menu.NONE, TextView.ID_COPY, ACTION_MODE_MENU_ITEM_ORDER_COPY, com.android.internal.R.string.copy) .setAlphabeticShortcut('c') .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } if (mTextView.canPaste()) { - menu.add(Menu.NONE, TextView.ID_PASTE, MENU_ITEM_ORDER_PASTE, + menu.add(Menu.NONE, TextView.ID_PASTE, ACTION_MODE_MENU_ITEM_ORDER_PASTE, com.android.internal.R.string.paste) .setAlphabeticShortcut('v') .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } if (mTextView.canShare()) { - menu.add(Menu.NONE, TextView.ID_SHARE, MENU_ITEM_ORDER_SHARE, + menu.add(Menu.NONE, TextView.ID_SHARE, ACTION_MODE_MENU_ITEM_ORDER_SHARE, com.android.internal.R.string.share) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } @@ -4384,7 +4402,7 @@ public class Editor { if (mTextView.canRequestAutofill()) { final String selected = mTextView.getSelectedText(); if (selected == null || selected.isEmpty()) { - menu.add(Menu.NONE, TextView.ID_AUTOFILL, MENU_ITEM_ORDER_AUTOFILL, + menu.add(Menu.NONE, TextView.ID_AUTOFILL, ACTION_MODE_MENU_ITEM_ORDER_AUTOFILL, com.android.internal.R.string.autofill) .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); } @@ -4394,7 +4412,7 @@ public class Editor { menu.add( Menu.NONE, TextView.ID_PASTE_AS_PLAIN_TEXT, - MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT, + ACTION_MODE_MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT, com.android.internal.R.string.paste_as_plain_text) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } @@ -4421,7 +4439,7 @@ public class Editor { boolean canSelectAll = mTextView.canSelectAllText(); boolean selectAllItemExists = menu.findItem(TextView.ID_SELECT_ALL) != null; if (canSelectAll && !selectAllItemExists) { - menu.add(Menu.NONE, TextView.ID_SELECT_ALL, MENU_ITEM_ORDER_SELECT_ALL, + menu.add(Menu.NONE, TextView.ID_SELECT_ALL, ACTION_MODE_MENU_ITEM_ORDER_SELECT_ALL, com.android.internal.R.string.selectAll) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } else if (!canSelectAll && selectAllItemExists) { @@ -4433,7 +4451,7 @@ public class Editor { boolean canReplace = mTextView.isSuggestionsEnabled() && shouldOfferToShowSuggestions(); boolean replaceItemExists = menu.findItem(TextView.ID_REPLACE) != null; if (canReplace && !replaceItemExists) { - menu.add(Menu.NONE, TextView.ID_REPLACE, MENU_ITEM_ORDER_REPLACE, + menu.add(Menu.NONE, TextView.ID_REPLACE, ACTION_MODE_MENU_ITEM_ORDER_REPLACE, com.android.internal.R.string.replace) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } else if (!canReplace && replaceItemExists) { @@ -4459,12 +4477,12 @@ public class Editor { // Primary assist action (Always shown). final MenuItem item = addAssistMenuItem(menu, textClassification.getActions().get(0), TextView.ID_ASSIST, - MENU_ITEM_ORDER_ASSIST, MenuItem.SHOW_AS_ACTION_ALWAYS); + ACTION_MODE_MENU_ITEM_ORDER_ASSIST, MenuItem.SHOW_AS_ACTION_ALWAYS); item.setIntent(textClassification.getIntent()); } else if (hasLegacyAssistItem(textClassification)) { // Legacy primary assist action (Always shown). final MenuItem item = menu.add( - TextView.ID_ASSIST, TextView.ID_ASSIST, MENU_ITEM_ORDER_ASSIST, + TextView.ID_ASSIST, TextView.ID_ASSIST, ACTION_MODE_MENU_ITEM_ORDER_ASSIST, textClassification.getLabel()) .setIcon(textClassification.getIcon()) .setIntent(textClassification.getIntent()); @@ -4478,7 +4496,7 @@ public class Editor { for (int i = 1; i < count; i++) { // Secondary assist action (Never shown). addAssistMenuItem(menu, textClassification.getActions().get(i), Menu.NONE, - MENU_ITEM_ORDER_SECONDARY_ASSIST_ACTIONS_START + i - 1, + ACTION_MODE_MENU_ITEM_ORDER_SECONDARY_ASSIST_ACTIONS_START + i - 1, MenuItem.SHOW_AS_ACTION_NEVER); } mPrevTextClassification = textClassification; @@ -7923,7 +7941,7 @@ public class Editor { for (int i = 0; i < size; i++) { final ResolveInfo resolveInfo = mSupportedActivities.get(i); menu.add(Menu.NONE, Menu.NONE, - Editor.MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START + i, + Editor.ACTION_MODE_MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START + i, getLabel(resolveInfo)) .setIntent(createProcessTextIntentForResolveInfo(resolveInfo)) .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);