cromite/build/patches/Use-browser-navigation-handler.patch
2025-11-22 16:25:29 +01:00

389 lines
21 KiB
Diff

From: uazo <uazo@users.noreply.github.com>
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 | 1 +
.../GestureNavigationProperties.java | 4 +--
.../GestureNavigationViewBinder.java | 6 ++--
.../HistoryNavigationCoordinator.java | 4 +++
.../gesturenav/HistoryNavigationLayout.java | 6 ++--
.../browser/gesturenav/NavigationHandler.java | 12 +++++--
.../browser/gesturenav/SideSlideLayout.java | 25 +++++++++++---
.../tabbed_mode/TabbedRootUiCoordinator.java | 4 ++-
.../cromite/sUseBrowserNavigationHandler.java | 33 +++++++++++++++++++
.../Use-browser-navigation-handler.grdp | 12 +++++++
.../res/xml/accessibility_preferences.xml | 9 +++++
.../widget/CoordinatorLayoutForPointer.java | 20 +++++++++++
.../Use-browser-navigation-handler.inc | 12 +++++++
.../Use-browser-navigation-handler.inc | 3 ++
.../Use-browser-navigation-handler.inc | 1 +
15 files changed, 135 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
@@ -105,6 +105,7 @@ import org.chromium.ui.util.MotionEventUtils;
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;
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
@@ -19,7 +19,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();
@@ -41,6 +41,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;
@@ -34,8 +34,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
@@ -16,6 +16,7 @@ import org.chromium.build.annotations.MonotonicNonNull;
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.NullUnmarked;
import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.browser.flags.cromite.sUseBrowserNavigationHandler;
import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
@@ -205,6 +206,9 @@ public class HistoryNavigationCoordinator
* @return {@code} true if the feature is enabled.
*/
private boolean isFeatureEnabled() {
+ if (sUseBrowserNavigationHandler.getInstance().isEnabled()) {
+ return true;
+ }
if (mForceFeatureEnabledForTesting != null) {
return mForceFeatureEnabledForTesting;
}
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
@@ -74,8 +74,8 @@ class HistoryNavigationLayout extends FrameLayout implements ViewGroup.OnHierarc
* @param forward {@code true} for forward navigation, or {@code false} for back.
* @param initiatingEdge Which edge of the screen the gesture is navigating from.
*/
- void showBubble(
- boolean forward,
+ void showBubble2(
+ boolean canForward,
@BackGestureEventSwipeEdge int initiatingEdge,
@CloseTarget int closeIndicator) {
if (mSideSlideLayout == null) {
@@ -93,7 +93,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
@@ -10,7 +10,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;
@@ -291,7 +291,11 @@ class NavigationHandler implements TouchEventObserver {
boolean forward = isForward();
- mModel.set(DIRECTION, forward);
+ if (mInitiatingEdge == BackGestureEventSwipeEdge.RIGHT && canNavigate(true)) {
+ mModel.set(CANFORWARD, true);
+ } else {
+ mModel.set(CANFORWARD, false);
+ }
mModel.set(EDGE, mInitiatingEdge);
if (canNavigate(forward)) {
// Correct swipe, reset mIncorrectEdgeSwipeCount.
@@ -529,12 +533,14 @@ class NavigationHandler implements TouchEventObserver {
}
private boolean isForward() {
- 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;
}
return forward;
}
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
@@ -108,6 +108,7 @@ public class SideSlideLayout extends ViewGroup {
private int mAnimationViewWidth;
private boolean mIsForward;
+ private boolean mCanForward;
private @CloseTarget int mCloseIndicator;
private @BackGestureEventSwipeEdge int mInitiatingEdge;
@@ -223,10 +224,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) {
@@ -332,7 +333,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 {
@@ -348,6 +349,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/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -86,6 +86,7 @@ import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ActivityType;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches;
+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.gesturenav.BackActionDelegate;
@@ -824,7 +825,8 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator {
@Override
public void onInflationComplete() {
mCoordinator = mActivity.findViewById(R.id.coordinator);
-
+ ((CoordinatorLayoutForPointer)mCoordinator).setUseBrowserNavigationHandler(
+ sUseBrowserNavigationHandler.getInstance().isEnabled());
super.onInflationComplete();
ViewStub loadingStub = mActivity.findViewById(R.id.loading_stub);
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 <https://www.gnu.org/licenses/>.
+*/
+
+package org.chromium.chrome.browser.flags.cromite;
+
+import org.chromium.components.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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_CUSTOMIZE_NAVIGATION_MODE" desc="">
+ Customising the navigation manager
+ </message>
+ <message name="IDS_USE_BROWSER_NAVIGATION_HANDLER_TITLE" desc="">
+ Disable system gestures for web browsing
+ </message>
+ <message name="IDS_USE_BROWSER_NAVIGATION_HANDLER_SUMMARY" desc="">
+ Forces activation of the old page navigation mode
+ </message>
+</grit-part>
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
@@ -109,4 +109,13 @@ found in the LICENSE file.
android:summary="@string/selection_popup_smart_text_summary"
android:title="@string/selection_popup_smart_text_title" />
+ <PreferenceCategory
+ android:key="customize_navigation_mode"
+ android:title="@string/customize_navigation_mode" />
+
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:title="@string/use_browser_navigation_handler_title"
+ android:summary="@string/use_browser_navigation_handler_summary"
+ app:featureName="UseBrowserNavigationHandler"
+ app:needRestart="true" />
</PreferenceScreen>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/CoordinatorLayoutForPointer.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/CoordinatorLayoutForPointer.java
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/CoordinatorLayoutForPointer.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/CoordinatorLayoutForPointer.java
@@ -16,6 +16,10 @@ import org.chromium.base.ObserverList;
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
+import android.graphics.Rect;
+import android.os.Build;
+import java.util.Collections;
+
/**
* This class overrides {@link onResolvePointerIcon} method to correctly determine the pointer icon
* from a mouse motion event. This is needed because the default android impl does not consider view
@@ -37,6 +41,22 @@ public class CoordinatorLayoutForPointer extends CoordinatorLayout implements To
&& (y >= view.getTop() && y <= view.getBottom()));
}
+ private boolean useBrowserNavigationHandler = false;
+
+ public void setUseBrowserNavigationHandler(boolean enabled) {
+ useBrowserNavigationHandler = enabled;
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed, l, t, r, b);
+ if (useBrowserNavigationHandler && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ setSystemGestureExclusionRects(
+ Collections.singletonList(
+ new Rect(0, 0, Math.abs(r - l), Math.abs(t - b))));
+ }
+ }
+
@Override
public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
final int x = (int) event.getX(pointerIndex);
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);
--