From 2eeef317b6f7e4e27166bad31802d5650827e4bf Mon Sep 17 00:00:00 2001 From: Carmelo Messina Date: Wed, 9 Oct 2024 17:36:55 +0200 Subject: [PATCH] Use browser navigation handler: added a flag in the settings to restore the pre-A12 navigation mode. (new patch). Pulling the edge to the right will go backwards, pulling it further forwards. --- build/cromite_patches_list.txt | 1 + .../Use-browser-navigation-handler.patch | 345 ++++++++++++++++++ 2 files changed, 346 insertions(+) create mode 100644 build/patches/Use-browser-navigation-handler.patch diff --git a/build/cromite_patches_list.txt b/build/cromite_patches_list.txt index 04823b16..64109c12 100644 --- a/build/cromite_patches_list.txt +++ b/build/cromite_patches_list.txt @@ -291,6 +291,7 @@ Bubble-Locking-on-UI-DevTools.patch Add-a-GN-flag-to-disable-trybot-verification.patch Override-the-MV2-deprecation.patch Remove-sideloading-of-version-dll.patch +Use-browser-navigation-handler.patch Cromite-Branding--improve-settings-ui.patch # temporary or wip patches diff --git a/build/patches/Use-browser-navigation-handler.patch b/build/patches/Use-browser-navigation-handler.patch new file mode 100644 index 00000000..d9098ac9 --- /dev/null +++ b/build/patches/Use-browser-navigation-handler.patch @@ -0,0 +1,345 @@ +From: uazo +Date: Sat, 21 Sep 2024 15:32:02 +0000 +Subject: Use browser navigation handler + +Added a flag in the settings to restore the pre-A12 navigation mode. +Pulling the edge to the right will go backwards, pulling it further forwards. + +License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html +--- + .../compositor/CompositorViewHolder.java | 9 ++++- + .../GestureNavigationProperties.java | 4 +-- + .../GestureNavigationViewBinder.java | 6 ++-- + .../HistoryNavigationCoordinator.java | 4 +++ + .../gesturenav/HistoryNavigationLayout.java | 6 ++-- + .../browser/gesturenav/NavigationHandler.java | 12 +++++-- + .../browser/gesturenav/SideSlideLayout.java | 25 +++++++++++--- + .../cromite/sUseBrowserNavigationHandler.java | 33 +++++++++++++++++++ + .../Use-browser-navigation-handler.grdp | 12 +++++++ + .../res/xml/accessibility_preferences.xml | 9 +++++ + .../Use-browser-navigation-handler.inc | 12 +++++++ + .../Use-browser-navigation-handler.inc | 3 ++ + .../Use-browser-navigation-handler.inc | 1 + + 13 files changed, 119 insertions(+), 17 deletions(-) + create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sUseBrowserNavigationHandler.java + create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Use-browser-navigation-handler.grdp + create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Use-browser-navigation-handler.inc + create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Use-browser-navigation-handler.inc + create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Use-browser-navigation-handler.inc + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +@@ -51,6 +51,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManagerHost; + import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl; + import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; + import org.chromium.chrome.browser.flags.ChromeFeatureList; ++import org.chromium.chrome.browser.flags.cromite.sUseBrowserNavigationHandler; + import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; + import org.chromium.chrome.browser.fullscreen.FullscreenManager; + import org.chromium.chrome.browser.layouts.EventFilter.EventType; +@@ -96,6 +97,7 @@ import org.chromium.ui.resources.dynamics.DynamicResourceLoader; + import org.chromium.url.GURL; + + import java.util.ArrayList; ++import java.util.Collections; + import java.util.HashSet; + import java.util.List; + import java.util.Set; +@@ -1322,7 +1324,12 @@ public class CompositorViewHolder extends FrameLayout + protected void onLayout(boolean changed, int l, int t, int r, int b) { + if (changed) onViewportChanged(); + super.onLayout(changed, l, t, r, b); +- ++ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && ++ sUseBrowserNavigationHandler.getInstance().isEnabled()) { ++ setSystemGestureExclusionRects( ++ Collections.singletonList( ++ new Rect(0, 0, Math.abs(r - l), Math.abs(t - b)))); ++ } + invalidateAccessibilityProvider(); + } + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationProperties.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationProperties.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationProperties.java +@@ -17,7 +17,7 @@ class GestureNavigationProperties { + /** + * Gesture navigation direction. {@code true} for forward navigation, {@code false} for back. + */ +- static final WritableBooleanPropertyKey DIRECTION = new WritableBooleanPropertyKey(); ++ static final WritableBooleanPropertyKey CANFORWARD = new WritableBooleanPropertyKey(); + + /** Gesture navigation edge as defined in {@link BackGestureEventSwipeEdge}. */ + static final WritableIntPropertyKey EDGE = new WritableIntPropertyKey(); +@@ -39,6 +39,6 @@ class GestureNavigationProperties { + static final WritableIntPropertyKey CLOSE_INDICATOR = new WritableIntPropertyKey(); + + static final PropertyKey[] ALL_KEYS = { +- ACTION, DIRECTION, EDGE, ALLOW_NAV, BUBBLE_OFFSET, CLOSE_INDICATOR ++ ACTION, CANFORWARD, EDGE, ALLOW_NAV, BUBBLE_OFFSET, CLOSE_INDICATOR + }; + } +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationViewBinder.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationViewBinder.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationViewBinder.java +@@ -8,7 +8,7 @@ import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties + import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.ALLOW_NAV; + import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.BUBBLE_OFFSET; + import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.CLOSE_INDICATOR; +-import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.DIRECTION; ++import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.CANFORWARD; + import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.EDGE; + + import android.view.View; +@@ -32,8 +32,8 @@ class GestureNavigationViewBinder { + } else if (ACTION == key) { + switch (model.get(ACTION)) { + case GestureAction.SHOW_ARROW: +- topView.showBubble( +- model.get(DIRECTION), model.get(EDGE), model.get(CLOSE_INDICATOR)); ++ topView.showBubble2( ++ model.get(CANFORWARD), model.get(EDGE), model.get(CLOSE_INDICATOR)); + break; + case GestureAction.RELEASE_BUBBLE: + topView.releaseBubble(model.get(ALLOW_NAV)); +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator.java +@@ -12,6 +12,7 @@ import androidx.annotation.Nullable; + + import org.chromium.base.supplier.ObservableSupplier; + import org.chromium.base.supplier.Supplier; ++import org.chromium.chrome.browser.flags.cromite.sUseBrowserNavigationHandler; + import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; + import org.chromium.chrome.browser.lifecycle.PauseResumeWithNativeObserver; + import org.chromium.chrome.browser.tab.CurrentTabObserver; +@@ -159,6 +160,9 @@ public class HistoryNavigationCoordinator + * @return {@code} true if the feature is enabled. + */ + private boolean isFeatureEnabled() { ++ if (sUseBrowserNavigationHandler.getInstance().isEnabled()) { ++ return true; ++ } + if (mForceFeatureEnabledForTesting) { + return true; + } +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationLayout.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationLayout.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationLayout.java +@@ -68,8 +68,8 @@ class HistoryNavigationLayout extends FrameLayout implements ViewGroup.OnHierarc + * @param initiatingEdge Which edge of the screen the gesture is navigating from. + * @param closeIndicator + */ +- void showBubble( +- boolean forward, ++ void showBubble2( ++ boolean canForward, + @BackGestureEventSwipeEdge int initiatingEdge, + @CloseTarget int closeIndicator) { + if (mSideSlideLayout == null) { +@@ -87,7 +87,7 @@ class HistoryNavigationLayout extends FrameLayout implements ViewGroup.OnHierarc + }); + } + mSideSlideLayout.setEnabled(true); +- mSideSlideLayout.setDirection(forward); ++ mSideSlideLayout.setDirection2(canForward); + mSideSlideLayout.setInitiatingEdge(initiatingEdge); + mSideSlideLayout.setCloseIndicator(closeIndicator); + attachLayoutIfNecessary(); +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java +@@ -8,7 +8,7 @@ import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties + import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.ALLOW_NAV; + import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.BUBBLE_OFFSET; + import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.CLOSE_INDICATOR; +-import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.DIRECTION; ++import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.CANFORWARD; + import static org.chromium.chrome.browser.gesturenav.GestureNavigationProperties.EDGE; + + import android.app.Activity; +@@ -233,15 +233,21 @@ class NavigationHandler implements TouchEventObserver { + + mInitiatingEdge = initiatingEdge; + +- boolean forward = mInitiatingEdge == BackGestureEventSwipeEdge.RIGHT; ++ boolean forward = false; ++ @BackGestureEventSwipeEdge int edge = BackGestureEventSwipeEdge.RIGHT; + + // If the UI uses an RTL layout, it may be necessary to flip the meaning of each edge so + // that the left edge goes forward and the right goes back. + if (LocalizationUtils.shouldMirrorBackForwardGestures()) { + forward = !forward; ++ edge = BackGestureEventSwipeEdge.LEFT; + } + +- mModel.set(DIRECTION, forward); ++ if (mInitiatingEdge == edge && canNavigate(true)) { ++ mModel.set(CANFORWARD, true); ++ } else { ++ mModel.set(CANFORWARD, false); ++ } + mModel.set(EDGE, mInitiatingEdge); + if (canNavigate(forward)) { + if (mState != GestureState.STARTED) mModel.set(ACTION, GestureAction.RESET_BUBBLE); +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java +@@ -106,6 +106,7 @@ public class SideSlideLayout extends ViewGroup { + private int mAnimationViewWidth; + + private boolean mIsForward; ++ private boolean mCanForward; + private @CloseTarget int mCloseIndicator; + + private @BackGestureEventSwipeEdge int mInitiatingEdge; +@@ -229,10 +230,10 @@ public class SideSlideLayout extends ViewGroup { + * Set the direction used for sliding gesture. + * @param forward {@code true} if direction is forward. + */ +- public void setDirection(boolean forward) { +- mIsForward = forward; +- mArrowView.setIcon( +- forward ? R.drawable.ic_arrow_forward_blue_24dp : R.drawable.ic_arrow_back_24dp); ++ public void setDirection2(boolean canForward) { ++ mIsForward = false; ++ mCanForward = canForward; ++ mArrowView.setIcon(R.drawable.ic_arrow_back_24dp); + } + + public void setInitiatingEdge(@BackGestureEventSwipeEdge int edge) { +@@ -326,7 +327,7 @@ public class SideSlideLayout extends ViewGroup { + mWillNavigate = navigating; + + if (mCloseIndicator != CloseTarget.NONE) { +- if (mWillNavigate) { ++ if (mCanForward && !mIsForward && mWillNavigate) { + mArrowView.showCaption(mCloseIndicator); + mArrowViewWidth = mArrowView.getMeasuredWidth(); + } else { +@@ -342,6 +343,20 @@ public class SideSlideLayout extends ViewGroup { + ? -targetDiff + : targetDiff); + setTargetOffsetLeftAndRight(targetX - mCurrentTargetOffset); ++ ++ boolean lastForward = mIsForward; ++ if (mCanForward && originalDragPercent > (THRESHOLD_MULTIPLIER * 2)) { ++ mIsForward = true; ++ } else { ++ mIsForward = false; ++ } ++ if (lastForward != mIsForward) { ++ mArrowView.setIcon( ++ mIsForward ? R.drawable.ic_arrow_forward_blue_24dp : R.drawable.ic_arrow_back_24dp); ++ mArrowView.setImageTint(true); ++ if (navigating) performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); ++ hideCloseIndicator(); ++ } + } + + /** +diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sUseBrowserNavigationHandler.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sUseBrowserNavigationHandler.java +new file mode 100644 +--- /dev/null ++++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sUseBrowserNavigationHandler.java +@@ -0,0 +1,33 @@ ++/* ++ 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.base.cached_flags.CachedFlag; ++import org.chromium.chrome.browser.flags.ChromeFeatureMap; ++ ++public class sUseBrowserNavigationHandler { ++ private static final CachedFlag sInstance = ++ new CachedFlag(ChromeFeatureMap.getInstance(), ++ "UseBrowserNavigationHandler", false); ++ ++ private sUseBrowserNavigationHandler() {} ++ ++ public static CachedFlag getInstance() { ++ return sInstance; ++ } ++} +diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Use-browser-navigation-handler.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Use-browser-navigation-handler.grdp +new file mode 100644 +--- /dev/null ++++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Use-browser-navigation-handler.grdp +@@ -0,0 +1,12 @@ ++ ++ ++ ++ Customising the navigation manager ++ ++ ++ Disable system gestures for web browsing ++ ++ ++ Forces activation of the old page navigation mode ++ ++ +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 +@@ -103,4 +103,13 @@ found in the LICENSE file. + android:summary="@string/selection_popup_smart_text_summary" + android:title="@string/selection_popup_smart_text_title" /> + ++ ++ ++ + +diff --git a/cromite_flags/chrome/browser/about_flags_cc/Use-browser-navigation-handler.inc b/cromite_flags/chrome/browser/about_flags_cc/Use-browser-navigation-handler.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/chrome/browser/about_flags_cc/Use-browser-navigation-handler.inc +@@ -0,0 +1,12 @@ ++#if BUILDFLAG(IS_ANDROID) ++ ++#ifdef FLAG_SECTION ++ ++ {"UseBrowserNavigationHandler", ++ "Disable system gestures for web browsing", ++ "Forces activation of the old page navigation mode", kOsAndroid, ++ FEATURE_VALUE_TYPE(chrome::android::kUseBrowserNavigationHandler)}, ++ ++#endif ++ ++#endif +diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Use-browser-navigation-handler.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Use-browser-navigation-handler.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Use-browser-navigation-handler.inc +@@ -0,0 +1,3 @@ ++CROMITE_FEATURE(kUseBrowserNavigationHandler, ++ "UseBrowserNavigationHandler", ++ base::FEATURE_DISABLED_BY_DEFAULT); +diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Use-browser-navigation-handler.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Use-browser-navigation-handler.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Use-browser-navigation-handler.inc +@@ -0,0 +1 @@ ++BASE_DECLARE_FEATURE(kUseBrowserNavigationHandler); +--