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 | 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 @@ -113,6 +113,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; @@ -206,6 +207,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 @@ -103,6 +103,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; @@ -995,7 +996,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 . +*/ + +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 @@ + + + + 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 @@ -119,4 +119,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/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); --