diff --git a/build/patches/00Add-setting-to-invert-tap-and-long-tap.patch b/build/patches/00Add-setting-to-invert-tap-and-long-tap.patch index 2bd4d7d5..587b7baf 100644 --- a/build/patches/00Add-setting-to-invert-tap-and-long-tap.patch +++ b/build/patches/00Add-setting-to-invert-tap-and-long-tap.patch @@ -5,6 +5,7 @@ Subject: Add setting to invert tap and long tap Reverses single tap to long tap in android for accessibility reasons. The feature can be activated from the accessibility settings. +Need: bromite-build-utils.patch License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- chrome/android/java/res/values/ids.xml | 1 + @@ -46,7 +47,7 @@ diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/va diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java -@@ -126,6 +126,24 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting +@@ -130,6 +130,24 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting mSnackbarManager.showSnackbar(mSnackbar); } @@ -58,7 +59,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/s + + @Override + public void setEnabled(boolean value) { -+ CachedFeatureFlags.setFlagEnabled(ChromeFeatureList.SHOW_ALWAYS_CONTEXT_MENU_ON_LINKS, ++ CromiteNativeUtils.setFlagEnabled(ChromeFeatureList.SHOW_ALWAYS_CONTEXT_MENU_ON_LINKS, + "show-always-context-menu-on-links", value); + } + } diff --git a/build/patches/Move-navigation-bar-to-bottom.patch b/build/patches/Move-navigation-bar-to-bottom.patch index 4c1e734e..17eac27f 100644 --- a/build/patches/Move-navigation-bar-to-bottom.patch +++ b/build/patches/Move-navigation-bar-to-bottom.patch @@ -9,6 +9,7 @@ The bottom bar will also be colored as the navigation bar to make the interface more pleasant and fixes upstream bug 1285311. Support for tablet mode is also included. +Need: bromite-build-utils.patch Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- @@ -25,7 +26,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../tab_management/TabListCoordinator.java | 81 +++++++++++++++++++ .../tab_management/TabListRecyclerView.java | 19 ++++- .../tab_management/TabSwitcherMediator.java | 16 ++++ - .../ChromeAccessibilitySettingsDelegate.java | 52 ++++++++++++ + .../ChromeAccessibilitySettingsDelegate.java | 50 ++++++++++++ .../chrome/browser/app/ChromeActivity.java | 13 +++ .../compositor/CompositorViewHolder.java | 9 +++ .../layouts/LayoutManagerChrome.java | 18 ++++- @@ -56,7 +57,6 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html chrome/browser/flag_descriptions.cc | 4 + chrome/browser/flag_descriptions.h | 3 + .../flags/android/chrome_feature_list.cc | 2 + - .../browser/flags/CachedFeatureFlags.java | 18 +++++ .../chrome/browser/flags/CachedFlag.java | 6 ++ .../browser/flags/ChromeFeatureList.java | 5 ++ chrome/browser/prefs/browser_prefs.cc | 2 +- @@ -64,11 +64,11 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../ui/appmenu/AppMenuHandlerImpl.java | 11 +++ .../omnibox/LocationBarCoordinator.java | 6 +- ...mniboxSuggestionsDropdownEmbedderImpl.java | 14 +++- - .../browser/omnibox/UrlBarCoordinator.java | 10 +++ + .../browser/omnibox/UrlBarCoordinator.java | 9 +++ .../suggestions/AutocompleteCoordinator.java | 16 +++- .../suggestions/AutocompleteMediator.java | 7 +- .../DropdownItemViewInfoListManager.java | 15 +++- - .../OmniboxSuggestionsDropdown.java | 31 ++++++- + .../OmniboxSuggestionsDropdown.java | 39 ++++++++- .../OmniboxSuggestionsDropdownEmbedder.java | 9 +++ .../strings/android_chrome_strings.grd | 6 ++ chrome/browser/ui/android/toolbar/BUILD.gn | 1 + @@ -87,7 +87,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../accessibility/AccessibilitySettings.java | 16 ++++ .../AccessibilitySettingsDelegate.java | 6 ++ .../render_widget_host_view_android.cc | 3 + - 75 files changed, 884 insertions(+), 63 deletions(-) + 74 files changed, 871 insertions(+), 63 deletions(-) diff --git a/cc/base/features.cc b/cc/base/features.cc --- a/cc/base/features.cc @@ -633,13 +633,11 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java -@@ -15,6 +15,14 @@ import org.chromium.components.browser_ui.accessibility.PageZoomUtils; - import org.chromium.components.user_prefs.UserPrefs; - import org.chromium.content_public.browser.BrowserContextHandle; +@@ -21,6 +21,12 @@ import org.chromium.chrome.browser.flags.CromiteNativeUtils; + import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; + import org.chromium.chrome.browser.preferences.SharedPreferencesManager; +import android.app.Activity; -+import org.chromium.chrome.browser.flags.ChromeFeatureList; -+import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; +import org.chromium.chrome.browser.ui.messages.snackbar.INeedSnackbarManager; +import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar; @@ -648,7 +646,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/s /** The Chrome implementation of AccessibilitySettingsDelegate. */ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySettingsDelegate { private static class ReaderForAccessibilityDelegate implements BooleanPreferenceDelegate { -@@ -35,6 +43,12 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting +@@ -41,6 +47,12 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting } } @@ -661,7 +659,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/s private final Profile mProfile; /** -@@ -74,6 +88,44 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting +@@ -80,6 +92,44 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting return new ForceTabletUIDelegate(); } @@ -673,7 +671,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/s + + @Override + public void setEnabled(boolean value) { -+ CachedFeatureFlags.setFlagEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM, ++ CromiteNativeUtils.setFlagEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM, + "move-top-toolbar-to-bottom", value); + } + } @@ -1754,41 +1752,6 @@ diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browse &kNotificationPermissionVariant, &kNotificationPermissionBottomSheet, &kOfflineIndicatorV2, -diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java ---- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java -+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java -@@ -188,6 +188,23 @@ public class CachedFeatureFlags { - return value; - } - -+ /** -+ * Allows the modification of the flag value on the java side. -+ * Currently only the feature flag with on / off values is managed. -+ * -+ * @param featureName the feature name from ChromeFeatureList. -+ * @param flagName the flag name name from about_flags.cc. -+ */ -+ public static void setFlagEnabled(String featureName, String flagName, Boolean newValue) { -+ CachedFeatureFlagsJni.get().setEnabled(flagName, newValue); -+ -+ CachedFlag cachedFlag = ChromeFeatureList.sAllCachedFlags.get(featureName); -+ String preferenceName = cachedFlag.getSharedPreferenceKey(); -+ -+ SharedPreferencesManager.getInstance().writeBoolean(preferenceName, newValue); -+ cachedFlag.setValueReturnedOverride(newValue); -+ } -+ - @AnyThread - static double getConsistentDoubleValue(String preferenceName, double defaultValue) { - CachedFlagsSafeMode.getInstance().onFlagChecked(); -@@ -235,6 +252,7 @@ public class CachedFeatureFlags { - - @NativeMethods - interface Natives { -+ void setEnabled(String featureName, boolean newValue); - void setAdBlockFiltersURL(String url); - String getAdBlockFiltersURL(); - } diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlag.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlag.java --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlag.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlag.java @@ -2027,26 +1990,25 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java -@@ -25,6 +25,9 @@ import org.chromium.ui.modelutil.PropertyModelChangeProcessor; +@@ -25,6 +25,10 @@ import org.chromium.ui.modelutil.PropertyModelChangeProcessor; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; ++import android.view.WindowManager; + /** * Coordinates the interactions with the UrlBar text component. */ -@@ -234,6 +237,13 @@ public class UrlBarCoordinator implements UrlBarEditingTextStateProvider, UrlFoc +@@ -234,6 +238,11 @@ public class UrlBarCoordinator implements UrlBarEditingTextStateProvider, UrlFoc // to show or hide keyboard anyway. This may happen when we schedule keyboard hide, and // receive a second request to hide the keyboard instantly. if (showKeyboard) { + if (ChromeFeatureList.sMoveTopToolbarToBottom.isEnabled()) { + // probably due to an android bug, fix the size rather than pan the view. + // with the pan the bar may not always follow the focus if not at the first input by the user -+ setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE, /* delay */ false); -+ } else { -+ setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN, /* delay */ false); ++ mWindowDelegate.setWindowSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + } mKeyboardVisibilityDelegate.showKeyboard(mUrlBar); } else { @@ -2179,17 +2141,18 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java -@@ -35,6 +35,9 @@ import org.chromium.chrome.browser.util.KeyNavigationUtil; +@@ -35,6 +35,10 @@ import org.chromium.chrome.browser.util.KeyNavigationUtil; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.ui.base.ViewUtils; ++import android.graphics.Rect; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; + /** A widget for showing a list of omnibox suggestions. */ public class OmniboxSuggestionsDropdown extends RecyclerView { /** -@@ -188,7 +191,8 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { +@@ -188,7 +192,8 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { * Constructs a new list designed for containing omnibox suggestions. * @param context Context used for contained views. */ @@ -2199,7 +2162,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow super(context, null, android.R.attr.dropDownListViewStyle); setFocusable(true); setFocusableInTouchMode(true); -@@ -199,13 +203,25 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { +@@ -199,13 +204,25 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { setItemAnimator(null); mLayoutScrollListener = new SuggestionLayoutScrollListener(context); @@ -2226,7 +2189,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow ViewCompat.setPaddingRelative(this, 0, 0, 0, paddingBottom); mStandardBgColor = shouldShowModernizeVisualUpdate -@@ -340,8 +356,15 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { +@@ -340,8 +357,16 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { try (TraceEvent tracing = TraceEvent.scoped("OmniboxSuggestionsList.Measure"); TimingMetric metric = OmniboxMetrics.recordSuggestionListMeasureTime()) { OmniboxAlignment omniboxAlignment = mEmbedder.getCurrentAlignment(); @@ -2237,13 +2200,27 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow + top = 0; + } + maybeUpdateLayoutParams(top); -+ boolean useAlignmentSpecifiedHeight = false; ++ boolean useAlignmentSpecifiedHeight = ++ !ChromeFeatureList.sMoveTopToolbarToBottom.isEnabled(); + int availableViewportHeight = useAlignmentSpecifiedHeight + ? omniboxAlignment.height + : calculateAvailableViewportHeight() - top; int desiredWidth = omniboxAlignment.width; adjustHorizontalPosition(); notifyObserversIfViewportHeightChanged(availableViewportHeight); +@@ -353,6 +378,12 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { + } + } + ++ private int calculateAvailableViewportHeight() { ++ Rect mTempRect = new Rect(); ++ mEmbedder.getWindowDelegate().getWindowVisibleDisplayFrame(mTempRect); ++ return mTempRect.height(); ++ } ++ + private void maybeUpdateLayoutParams(int topMargin) { + // Update the layout params to ensure the parent correctly positions the suggestions + // under the anchor view. diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java diff --git a/build/patches/bromite-build-utils.patch b/build/patches/bromite-build-utils.patch index 975d8919..f0dfa344 100644 --- a/build/patches/bromite-build-utils.patch +++ b/build/patches/bromite-build-utils.patch @@ -3,23 +3,31 @@ Date: Fri, 9 Jun 2023 15:11:46 +0000 Subject: bromite build utils --- - build/android/gyp/java_cpp_enum.py | 36 ++++++-- - build/android/gyp/util/build_utils.py | 25 +++++- - build/bromite/bromite_utils.gni | 69 ++++++++++++++ - build/bromite/gyp/cpp_bromite_include.py | 35 ++++++++ - build/bromite/gyp/cpp_bromite_include.pydeps | 9 ++ - build/bromite/gyp/java_bromite_impl.py | 94 ++++++++++++++++++++ - build/bromite/gyp/java_bromite_impl.pydeps | 9 ++ - build/config/BUILDCONFIG.gn | 1 + - build/config/android/rules.gni | 6 +- - tools/grit/grit/grd_reader.py | 27 ++++-- - tools/grit/preprocess_if_expr.py | 32 ++++++- - 11 files changed, 329 insertions(+), 14 deletions(-) + build/android/gyp/java_cpp_enum.py | 36 +++++-- + build/android/gyp/util/build_utils.py | 25 ++++- + build/bromite/bromite_utils.gni | 69 ++++++++++++++ + build/bromite/gyp/cpp_bromite_include.py | 35 +++++++ + build/bromite/gyp/cpp_bromite_include.pydeps | 9 ++ + build/bromite/gyp/java_bromite_impl.py | 94 +++++++++++++++++++ + build/bromite/gyp/java_bromite_impl.pydeps | 9 ++ + build/config/BUILDCONFIG.gn | 1 + + build/config/android/rules.gni | 6 +- + .../ChromeAccessibilitySettingsDelegate.java | 6 ++ + chrome/browser/flags/BUILD.gn | 10 +- + .../flags/android/cromite_native_utils.cc | 27 ++++++ + .../flags/android/cromite_native_utils.h | 14 +++ + .../browser/flags/CromiteNativeUtils.java | 32 +++++++ + tools/grit/grit/grd_reader.py | 27 +++++- + tools/grit/preprocess_if_expr.py | 32 ++++++- + 16 files changed, 416 insertions(+), 16 deletions(-) create mode 100644 build/bromite/bromite_utils.gni create mode 100644 build/bromite/gyp/cpp_bromite_include.py create mode 100644 build/bromite/gyp/cpp_bromite_include.pydeps create mode 100644 build/bromite/gyp/java_bromite_impl.py create mode 100644 build/bromite/gyp/java_bromite_impl.pydeps + create mode 100755 chrome/browser/flags/android/cromite_native_utils.cc + create mode 100755 chrome/browser/flags/android/cromite_native_utils.h + create mode 100755 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java diff --git a/build/android/gyp/java_cpp_enum.py b/build/android/gyp/java_cpp_enum.py --- a/build/android/gyp/java_cpp_enum.py @@ -425,6 +433,144 @@ diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni outputs = [ _srcjar_path ] } } +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java +@@ -15,6 +15,12 @@ import org.chromium.components.browser_ui.accessibility.PageZoomUtils; + import org.chromium.components.user_prefs.UserPrefs; + import org.chromium.content_public.browser.BrowserContextHandle; + ++import org.chromium.chrome.browser.flags.ChromeFeatureList; ++import org.chromium.chrome.browser.flags.CachedFeatureFlags; ++import org.chromium.chrome.browser.flags.CromiteNativeUtils; ++import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; ++import org.chromium.chrome.browser.preferences.SharedPreferencesManager; ++ + /** The Chrome implementation of AccessibilitySettingsDelegate. */ + public class ChromeAccessibilitySettingsDelegate implements AccessibilitySettingsDelegate { + private static class ReaderForAccessibilityDelegate implements BooleanPreferenceDelegate { +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 +@@ -5,7 +5,8 @@ + import("//build/config/android/rules.gni") + + android_library("java") { +- sources = [ ++ sources = [ "android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java" ] ++ sources += [ + "android/java/src/org/chromium/chrome/browser/flags/AllCachedFieldTrialParameters.java", + "android/java/src/org/chromium/chrome/browser/flags/BooleanCachedFieldTrialParameter.java", + "android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java", +@@ -41,7 +42,8 @@ android_library("java") { + } + + generate_jni("jni_headers") { +- sources = [ ++ sources = [ "android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java" ] ++ sources += [ + "android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureMap.java", + "android/java/src/org/chromium/chrome/browser/flags/ChromeSessionState.java", + ] +@@ -49,6 +51,10 @@ generate_jni("jni_headers") { + + static_library("flags_android") { + sources = [ ++ "android/cromite_native_utils.cc", ++ "android/cromite_native_utils.h", ++ ] ++ sources += [ + "android/chrome_session_state.cc", + "android/chrome_session_state.h", + ] +diff --git a/chrome/browser/flags/android/cromite_native_utils.cc b/chrome/browser/flags/android/cromite_native_utils.cc +new file mode 100755 +--- /dev/null ++++ b/chrome/browser/flags/android/cromite_native_utils.cc +@@ -0,0 +1,27 @@ ++#include "chrome/browser/flags/android/cromite_native_utils.h" ++ ++#include "chrome/browser/browser_process.h" ++#include "chrome/browser/flags/jni_headers/CromiteNativeUtils_jni.h" ++#include "components/flags_ui/pref_service_flags_storage.h" ++ ++#include "base/android/jni_string.h" ++ ++using base::android::JavaParamRef; ++ ++static void JNI_CromiteNativeUtils_SetEnabled(JNIEnv* env, ++ const JavaParamRef& featureName, jboolean isEnabled) { ++ flags_ui::PrefServiceFlagsStorage flags_storage( ++ g_browser_process->local_state()); ++ std::set entries = flags_storage.GetFlags(); ++ ++ auto internal_name = base::android::ConvertJavaStringToUTF8(env, featureName); ++ entries.erase(internal_name); ++ entries.erase(internal_name + "@1"); // enabled ++ entries.erase(internal_name + "@2"); // disabled ++ ++ if (isEnabled) ++ entries.insert(internal_name + "@1"); ++ ++ flags_storage.SetFlags(entries); ++ flags_storage.CommitPendingWrites(); ++} +diff --git a/chrome/browser/flags/android/cromite_native_utils.h b/chrome/browser/flags/android/cromite_native_utils.h +new file mode 100755 +--- /dev/null ++++ b/chrome/browser/flags/android/cromite_native_utils.h +@@ -0,0 +1,14 @@ ++#ifndef CHROME_BROWSER_FLAGS_ANDROID_CROMITE_NATIVE_UTILS_H_ ++#define CHROME_BROWSER_FLAGS_ANDROID_CROMITE_NATIVE_UTILS_H_ ++ ++#include ++ ++#include "base/feature_list.h" ++ ++namespace chrome { ++namespace android { ++ ++} // namespace android ++} // namespace chrome ++ ++#endif // CHROME_BROWSER_FLAGS_ANDROID_CROMITE_NATIVE_UTILS_H_ +diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java +new file mode 100755 +--- /dev/null ++++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java +@@ -0,0 +1,32 @@ ++package org.chromium.chrome.browser.flags; ++ ++import org.chromium.chrome.browser.flags.ChromeFeatureList; ++import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; ++import org.chromium.chrome.browser.preferences.SharedPreferencesManager; ++ ++import org.chromium.base.annotations.CalledByNative; ++import org.chromium.base.annotations.NativeMethods; ++ ++public class CromiteNativeUtils { ++ /** ++ * Allows the modification of the flag value on the java side. ++ * Currently only the feature flag with on / off values is managed. ++ * ++ * @param featureName the feature name from ChromeFeatureList. ++ * @param flagName the flag name name from about_flags.cc. ++ */ ++ public static void setFlagEnabled(String featureName, String flagName, Boolean newValue) { ++ CromiteNativeUtilsJni.get().setEnabled(flagName, newValue); ++ ++ CachedFlag cachedFlag = ChromeFeatureList.sAllCachedFlags.get(featureName); ++ String preferenceName = cachedFlag.getSharedPreferenceKey(); ++ ++ SharedPreferencesManager.getInstance().writeBoolean(preferenceName, newValue); ++ cachedFlag.setValueReturnedOverride(newValue); ++ } ++ ++ @NativeMethods ++ interface Natives { ++ void setEnabled(String featureName, boolean newValue); ++ } ++} diff --git a/tools/grit/grit/grd_reader.py b/tools/grit/grit/grd_reader.py --- a/tools/grit/grit/grd_reader.py +++ b/tools/grit/grit/grd_reader.py