[Android] Remove Copy link menu item from long press menu (#29954)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
+111
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
]
|
||||
}
|
||||
+59
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
+22
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user