diff --git a/build/cromite_patches_list.txt b/build/cromite_patches_list.txt index d6461da6..70d83939 100644 --- a/build/cromite_patches_list.txt +++ b/build/cromite_patches_list.txt @@ -275,6 +275,8 @@ Timezone-customization.patch 00Use-list-mode-for-tab-switcher.patch 00Chrome-web-store-protection.patch 00Enable-search-engine-settings-desktop-ui.patch +00Disable-Android-AppRestrictions.patch +00Customize-selection-popup.patch 00Temp-PerformanceNavigationTiming-privacy-fix.patch 00Temp-disable-predictive-back-gesture.patch diff --git a/build/patches/00Customize-selection-popup.patch b/build/patches/00Customize-selection-popup.patch new file mode 100644 index 00000000..2d34a44f --- /dev/null +++ b/build/patches/00Customize-selection-popup.patch @@ -0,0 +1,416 @@ +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 +--- + .../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 | 121 +++++++++++++----- + .../selection/SmartSelectionClient.java | 4 + + 7 files changed, 177 insertions(+), 37 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/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 +@@ -658,10 +658,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 +@@ -58,4 +58,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 +@@ -24,6 +24,7 @@ import androidx.annotation.RequiresApi; + import androidx.annotation.VisibleForTesting; + + 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; +@@ -45,28 +46,84 @@ import java.util.PriorityQueue; + 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.SHARE, DefaultItemOrder.SELECT_ALL, +- DefaultItemOrder.PASTE_AS_PLAIN_TEXT, DefaultItemOrder.WEB_SEARCH}) +- public @interface DefaultItemOrder { +- int CUT = 1; +- int COPY = 2; +- int PASTE = 3; +- int SHARE = 4; +- int SELECT_ALL = 5; +- int PASTE_AS_PLAIN_TEXT = 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) +@@ -127,7 +184,7 @@ public class SelectActionMenuHelper { + if (nonSelectionAdditionalItemProvider != null + && !nonSelectionAdditionalItemProvider.getItems().isEmpty()) { + SelectionMenuGroup additionalItemGroup = +- new SelectionMenuGroup(Menu.NONE, GroupItemOrder.DEFAULT_ITEMS + 1); ++ new SelectionMenuGroup(Menu.NONE, GroupItemOrderChromium.DEFAULT_ITEMS() + 1); + additionalItemGroup.addItems(nonSelectionAdditionalItemProvider.getItems()); + pasteMenuItems.add(additionalItemGroup); + } +@@ -177,7 +234,7 @@ public class SelectActionMenuHelper { + return null; + } + 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; +@@ -196,7 +253,7 @@ public class SelectActionMenuHelper { + + private static SelectionMenuGroup getDefaultItems(SelectActionMenuDelegate delegate) { + SelectionMenuGroup defaultGroup = new SelectionMenuGroup( +- R.id.select_action_menu_default_items, GroupItemOrder.DEFAULT_ITEMS); ++ R.id.select_action_menu_default_items, GroupItemOrderChromium.DEFAULT_ITEMS()); + defaultGroup.addItem(cut(delegate.canCut())); + defaultGroup.addItem(copy(delegate.canCopy())); + defaultGroup.addItem(paste(delegate.canPaste())); +@@ -239,7 +296,7 @@ public class SelectActionMenuHelper { + // We have to use android.R.id.textAssist as group id to make framework show icons for + // 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; +@@ -276,7 +333,7 @@ public class SelectActionMenuHelper { + } + SelectionMenuGroup textProcessingItems = + new SelectionMenuGroup(R.id.select_action_menu_text_processing_items, +- GroupItemOrder.TEXT_PROCESSING_ITEMS); ++ GroupItemOrderChromium.TEXT_PROCESSING_ITEMS()); + final PackageManager packageManager = context.getPackageManager(); + for (int i = 0; i < supportedActivities.size(); i++) { + ResolveInfo resolveInfo = supportedActivities.get(i); +@@ -346,7 +403,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) +@@ -359,7 +416,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) +@@ -372,7 +429,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) +@@ -384,7 +441,7 @@ public class SelectActionMenuHelper { + return new SelectionMenuItem.Builder(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) +@@ -397,7 +454,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) +@@ -409,7 +466,7 @@ public class SelectActionMenuHelper { + private static SelectionMenuItem pasteAsPlainText(boolean isEnabled) { + return 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) +@@ -420,7 +477,7 @@ public class SelectActionMenuHelper { + return new SelectionMenuItem.Builder(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); + } + +-- +2.25.1 diff --git a/build/patches/00Disable-Android-AppRestrictions.patch b/build/patches/00Disable-Android-AppRestrictions.patch new file mode 100644 index 00000000..7a69914d --- /dev/null +++ b/build/patches/00Disable-Android-AppRestrictions.patch @@ -0,0 +1,131 @@ +From: uazo +Date: Fri, 5 Jan 2024 17:02:29 +0000 +Subject: Disable Android AppRestrictions + +License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html +--- + chrome/browser/flags/BUILD.gn | 1 + + .../cromite/sEnableAndroidAppRestriction.java | 38 +++++++++++++++++++ + .../policy/AppRestrictionsProvider.java | 8 ++++ + .../DisableAndroidAppRestriction.inc | 13 +++++++ + .../disable-android-app-restriction.inc | 3 ++ + .../disable-android-app-restriction.inc | 1 + + 6 files changed, 64 insertions(+) + create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sEnableAndroidAppRestriction.java + create mode 100644 cromite_flags/chrome/browser/about_flags_cc/DisableAndroidAppRestriction.inc + create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/disable-android-app-restriction.inc + create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/disable-android-app-restriction.inc + +diff --git a/chrome/browser/flags/BUILD.gn b/chrome/browser/flags/BUILD.gn +--- a/chrome/browser/flags/BUILD.gn ++++ b/chrome/browser/flags/BUILD.gn +@@ -35,6 +35,7 @@ android_library("java") { + "//build:chromeos_buildflags", + "//build/android:build_java", + "//chrome/browser/preferences:java", ++ "//components/policy/android:policy_java", + "//components/version_info/android:version_constants_java", + "//third_party/android_deps:guava_android_java", + "//third_party/androidx:androidx_annotation_annotation_java", +diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sEnableAndroidAppRestriction.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sEnableAndroidAppRestriction.java +new file mode 100644 +--- /dev/null ++++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sEnableAndroidAppRestriction.java +@@ -0,0 +1,38 @@ ++/* ++ This file is part of Cromite. ++ ++ Cromite is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Cromite is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Cromite. If not, see . ++*/ ++ ++package org.chromium.chrome.browser.flags.cromite; ++ ++import org.chromium.chrome.browser.flags.CachedFlag; ++import org.chromium.components.policy.AppRestrictionsProvider; ++ ++public class sEnableAndroidAppRestriction { ++ private static boolean initialized_ = false; ++ ++ private static final CachedFlag sInstance = ++ new CachedFlag("EnableAndroidAppRestriction", false); ++ ++ private sEnableAndroidAppRestriction() {} ++ ++ public static CachedFlag getInstance() { ++ if (!initialized_) { ++ initialized_ = true; ++ AppRestrictionsProvider.setEnabled(sInstance.isEnabled()); ++ } ++ return sInstance; ++ } ++} +diff --git a/components/policy/android/java/src/org/chromium/components/policy/AppRestrictionsProvider.java b/components/policy/android/java/src/org/chromium/components/policy/AppRestrictionsProvider.java +--- a/components/policy/android/java/src/org/chromium/components/policy/AppRestrictionsProvider.java ++++ b/components/policy/android/java/src/org/chromium/components/policy/AppRestrictionsProvider.java +@@ -17,6 +17,11 @@ import org.chromium.base.Log; + */ + public class AppRestrictionsProvider extends AbstractAppRestrictionsProvider { + private static final String TAG = "AppResProvider"; ++ private static boolean mEnabled = false; ++ ++ public static void setEnabled(boolean value) { ++ mEnabled = value; ++ } + + /** + * Get the app restriction information from provided user manager, and record some timing +@@ -28,6 +33,9 @@ public class AppRestrictionsProvider extends AbstractAppRestrictionsProvider { + */ + public static Bundle getApplicationRestrictionsFromUserManager( + UserManager userManager, String packageName) { ++ if (!mEnabled) { ++ return new Bundle(); ++ } + try { + Bundle bundle = userManager.getApplicationRestrictions(packageName); + Log.i(TAG, "#getApplicationRestrictionsFromUserManager() " + bundle); +diff --git a/cromite_flags/chrome/browser/about_flags_cc/DisableAndroidAppRestriction.inc b/cromite_flags/chrome/browser/about_flags_cc/DisableAndroidAppRestriction.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/chrome/browser/about_flags_cc/DisableAndroidAppRestriction.inc +@@ -0,0 +1,13 @@ ++#ifdef FLAG_SECTION ++ ++#if BUILDFLAG(IS_ANDROID) ++ ++ {"enable-android-apprestrictions", ++ "Enable AppRestrictions", ++ "Does not allow loading of policies in android via AppRestrictions.", ++ kOsAndroid, ++ FEATURE_VALUE_TYPE(chrome::android::kEnableAndroidAppRestriction)}, ++ ++#endif ++ ++#endif +diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/disable-android-app-restriction.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/disable-android-app-restriction.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/disable-android-app-restriction.inc +@@ -0,0 +1,3 @@ ++CROMITE_FEATURE(kEnableAndroidAppRestriction, ++ "EnableAndroidAppRestriction", ++ base::FEATURE_DISABLED_BY_DEFAULT); +diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/disable-android-app-restriction.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/disable-android-app-restriction.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/disable-android-app-restriction.inc +@@ -0,0 +1 @@ ++BASE_DECLARE_FEATURE(kEnableAndroidAppRestriction); +-- +2.25.1