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 --- .../browser/ChromeActionModeHandler.java | 4 +- .../chrome/browser/ChromeTabbedActivity.java | 15 +- .../compositor/layouts/LayoutManagerImpl.java | 8 ++ .../chrome/browser/ui/RootUiCoordinator.java | 8 +- .../Customize-selection-popup.grdp | 34 +++++ .../res/xml/accessibility_preferences.xml | 24 ++++ .../selection/SelectActionMenuHelper.java | 131 ++++++++++++------ .../selection/SmartSelectionClient.java | 4 + 8 files changed, 178 insertions(+), 50 deletions(-) create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Customize-selection-popup.grdp 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 @@ -148,9 +148,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()) { - 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 @@ -737,10 +737,17 @@ public class ChromeTabbedActivity extends ChromeActivity + + + 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/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 @@ -63,4 +63,28 @@ found in the LICENSE file. android:key="move_toolbar_bottom" android:summary="@string/move_toolbar_bottom_summary" android:title="@string/move_toolbar_bottom_title" /> + + + + + + + + + + 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 @@ -26,6 +26,7 @@ import androidx.core.content.ContextCompat; import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.base.ContextUtils; import org.chromium.base.PackageManagerUtils; import org.chromium.base.StrictModeContext; import org.chromium.content.R; @@ -51,38 +52,84 @@ import java.util.TreeSet; public class SelectActionMenuHelper { private static final String TAG = "SelectActionMenu"; // 20 char limit. - @Retention(RetentionPolicy.SOURCE) - @IntDef({ - GroupItemOrder.ASSIST_ITEMS, - GroupItemOrder.DEFAULT_ITEMS, - GroupItemOrder.SECONDARY_ASSIST_ITEMS, - GroupItemOrder.TEXT_PROCESSING_ITEMS - }) - public @interface GroupItemOrder { - int ASSIST_ITEMS = 1; - int DEFAULT_ITEMS = 2; - int SECONDARY_ASSIST_ITEMS = 3; - int TEXT_PROCESSING_ITEMS = 4; + private static class GroupItemOrderChromium { + 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); + } } - @Retention(RetentionPolicy.SOURCE) - @IntDef({ - DefaultItemOrder.CUT, - DefaultItemOrder.COPY, - DefaultItemOrder.PASTE, - DefaultItemOrder.PASTE_AS_PLAIN_TEXT, - DefaultItemOrder.SHARE, - DefaultItemOrder.SELECT_ALL, - DefaultItemOrder.WEB_SEARCH - }) - public @interface DefaultItemOrder { - int CUT = 1; - int COPY = 2; - int PASTE = 3; - int PASTE_AS_PLAIN_TEXT = 4; - int SHARE = 5; - int SELECT_ALL = 6; - int WEB_SEARCH = 7; + private static class DefaultItemOrderChromium { + static int CHROMIUM_CUT = 1; + static int CHROMIUM_COPY = 2; + static int CHROMIUM_PASTE = 3; + static int CHROMIUM_SHARE = 4; + static int CHROMIUM_SELECT_ALL = 5; + static int CHROMIUM_PASTE_AS_PLAIN_TEXT = 6; + static int CHROMIUM_WEB_SEARCH = 7; + + static int CROMITE_WEB_SEARCH = 1; + static int CROMITE_CUT = 2; + static int CROMITE_COPY = 3; + static int CROMITE_PASTE = 4; + static int CROMITE_SHARE = 5; + static int CROMITE_SELECT_ALL = 6; + static int CROMITE_PASTE_AS_PLAIN_TEXT = 7; + + private static int GetValue(int a, int b) { + return !ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_web_search_to_top", false) + ? a : b; + } + + public static int CUT() { + return GetValue(CHROMIUM_CUT, CROMITE_CUT); + } + public static int COPY() { + return GetValue(CHROMIUM_COPY, CROMITE_COPY); + } + public static int PASTE() { + return GetValue(CHROMIUM_PASTE, CROMITE_PASTE); + } + public static int SHARE() { + return GetValue(CHROMIUM_SHARE, CROMITE_SHARE); + } + public static int SELECT_ALL() { + return GetValue(CHROMIUM_SELECT_ALL, CROMITE_SELECT_ALL); + } + public static int PASTE_AS_PLAIN_TEXT() { + return GetValue(CHROMIUM_PASTE_AS_PLAIN_TEXT, CROMITE_PASTE_AS_PLAIN_TEXT); + } + public static int WEB_SEARCH() { + return GetValue(CHROMIUM_WEB_SEARCH, CROMITE_WEB_SEARCH); + } } @Retention(RetentionPolicy.SOURCE) @@ -159,7 +206,7 @@ public class SelectActionMenuHelper { if (!additionalMenuItems.isEmpty()) { // Additional menu item group which comes after default menu items. SelectionMenuGroup additionalItemGroup = - new SelectionMenuGroup(Menu.NONE, GroupItemOrder.SECONDARY_ASSIST_ITEMS); + new SelectionMenuGroup(Menu.NONE, GroupItemOrderChromium.SECONDARY_ASSIST_ITEMS()); additionalItemGroup.addItems(additionalMenuItems); pasteMenuItems.add(additionalItemGroup); } @@ -225,7 +272,7 @@ public class SelectActionMenuHelper { } SelectionMenuGroup primaryAssistGroup = new SelectionMenuGroup( - R.id.select_action_menu_assist_items, GroupItemOrder.ASSIST_ITEMS); + R.id.select_action_menu_assist_items, GroupItemOrderChromium.ASSIST_ITEMS()); View.OnClickListener clickListener = null; if (classificationResult.onClickListener != null) { clickListener = classificationResult.onClickListener; @@ -251,7 +298,7 @@ public class SelectActionMenuHelper { String selectedText) { SelectionMenuGroup defaultGroup = new SelectionMenuGroup( - R.id.select_action_menu_default_items, GroupItemOrder.DEFAULT_ITEMS); + R.id.select_action_menu_default_items, GroupItemOrderChromium.DEFAULT_ITEMS()); List menuItemBuilders = new ArrayList<>(); menuItemBuilders.add(cut(delegate.canCut())); menuItemBuilders.add(copy(delegate.canCopy())); @@ -302,7 +349,7 @@ public class SelectActionMenuHelper { // these menu items. SelectionMenuGroup secondaryAssistItems = new SelectionMenuGroup( - android.R.id.textAssist, GroupItemOrder.SECONDARY_ASSIST_ITEMS); + android.R.id.textAssist, GroupItemOrderChromium.SECONDARY_ASSIST_ITEMS()); // First action is reserved for primary action so start at index 1. final int startIndex = 1; @@ -335,7 +382,7 @@ public class SelectActionMenuHelper { SelectionMenuGroup textProcessingItems = new SelectionMenuGroup( R.id.select_action_menu_text_processing_items, - GroupItemOrder.TEXT_PROCESSING_ITEMS); + GroupItemOrderChromium.TEXT_PROCESSING_ITEMS()); if (isSelectionPassword || intentHandler == null) { addAdditionalTextProcessingItems(textProcessingItems, selectionActionMenuDelegate); return textProcessingItems; @@ -431,7 +478,7 @@ public class SelectActionMenuHelper { .setId(R.id.select_action_menu_cut) .setIconAttr(android.R.attr.actionModeCutDrawable) .setAlphabeticShortcut(ItemKeyShortcuts.CUT) - .setOrderInCategory(DefaultItemOrder.CUT) + .setOrderInCategory(DefaultItemOrderChromium.CUT()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) @@ -443,7 +490,7 @@ public class SelectActionMenuHelper { .setId(R.id.select_action_menu_copy) .setIconAttr(android.R.attr.actionModeCopyDrawable) .setAlphabeticShortcut(ItemKeyShortcuts.COPY) - .setOrderInCategory(DefaultItemOrder.COPY) + .setOrderInCategory(DefaultItemOrderChromium.COPY()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) @@ -455,7 +502,7 @@ public class SelectActionMenuHelper { .setId(R.id.select_action_menu_paste) .setIconAttr(android.R.attr.actionModePasteDrawable) .setAlphabeticShortcut(ItemKeyShortcuts.PASTE) - .setOrderInCategory(DefaultItemOrder.PASTE) + .setOrderInCategory(DefaultItemOrderChromium.PASTE()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) @@ -469,7 +516,7 @@ public class SelectActionMenuHelper { return new SelectionMenuItem.Builder(context.getString(R.string.actionbar_share)) .setId(R.id.select_action_menu_share) .setIconAttr(android.R.attr.actionModeShareDrawable) - .setOrderInCategory(DefaultItemOrder.SHARE) + .setOrderInCategory(DefaultItemOrderChromium.SHARE()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) @@ -481,7 +528,7 @@ public class SelectActionMenuHelper { .setId(R.id.select_action_menu_select_all) .setIconAttr(android.R.attr.actionModeSelectAllDrawable) .setAlphabeticShortcut(ItemKeyShortcuts.SELECT_ALL) - .setOrderInCategory(DefaultItemOrder.SELECT_ALL) + .setOrderInCategory(DefaultItemOrderChromium.SELECT_ALL()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) @@ -494,7 +541,7 @@ public class SelectActionMenuHelper { SelectionMenuItem.Builder builder = new SelectionMenuItem.Builder(android.R.string.paste_as_plain_text) .setId(R.id.select_action_menu_paste_as_plain_text) - .setOrderInCategory(DefaultItemOrder.PASTE_AS_PLAIN_TEXT) + .setOrderInCategory(DefaultItemOrderChromium.PASTE_AS_PLAIN_TEXT()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled); @@ -514,7 +561,7 @@ public class SelectActionMenuHelper { return new SelectionMenuItem.Builder(context.getString(R.string.actionbar_web_search)) .setId(R.id.select_action_menu_web_search) .setIconAttr(android.R.attr.actionModeWebSearchDrawable) - .setOrderInCategory(DefaultItemOrder.WEB_SEARCH) + .setOrderInCategory(DefaultItemOrderChromium.WEB_SEARCH()) .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) 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 @@ -17,6 +17,7 @@ import org.jni_zero.CalledByNative; import org.jni_zero.JNINamespace; import org.jni_zero.NativeMethods; +import org.chromium.base.ContextUtils; import org.chromium.content_public.browser.SelectAroundCaretResult; import org.chromium.content_public.browser.SelectionClient; import org.chromium.content_public.browser.SelectionEventProcessor; @@ -69,6 +70,9 @@ public class SmartSelectionClient implements SelectionClient { return null; } + if (!ContextUtils.getAppSharedPreferences().getBoolean( + "selection_popup_smart_text", false)) return null; + return new SmartSelectionClient(callback, webContents); } --