From: uazo Date: Sun, 7 Jan 2024 15:46:46 +0000 Subject: Customize selection popup Adds options related to the handling of pop-up selections: Opens tabs in foreground, Move web search to the top of items, Web search in tab group and Enable smart text selection License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- .../SamsungSelectionActionMenuDelegate.java | 7 +- .../browser/ChromeActionModeHandler.java | 4 +- .../chrome/browser/ChromeTabbedActivity.java | 15 +++- ...ActivityTabWebContentsDelegateAndroid.java | 10 ++- .../compositor/layouts/LayoutManagerImpl.java | 9 ++- .../tab/TabContextMenuItemDelegate.java | 7 +- .../chrome/browser/ui/RootUiCoordinator.java | 8 +- .../Customize-selection-popup.grdp | 34 +++++++++ .../AutofillSelectionMenuItemHelper.java | 4 +- .../res/xml/accessibility_preferences.xml | 24 ++++++ .../selection/SelectActionMenuHelper.java | 20 ++--- .../SelectionPopupControllerImpl.java | 2 +- .../selection/SmartSelectionClient.java | 4 + .../browser/PendingSelectionMenu.java | 8 +- .../browser/SelectionMenuItem.java | 73 ++++++++++++------- .../SelectionActionMenuDelegate.java | 32 +++++--- 16 files changed, 194 insertions(+), 67 deletions(-) create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Customize-selection-popup.grdp diff --git a/android_webview/java/src/org/chromium/android_webview/selection/SamsungSelectionActionMenuDelegate.java b/android_webview/java/src/org/chromium/android_webview/selection/SamsungSelectionActionMenuDelegate.java --- a/android_webview/java/src/org/chromium/android_webview/selection/SamsungSelectionActionMenuDelegate.java +++ b/android_webview/java/src/org/chromium/android_webview/selection/SamsungSelectionActionMenuDelegate.java @@ -134,7 +134,7 @@ public class SamsungSelectionActionMenuDelegate extends AutofillSelectionActionM .setIcon(null) .setOrderAndCategory( Menu.CATEGORY_SECONDARY, - SelectionMenuItem.ItemGroupOffset.TEXT_PROCESSING_ITEMS) + SelectionMenuItem.ItemGroupOffset.TEXT_PROCESSING_ITEMS()) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) .setIntent(createManageAppsIntent()) .build()); @@ -167,7 +167,7 @@ public class SamsungSelectionActionMenuDelegate extends AutofillSelectionActionM .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) .setOrderAndCategory( DefaultItem.PASTE, // Show after paste. - SelectionMenuItem.ItemGroupOffset.DEFAULT_ITEMS) + SelectionMenuItem.ItemGroupOffset.DEFAULT_ITEMS()) .setIntent( getTranslationActionIntent(selectedText, translateResolveInfo)) .build()); @@ -180,7 +180,7 @@ public class SamsungSelectionActionMenuDelegate extends AutofillSelectionActionM .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS) .setOrderAndCategory( Menu.FIRST, // Show as first item after primary assist item. - SelectionMenuItem.ItemGroupOffset.ASSIST_ITEMS) + SelectionMenuItem.ItemGroupOffset.ASSIST_ITEMS()) .setIntent( createWritingToolkitIntent(selectedText, isSelectionReadOnly)) .build()); @@ -239,6 +239,7 @@ public class SamsungSelectionActionMenuDelegate extends AutofillSelectionActionM } public static boolean shouldUseSamsungMenuItemOrdering() { + if ((true)) return false; return Build.VERSION.SDK_INT <= MAXIMUM_BUILD_VERSION_CODE_SUPPORTED && isSamsungDevice(); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java @@ -173,9 +173,7 @@ public class ChromeActionModeHandler { | ActionModeCallbackHelper.MENU_ITEM_SHARE; // Disable options that expose additional Chrome functionality prior to the FRE being // completed (i.e. creation of a new tab). - if (FirstRunStatus.getFirstRunFlowComplete() && mShowWebSearch) { - allowedActionModes |= ActionModeCallbackHelper.MENU_ITEM_WEB_SEARCH; - } + allowedActionModes |= ActionModeCallbackHelper.MENU_ITEM_WEB_SEARCH; mHelper.setAllowedMenuItems(allowedActionModes); mHelper.onCreateActionMode(mode, menu); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java @@ -944,10 +944,17 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt @TabLaunchType int type, @TabCreationState int creationState, boolean markedForSelection) { - if (type == TabLaunchType.FROM_LONGPRESS_BACKGROUND - || type == TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP - || (type == TabLaunchType.FROM_RECENT_TABS - && !DeviceClassManager.enableAnimations())) { + boolean selectionPopupTabsForeground = + ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_tabs_foreground", false); + boolean showToast = type == TabLaunchType.FROM_RECENT_TABS + && !DeviceClassManager.enableAnimations(); + if (!showToast && !selectionPopupTabsForeground) { + showToast = !DeviceClassManager.enableAnimations() && + (type == TabLaunchType.FROM_LONGPRESS_BACKGROUND + || type == TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP); + } + if (showToast) { Toast.makeText( ChromeTabbedActivity.this, R.string.open_in_new_tab_toast, diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java @@ -253,6 +253,14 @@ public class ActivityTabWebContentsDelegateAndroid extends TabWebContentsDelegat // Skip opening a new Tab if it doesn't make sense. if (mTab.isClosing()) return false; + int tabLaunchType = TabLaunchType.FROM_LONGPRESS_FOREGROUND; + boolean selectionPopupTabsForeground = + ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_tabs_foreground", false); + if (selectionPopupTabsForeground) { + tabLaunchType = TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP; + } + if (ChromeFeatureList.isEnabled(ChromeFeatureList.DOCUMENT_PICTURE_IN_PICTURE_API) && disposition == WindowOpenDisposition.NEW_PICTURE_IN_PICTURE) { assertNonNull(pictureInPictureWindowOptions); @@ -270,7 +278,7 @@ public class ActivityTabWebContentsDelegateAndroid extends TabWebContentsDelegat mTab, /* shouldPin= */ false, webContents, - TabLaunchType.FROM_LONGPRESS_FOREGROUND, + tabLaunchType, targetUrl, addTabToModel); if (tab == null) return false; diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java @@ -20,6 +20,7 @@ import androidx.annotation.Px; import androidx.annotation.VisibleForTesting; import org.chromium.base.Callback; +import org.chromium.base.ContextUtils; import org.chromium.base.ObserverList; import org.chromium.base.TraceEvent; import org.chromium.base.supplier.MonotonicObservableSupplier; @@ -243,11 +244,17 @@ public class LayoutManagerImpl boolean willBeSelected = willAddedTabBeSelected(launchType, incognito); float lastTapX = LocalizationUtils.isLayoutRtl() ? mHost.getWidth() * mPxToDp : 0.f; float lastTapY = 0.f; + boolean selectionPopupTabsForeground = + ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_tabs_foreground", false); + if (selectionPopupTabsForeground) { + willBeSelected = launchType != TabLaunchType.FROM_RESTORE_TABS_UI + || (!getTabModelSelector().isIncognitoSelected() && incognito); + } if (launchType != TabLaunchType.FROM_CHROME_UI) { lastTapX = mPxToDp * mLastTapX; lastTapY = mPxToDp * mLastTapY; } - tabCreated( tabId, getTabModelSelector().getCurrentTabId(), diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java @@ -404,8 +404,13 @@ public class TabContextMenuItemDelegate implements ContextMenuItemDelegate { public void onOpenImageInNewTab(GURL url, @Nullable Referrer referrer) { LoadUrlParams loadUrlParams = new LoadUrlParams(url.getSpec()); loadUrlParams.setReferrer(referrer); + @TabLaunchType int type = TabLaunchType.FROM_LONGPRESS_BACKGROUND; + if (ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_tabs_foreground", false)) { + type = TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP; + } mTabModelSelector.openNewTab( - loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab, isIncognito()); + loadUrlParams, type, mTab, isIncognito()); } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java @@ -34,6 +34,7 @@ import androidx.core.view.WindowInsetsCompat; import org.chromium.base.Callback; import org.chromium.base.CallbackController; +import org.chromium.base.ContextUtils; import org.chromium.base.DeviceInfo; import org.chromium.base.TraceEvent; import org.chromium.base.lifetime.Destroyable; @@ -1083,11 +1084,16 @@ public class RootUiCoordinator TrackerFactory.getTrackerForProfile(tab.getProfile()) .notifyEvent(EventConstants.WEB_SEARCH_PERFORMED); + boolean selection_popup_web_search_to_group = + ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_web_search_to_group", false); + mTabModelSelectorSupplier .get() .openNewTab( generateUrlParamsForSearch(tab, query), - TabLaunchType.FROM_LONGPRESS_FOREGROUND, + selection_popup_web_search_to_group ? TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP + : TabLaunchType.FROM_LONGPRESS_FOREGROUND, tab, tab.isIncognito()); }, diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Customize-selection-popup.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Customize-selection-popup.grdp new file mode 100644 --- /dev/null +++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Customize-selection-popup.grdp @@ -0,0 +1,34 @@ + + + + Customize selection popup + + + + Opens tabs in foreground + + + Immediately brings new open tabs to the foreground + + + + Move web search to the top of items + + + Web search as first choice + + + + Web search in tab group + + + Opens the search in a tab in the current group, if deactivated opens a new group + + + + Enable smart text selection + + + Smart Text selection automatically augments the selected boundaries and classifies the selected text based on the context by sending selection together with its surrounding text + + diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillSelectionMenuItemHelper.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillSelectionMenuItemHelper.java --- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillSelectionMenuItemHelper.java +++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillSelectionMenuItemHelper.java @@ -39,7 +39,7 @@ public class AutofillSelectionMenuItemHelper { .setGroupId(R.id.select_action_menu_delegate_items) .setOrderAndCategory( Menu.FIRST, - SelectionMenuItem.ItemGroupOffset.SECONDARY_ASSIST_ITEMS) + SelectionMenuItem.ItemGroupOffset.SECONDARY_ASSIST_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) @@ -52,7 +52,7 @@ public class AutofillSelectionMenuItemHelper { .setGroupId(R.id.select_action_menu_delegate_items) .setOrderAndCategory( Menu.CATEGORY_SECONDARY, // Show at end of section. - SelectionMenuItem.ItemGroupOffset.SECONDARY_ASSIST_ITEMS) + SelectionMenuItem.ItemGroupOffset.SECONDARY_ASSIST_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_NEVER | MenuItem.SHOW_AS_ACTION_WITH_TEXT) diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml --- a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml +++ b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml @@ -89,4 +89,28 @@ found in the LICENSE file. android:key="disable_toolbar_swipeup" android:title="@string/disable_toolbar_swipe_up" /> + + + + + + + + + + diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectActionMenuHelper.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectActionMenuHelper.java --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectActionMenuHelper.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectActionMenuHelper.java @@ -169,7 +169,7 @@ public class SelectActionMenuHelper { return new SelectionMenuItem.Builder(primaryAction.getTitle()) .setId(android.R.id.textAssist) .setGroupId(R.id.select_action_menu_assist_items) - .setOrderAndCategory(0, ItemGroupOffset.ASSIST_ITEMS) + .setOrderAndCategory(0, ItemGroupOffset.ASSIST_ITEMS()) .setIcon(getPrimaryActionIconForClassificationResult(classificationResult, context)) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) .build(); @@ -247,7 +247,7 @@ public class SelectActionMenuHelper { .setGroupId(groupId) .setIcon(icons == null ? null : icons.get(i)) .setOrderAndCategory( - i - startIndex, ItemGroupOffset.SECONDARY_ASSIST_ITEMS) + i - startIndex, ItemGroupOffset.SECONDARY_ASSIST_ITEMS()) .setContentDescription(action.getContentDescription()) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) .build(); @@ -296,7 +296,7 @@ public class SelectActionMenuHelper { .setId(Menu.NONE) .setGroupId(R.id.select_action_menu_text_processing_items) .setIcon(icon) - .setOrderAndCategory(i, ItemGroupOffset.TEXT_PROCESSING_ITEMS) + .setOrderAndCategory(i, ItemGroupOffset.TEXT_PROCESSING_ITEMS()) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) .setIntent(intent) .build()); @@ -341,7 +341,7 @@ public class SelectActionMenuHelper { .setGroupId(R.id.select_action_menu_default_items) .setIconAttr(android.R.attr.actionModeCutDrawable) .setAlphabeticShortcut(ItemKeyShortcuts.CUT) - .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS) + .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(true) @@ -355,7 +355,7 @@ public class SelectActionMenuHelper { .setGroupId(R.id.select_action_menu_default_items) .setIconAttr(android.R.attr.actionModeCopyDrawable) .setAlphabeticShortcut(ItemKeyShortcuts.COPY) - .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS) + .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(true) @@ -369,7 +369,7 @@ public class SelectActionMenuHelper { .setGroupId(R.id.select_action_menu_default_items) .setIconAttr(android.R.attr.actionModePasteDrawable) .setAlphabeticShortcut(ItemKeyShortcuts.PASTE) - .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS) + .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(true) @@ -385,7 +385,7 @@ public class SelectActionMenuHelper { .setId(R.id.select_action_menu_share) .setGroupId(R.id.select_action_menu_default_items) .setIconAttr(android.R.attr.actionModeShareDrawable) - .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS) + .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(true) @@ -399,7 +399,7 @@ public class SelectActionMenuHelper { .setGroupId(R.id.select_action_menu_default_items) .setIconAttr(android.R.attr.actionModeSelectAllDrawable) .setAlphabeticShortcut(ItemKeyShortcuts.SELECT_ALL) - .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS) + .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(true) @@ -412,7 +412,7 @@ public class SelectActionMenuHelper { new SelectionMenuItem.Builder(android.R.string.paste_as_plain_text) .setId(android.R.id.pasteAsPlainText) .setGroupId(R.id.select_action_menu_default_items) - .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS) + .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(true); @@ -432,7 +432,7 @@ public class SelectActionMenuHelper { .setId(R.id.select_action_menu_web_search) .setGroupId(R.id.select_action_menu_default_items) .setIconAttr(android.R.attr.actionModeWebSearchDrawable) - .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS) + .setOrderAndCategory(order, ItemGroupOffset.DEFAULT_ITEMS()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(true) diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java @@ -1149,7 +1149,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper private boolean handleAssistMenuItemClick(int order) { // Primary assist action is always the first action in the list so offset by 1. - int index = 1 + order - SelectionMenuItem.ItemGroupOffset.SECONDARY_ASSIST_ITEMS; + int index = 1 + order - SelectionMenuItem.ItemGroupOffset.SECONDARY_ASSIST_ITEMS(); if (mClassificationResult == null || mClassificationResult.textClassification == null || mClassificationResult.textClassification.getActions().size() <= index) { diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java b/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java --- a/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java @@ -19,6 +19,7 @@ import org.jni_zero.JNINamespace; import org.jni_zero.JniType; import org.jni_zero.NativeMethods; +import org.chromium.base.ContextUtils; import org.chromium.base.ObserverList; import org.chromium.base.UserData; import org.chromium.build.annotations.Initializer; @@ -81,6 +82,9 @@ public class SmartSelectionClient implements SelectionClient, UserData { return null; } + if (!ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_smart_text", false)) return null; + SmartSelectionClient client = assumeNonNull( webContents.getOrSetUserData( diff --git a/content/public/android/java/src/org/chromium/content_public/browser/PendingSelectionMenu.java b/content/public/android/java/src/org/chromium/content_public/browser/PendingSelectionMenu.java --- a/content/public/android/java/src/org/chromium/content_public/browser/PendingSelectionMenu.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/PendingSelectionMenu.java @@ -165,13 +165,13 @@ public final class PendingSelectionMenu { @VisibleForTesting public @LogicalGroup int determineGroup(SelectionMenuItem item) { int order = item.order; - if (order >= ItemGroupOffset.TEXT_PROCESSING_ITEMS) { + if (order >= ItemGroupOffset.TEXT_PROCESSING_ITEMS()) { return LogicalGroup.TEXT_PROCESSING_ITEMS; - } else if (order >= ItemGroupOffset.SECONDARY_ASSIST_ITEMS) { + } else if (order >= ItemGroupOffset.SECONDARY_ASSIST_ITEMS()) { return LogicalGroup.SECONDARY_ASSIST_ITEMS; - } else if (order >= ItemGroupOffset.DEFAULT_ITEMS) { + } else if (order >= ItemGroupOffset.DEFAULT_ITEMS()) { return LogicalGroup.DEFAULT_ITEMS; - } else if (order >= ItemGroupOffset.ASSIST_ITEMS) { + } else if (order >= ItemGroupOffset.ASSIST_ITEMS()) { return LogicalGroup.ASSIST_ITEMS; } throw new IllegalStateException("Invalid order. Must be >= 0"); diff --git a/content/public/android/java/src/org/chromium/content_public/browser/SelectionMenuItem.java b/content/public/android/java/src/org/chromium/content_public/browser/SelectionMenuItem.java --- a/content/public/android/java/src/org/chromium/content_public/browser/SelectionMenuItem.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/SelectionMenuItem.java @@ -18,6 +18,7 @@ import androidx.annotation.IntDef; import androidx.annotation.StringRes; import androidx.appcompat.content.res.AppCompatResources; +import org.chromium.base.ContextUtils; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -34,18 +35,38 @@ public final class SelectionMenuItem implements Comparable { * less than SECONDARY_ASSIST_ITEMS will appear in the default items section. Each section is * separated by a divider in dropdown menus. */ - @Retention(RetentionPolicy.SOURCE) - @IntDef({ - ItemGroupOffset.ASSIST_ITEMS, - ItemGroupOffset.DEFAULT_ITEMS, - ItemGroupOffset.SECONDARY_ASSIST_ITEMS, - ItemGroupOffset.TEXT_PROCESSING_ITEMS - }) - public @interface ItemGroupOffset { - int ASSIST_ITEMS = 0; - int DEFAULT_ITEMS = 10; - int SECONDARY_ASSIST_ITEMS = 20; - int TEXT_PROCESSING_ITEMS = 30; + public static class ItemGroupOffset { + static int CHROMIUM_ASSIST_ITEMS = 1; + static int CHROMIUM_DEFAULT_ITEMS = 2; + static int CHROMIUM_SECONDARY_ASSIST_ITEMS = 3; + static int CHROMIUM_TEXT_PROCESSING_ITEMS = 4; + + static int CROMITE_DEFAULT_ITEMS = 1; + static int CROMITE_ASSIST_ITEMS = 2; + static int CROMITE_SECONDARY_ASSIST_ITEMS = 3; + static int CROMITE_TEXT_PROCESSING_ITEMS = 4; + + private static int GetValue(int a, int b) { + return !ContextUtils.getAppSharedPreferences().getBoolean( + "enable_accessibility", false) + ? a : b; + } + + public static int ASSIST_ITEMS() { + return GetValue(CHROMIUM_ASSIST_ITEMS, CROMITE_ASSIST_ITEMS); + } + + public static int DEFAULT_ITEMS() { + return GetValue(CHROMIUM_DEFAULT_ITEMS, CROMITE_DEFAULT_ITEMS); + } + + public static int SECONDARY_ASSIST_ITEMS() { + return GetValue(CHROMIUM_SECONDARY_ASSIST_ITEMS, CROMITE_SECONDARY_ASSIST_ITEMS); + } + + public static int TEXT_PROCESSING_ITEMS() { + return GetValue(CHROMIUM_TEXT_PROCESSING_ITEMS, CROMITE_TEXT_PROCESSING_ITEMS); + } } private final @AttrRes int mIconAttr; @@ -210,25 +231,23 @@ public final class SelectionMenuItem implements Comparable { * @param order the order, must be >= 0. * @param category the section of the menu in which this item should appear. */ - public Builder setOrderAndCategory(int order, @ItemGroupOffset int category) { + public Builder setOrderAndCategory(int order, int category) { if (order < 0) { throw new IllegalArgumentException("Invalid order. Must be >= 0"); } // Make sure items don't spill over into the next category. - mOrder = - switch (category) { - case ItemGroupOffset.ASSIST_ITEMS -> - Math.min(order + category, ItemGroupOffset.DEFAULT_ITEMS - 1); - case ItemGroupOffset.DEFAULT_ITEMS -> - Math.min( - order + category, - ItemGroupOffset.SECONDARY_ASSIST_ITEMS - 1); - case ItemGroupOffset.SECONDARY_ASSIST_ITEMS -> - Math.min( - order + category, - ItemGroupOffset.TEXT_PROCESSING_ITEMS - 1); - default -> order + category; - }; + if (category == ItemGroupOffset.ASSIST_ITEMS()) + mOrder = Math.min(order + category, ItemGroupOffset.DEFAULT_ITEMS() - 1); + else if (category == ItemGroupOffset.DEFAULT_ITEMS()) + mOrder = Math.min( + order + category, + ItemGroupOffset.SECONDARY_ASSIST_ITEMS() - 1); + else if (category == ItemGroupOffset.SECONDARY_ASSIST_ITEMS()) + mOrder = Math.min( + order + category, + ItemGroupOffset.TEXT_PROCESSING_ITEMS() - 1); + else + mOrder = order + category; return this; } diff --git a/content/public/android/java/src/org/chromium/content_public/browser/selection/SelectionActionMenuDelegate.java b/content/public/android/java/src/org/chromium/content_public/browser/selection/SelectionActionMenuDelegate.java --- a/content/public/android/java/src/org/chromium/content_public/browser/selection/SelectionActionMenuDelegate.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/selection/SelectionActionMenuDelegate.java @@ -7,6 +7,7 @@ package org.chromium.content_public.browser.selection; import android.content.pm.ResolveInfo; import android.view.View; +import org.chromium.base.ContextUtils; import org.chromium.base.SelectionActionMenuClientWrapper.DefaultItem; import org.chromium.base.SelectionActionMenuClientWrapper.MenuType; import org.chromium.build.annotations.NullMarked; @@ -23,15 +24,28 @@ import java.util.List; @NullMarked public interface SelectionActionMenuDelegate { static @DefaultItem int[] getDefaultMenuItemOrder() { - return new @DefaultItem int[] { - DefaultItem.CUT, - DefaultItem.COPY, - DefaultItem.PASTE, - DefaultItem.PASTE_AS_PLAIN_TEXT, - DefaultItem.SHARE, - DefaultItem.SELECT_ALL, - DefaultItem.WEB_SEARCH - }; + if (!ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_web_search_to_top", false)) { + return new @DefaultItem int[] { + DefaultItem.CUT, + DefaultItem.COPY, + DefaultItem.PASTE, + DefaultItem.PASTE_AS_PLAIN_TEXT, + DefaultItem.SHARE, + DefaultItem.SELECT_ALL, + DefaultItem.WEB_SEARCH + }; + } else { + return new @DefaultItem int[] { + DefaultItem.WEB_SEARCH, + DefaultItem.CUT, + DefaultItem.COPY, + DefaultItem.PASTE, + DefaultItem.PASTE_AS_PLAIN_TEXT, + DefaultItem.SHARE, + DefaultItem.SELECT_ALL + }; + } } /** --