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; @@ -98,6 +99,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; @@ -1325,7 +1327,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; @@ -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/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); --