[Android] Remove Copy link menu item from long press menu (#29954)

This commit is contained in:
samartnik
2025-07-18 08:14:58 -04:00
committed by GitHub
parent b753f27982
commit 57c2fb6bb5
11 changed files with 247 additions and 0 deletions
+8
View File
@@ -995,3 +995,11 @@
-keep class org.chromium.chrome.browser.infobar.BraveInfoBarContainerView {
<init>(...);
}
-keep class org.chromium.chrome.browser.toolbar.ToolbarLongPressMenuHandler {
public <init>(...);
}
-keep class org.chromium.chrome.browser.toolbar.BraveToolbarLongPressMenuHandler {
public <init>(...);
}
@@ -1952,6 +1952,18 @@ public class BytecodeTest {
BrowserControlsStateProvider.class,
ObservableSupplier.class,
boolean.class));
Assert.assertTrue(
constructorsMatch(
"org/chromium/chrome/browser/toolbar/ToolbarLongPressMenuHandler",
"org/chromium/chrome/browser/toolbar/BraveToolbarLongPressMenuHandler",
Context.class,
ObservableSupplier.class,
boolean.class,
BooleanSupplier.class,
ActivityLifecycleDispatcher.class,
WindowAndroid.class,
java.util.function.Supplier.class,
java.util.function.Supplier.class));
}
@Test
+9
View File
@@ -22,4 +22,13 @@ if (is_android) {
deps = [ "//chrome/android/junit:chrome_junit_tests_helper" ]
}
robolectric_library("brave_junit_tests_org.chromium.chrome.browser.toolbar") {
sources = [ "src/org/chromium/chrome/browser/toolbar/BraveToolbarLongPressMenuHandlerUnitTest.java" ]
deps = [
"//brave/browser/ui/android/toolbar:java",
"//chrome/android/junit:chrome_junit_tests_helper",
]
}
}
@@ -0,0 +1,111 @@
/* Copyright (c) 2025 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */
package org.chromium.chrome.browser.toolbar;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import android.app.Activity;
import android.content.pm.PackageManager;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.filters.SmallTest;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.Robolectric;
import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowPackageManager;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Features.EnableFeatures;
import org.chromium.base.test.util.Restriction;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.TestActivity;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.display.DisplayAndroid;
import org.chromium.ui.listmenu.ListMenuItemProperties;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import org.chromium.ui.widget.ViewRectProvider;
import java.util.function.BooleanSupplier;
/** Unit tests for {@link BraveToolbarLongPressMenuHandler}. */
@RunWith(BaseRobolectricTestRunner.class)
@EnableFeatures(ChromeFeatureList.ANDROID_BOTTOM_TOOLBAR)
public final class BraveToolbarLongPressMenuHandlerUnitTest {
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
@Rule
public ActivityScenarioRule<TestActivity> mActivityScenarioRule =
new ActivityScenarioRule<>(TestActivity.class);
@Mock private ViewRectProvider mViewRectProvider;
@Mock Profile mProfile;
@Mock private WindowAndroid mWindowAndroid;
@Mock private ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
@Mock private DisplayAndroid mDisplayAndroid;
private ToolbarLongPressMenuHandler mToolbarLongPressMenuHandler;
private ObservableSupplierImpl mProfileSupplier;
private Activity mActivity;
private boolean mShouldSuppress;
private final BooleanSupplier mSuppressSupplier = () -> mShouldSuppress;
private String mUrlString;
@Before
public void setUp() throws Exception {
mActivity = Robolectric.buildActivity(Activity.class).get();
ShadowPackageManager shadowPackageManager = Shadows.shadowOf(mActivity.getPackageManager());
shadowPackageManager.setSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE, false);
mProfileSupplier = new ObservableSupplierImpl<>();
mProfileSupplier.set(mProfile);
doReturn(mDisplayAndroid).when(mWindowAndroid).getDisplay();
doReturn(1.0f).when(mDisplayAndroid).getDipScale();
doReturn(true).when(mActivityLifecycleDispatcher).isNativeInitializationFinished();
mToolbarLongPressMenuHandler =
new BraveToolbarLongPressMenuHandler(
mActivity,
mProfileSupplier,
false,
mSuppressSupplier,
mActivityLifecycleDispatcher,
mWindowAndroid,
() -> mUrlString,
() -> mViewRectProvider);
verify(mActivityLifecycleDispatcher).register(mToolbarLongPressMenuHandler);
}
@Test
@SmallTest
@Restriction({DeviceFormFactor.PHONE})
public void testbuildMenuItems() {
ModelList list = mToolbarLongPressMenuHandler.buildMenuItems(true);
assertEquals(1, list.size());
assertEquals(
R.string.toolbar_move_to_the_bottom,
list.get(0).model.get(ListMenuItemProperties.TITLE_ID));
assertEquals(
ToolbarLongPressMenuHandler.MenuItemType.MOVE_ADDRESS_BAR_TO,
list.get(0).model.get(ListMenuItemProperties.MENU_ITEM_ID));
}
}
+22
View File
@@ -0,0 +1,22 @@
# Copyright (c) 2025 The Brave Authors. All rights reserved.
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at https://mozilla.org/MPL/2.0/.
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
import("//chrome/browser/buildflags.gni")
import("//extensions/buildflags/buildflags.gni")
import("//third_party/jni_zero/jni_zero.gni")
android_library("java") {
sources = [ "java/src/org/chromium/chrome/browser/toolbar/BraveToolbarLongPressMenuHandler.java" ]
deps = [
"//base:supplier_java",
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/ui/android/toolbar:java",
"//ui/android:ui_no_recycler_view_java",
]
}
@@ -0,0 +1,59 @@
/* Copyright (c) 2025 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */
package org.chromium.chrome.browser.toolbar;
import android.content.Context;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.build.annotations.NullMarked;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.listmenu.ListMenuItemProperties;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import org.chromium.ui.widget.ViewRectProvider;
import java.util.function.BooleanSupplier;
import java.util.function.Supplier;
/** Brave's extension for the handler for the toolbar long press menu. */
@NullMarked
public class BraveToolbarLongPressMenuHandler extends ToolbarLongPressMenuHandler {
public BraveToolbarLongPressMenuHandler(
Context context,
ObservableSupplier<Profile> profileSupplier,
boolean isCustomTab,
BooleanSupplier suppressLongPressSupplier,
ActivityLifecycleDispatcher lifecycleDispatcher,
WindowAndroid windowAndroid,
Supplier<String> urlBarTextSupplier,
Supplier<ViewRectProvider> urlBarViewRectProviderSupplier) {
super(
context,
profileSupplier,
isCustomTab,
suppressLongPressSupplier,
lifecycleDispatcher,
windowAndroid,
urlBarTextSupplier,
urlBarViewRectProviderSupplier);
}
@Override
ModelList buildMenuItems(boolean onTop) {
ModelList itemList = super.buildMenuItems(onTop);
// Remove the "Copy link" item from menu.
for (int i = 0; i < itemList.size(); i++) {
int itemID = itemList.get(i).model.get(ListMenuItemProperties.MENU_ITEM_ID);
if (itemID == MenuItemType.COPY_LINK) {
itemList.removeAt(i);
break;
}
}
return itemList;
}
}
+1
View File
@@ -127,6 +127,7 @@ java_binary("java_bytecode_rewriter") {
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveThemeUtilsClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveTileViewClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveToolbarLayoutClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveToolbarLongPressMenuHandlerClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveToolbarManagerClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveToolbarPositionControllerClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveToolbarSwipeLayoutClassAdapter.java",
@@ -122,6 +122,7 @@ public class BraveClassAdapter {
chain = new BraveThemeUtilsClassAdapter(chain);
chain = new BraveTileViewClassAdapter(chain);
chain = new BraveToolbarLayoutClassAdapter(chain);
chain = new BraveToolbarLongPressMenuHandlerClassAdapter(chain);
chain = new BraveToolbarManagerClassAdapter(chain);
chain = new BraveToolbarPositionControllerClassAdapter(chain);
chain = new BraveToolbarSwipeLayoutClassAdapter(chain);
@@ -0,0 +1,22 @@
/* Copyright (c) 2025 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */
package org.brave.bytecode;
import org.objectweb.asm.ClassVisitor;
public class BraveToolbarLongPressMenuHandlerClassAdapter extends BraveClassVisitor {
static String sToolbarLongPressMenuHandlerClassName =
"org/chromium/chrome/browser/toolbar/ToolbarLongPressMenuHandler";
static String sBraveToolbarLongPressMenuHandlerClassName =
"org/chromium/chrome/browser/toolbar/BraveToolbarLongPressMenuHandler";
public BraveToolbarLongPressMenuHandlerClassAdapter(ClassVisitor visitor) {
super(visitor);
redirectConstructor(
sToolbarLongPressMenuHandlerClassName, sBraveToolbarLongPressMenuHandlerClassName);
}
}
+1
View File
@@ -33,6 +33,7 @@ brave_chrome_java_deps = [
"//brave/browser/ui/android/logo:java",
"//brave/browser/ui/android/omnibox:java",
"//brave/browser/ui/android/theme:java",
"//brave/browser/ui/android/toolbar:java",
"//brave/components/ai_chat/core/common/mojom:mojom_java",
"//brave/components/brave_news/common:mojom_java",
"//brave/components/brave_rewards/core/mojom:mojom_java",
+1
View File
@@ -1386,6 +1386,7 @@ if (is_android) {
deps = [
"//brave/android/junit:brave_junit_tests_org.chromium.chrome.browser.homepage",
"//brave/android/junit:brave_junit_tests_org.chromium.chrome.browser.tabbed_mode",
"//brave/android/junit:brave_junit_tests_org.chromium.chrome.browser.toolbar",
]
}
} # if (is_android) {