diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index f901dbae882..d575383772a 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -405,6 +405,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/tabbed_mode/BraveTabbedAppMenuPropertiesDelegate.java", "../../brave/android/java/org/chromium/chrome/browser/tabbed_mode/BraveTabbedNavigationBarColorControllerBase.java", "../../brave/android/java/org/chromium/chrome/browser/tabbed_mode/BraveTabbedRootUiCoordinator.java", + "../../brave/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCollectionTabModelImplBase.java", "../../brave/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCreator.java", "../../brave/android/java/org/chromium/chrome/browser/tasks/BraveReturnToChromeUtil.java", "../../brave/android/java/org/chromium/chrome/browser/toolbar/BraveHomeButton.java", diff --git a/android/java/apk_for_test.flags b/android/java/apk_for_test.flags index af880cb9ff8..9b2ef0d7ca5 100644 --- a/android/java/apk_for_test.flags +++ b/android/java/apk_for_test.flags @@ -785,12 +785,11 @@ public (...); } --keep class org.chromium.chrome.browser.tabmodel.TabGroupModelFilterImpl { - *** mIsResetting; +-keep class org.chromium.chrome.browser.tabmodel.TabCollectionTabModelImpl { public (...); } --keep class org.chromium.chrome.browser.tabmodel.BraveTabGroupModelFilter { +-keep class org.chromium.chrome.browser.tabmodel.BraveTabCollectionTabModelImplBase { public (...); } diff --git a/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/BraveTabGroupModelFilter.java b/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCollectionTabModelImplBase.java similarity index 55% rename from browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/BraveTabGroupModelFilter.java rename to android/java/org/chromium/chrome/browser/tabmodel/BraveTabCollectionTabModelImplBase.java index 32af2b09269..6efc9811d09 100644 --- a/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/BraveTabGroupModelFilter.java +++ b/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCollectionTabModelImplBase.java @@ -6,20 +6,21 @@ package org.chromium.chrome.browser.tabmodel; import org.chromium.base.BravePreferenceKeys; import org.chromium.base.BraveReflectionUtil; +import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabLaunchType; -/** Brave's super class for {@link TabGroupModelFilter} */ -public class BraveTabGroupModelFilter { - /** - * This variable will be used instead of {@link TabGroupModelFilterImpl}'s variable, that will - * be deleted in bytecode. - */ - protected boolean mIsResetting; +/** Brave's super class for {@link TabCollectionTabModelImpl} */ +@NullMarked +public abstract class BraveTabCollectionTabModelImplBase extends TabModelJniBridge { + public BraveTabCollectionTabModelImplBase(Profile profile) { + super(profile); + } - /** Call from {@link TabGroupModelFilterImpl} will be redirected here via bytecode. */ + /** Call from {@link TabCollectionTabModelImpl} will be redirected here via bytecode. */ @SuppressWarnings("UnusedMethod") protected boolean shouldGroupWithParent(Tab tab, @Nullable Tab parentTab) { if (linkClicked(tab.getLaunchType()) @@ -31,20 +32,24 @@ public class BraveTabGroupModelFilter { BravePreferenceKeys .BRAVE_TAB_GROUPS_ENABLED_DEFAULT_VALUE, true)) - && isTabModelRestored() - && !mIsResetting) { + && isTabModelRestored()) { return true; } + if (parentTab == null) { + return false; + } // Otherwise just call parent. - return (boolean) - BraveReflectionUtil.invokeMethod( - TabGroupModelFilterImpl.class, - this, - "shouldGroupWithParent", - Tab.class, - tab, - Tab.class, - parentTab); + @Nullable Boolean shouldGroupWithParent = + (Boolean) + BraveReflectionUtil.invokeMethod( + TabCollectionTabModelImpl.class, + this, + "shouldGroupWithParent", + Tab.class, + tab, + Tab.class, + parentTab); + return shouldGroupWithParent != null && shouldGroupWithParent; } /** Determine if a launch type is the result of linked being clicked. */ @@ -53,8 +58,10 @@ public class BraveTabGroupModelFilter { } private boolean isTabModelRestored() { - return (boolean) - BraveReflectionUtil.invokeMethod( - TabGroupModelFilterImpl.class, this, "isTabModelRestored"); + @Nullable Boolean isRestored = + (Boolean) + BraveReflectionUtil.invokeMethod( + TabCollectionTabModelImpl.class, this, "isTabModelRestored"); + return isRestored != null && isRestored; } } diff --git a/android/java/proguard.flags b/android/java/proguard.flags index 6520e5fb273..c690564cc85 100644 --- a/android/java/proguard.flags +++ b/android/java/proguard.flags @@ -51,7 +51,7 @@ -keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken --keep class org.chromium.chrome.browser.tabmodel.TabGroupModelFilterImpl { +-keep class org.chromium.chrome.browser.tabmodel.TabCollectionTabModelImpl { *** shouldGroupWithParent(...); *** isTabModelRestored(...); } diff --git a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java index 22e35e85340..8ab5dca06c2 100644 --- a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java +++ b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java @@ -369,7 +369,7 @@ public class BytecodeTest { Assert.assertTrue( classExists("org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator")); Assert.assertTrue( - classExists("org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl")); + classExists("org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl")); Assert.assertTrue( classExists("org/chromium/chrome/browser/identity_disc/IdentityDiscController")); Assert.assertTrue( @@ -1226,7 +1226,7 @@ public class BytecodeTest { int.class)); Assert.assertTrue( methodExists( - "org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl", + "org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl", "shouldGroupWithParent", MethodModifier.REGULAR, boolean.class, @@ -1234,7 +1234,7 @@ public class BytecodeTest { Tab.class)); Assert.assertTrue( methodExists( - "org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl", + "org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl", "isTabModelRestored", MethodModifier.REGULAR, boolean.class)); @@ -2439,10 +2439,6 @@ public class BytecodeTest { fieldExists( "org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager", "mView")); - Assert.assertFalse( - fieldExists( - "org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl", - "mIsResetting")); Assert.assertTrue( fieldExists( "org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy", // presubmit: ignore-long-line @@ -2694,8 +2690,8 @@ public class BytecodeTest { "org/chromium/chrome/browser/bookmarks/BraveBookmarkBridge")); Assert.assertTrue( checkSuperName( - "org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl", - "org/chromium/chrome/browser/tabmodel/BraveTabGroupModelFilter")); + "org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl", + "org/chromium/chrome/browser/tabmodel/BraveTabCollectionTabModelImplBase")); Assert.assertTrue( checkSuperName( "org/chromium/chrome/browser/media/PictureInPictureActivity", diff --git a/browser/tabmodel/android/BUILD.gn b/browser/tabmodel/android/BUILD.gn deleted file mode 100644 index 14a9b9f3f73..00000000000 --- a/browser/tabmodel/android/BUILD.gn +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2023 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("//brave/android/features/tab_ui/brave_tab_management_java_sources.gni") -import("//build/config/android/config.gni") -import("//build/config/android/rules.gni") -import("//chrome/browser/buildflags.gni") - -android_library("java") { - sources = [ "java/src/org/chromium/chrome/browser/tabmodel/BraveTabGroupModelFilter.java" ] - - deps = [ - "//base:base_java", - "//chrome/browser/preferences:java", - "//chrome/browser/tab:java", - "//chrome/browser/tabmodel:java", - "//third_party/androidx:androidx_annotation_annotation_java", - ] -} diff --git a/build/android/bytecode/BUILD.gn b/build/android/bytecode/BUILD.gn index 45563ec70cb..48b501ac602 100644 --- a/build/android/bytecode/BUILD.gn +++ b/build/android/bytecode/BUILD.gn @@ -129,7 +129,7 @@ java_binary("java_bytecode_rewriter") { "//brave/build/android/bytecode/java/org/brave/bytecode/BraveStatusBarColorControllerClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveStrictPreferenceKeyCheckerClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveTabCardThemeUtilClassAdapter.java", - "//brave/build/android/bytecode/java/org/brave/bytecode/BraveTabGroupModelFilterClassAdapter.java", + "//brave/build/android/bytecode/java/org/brave/bytecode/BraveTabCollectionTabModelImplClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveTabGroupUiCoordinatorClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveTabSwitcherPaneBaseClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveTabbedActivityClassAdapter.java", diff --git a/build/android/bytecode/bytecode_rewriter.gni b/build/android/bytecode/bytecode_rewriter.gni index 97c4f573424..b116a8061ae 100644 --- a/build/android/bytecode/bytecode_rewriter.gni +++ b/build/android/bytecode/bytecode_rewriter.gni @@ -11,7 +11,6 @@ brave_bytecode_jars = [ "obj/brave/android/features/tab_ui/java.javac.jar", "obj/brave/android/java/org/chromium/chrome/browser/search_engines/java.javac.jar", "obj/brave/browser/notifications/java.javac.jar", - "obj/brave/browser/tabmodel/android/java.javac.jar", "obj/brave/browser/ui/android/logo/java.javac.jar", "obj/brave/browser/ui/android/omnibox/java.javac.jar", "obj/brave/browser/ui/android/theme/java.javac.jar", diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java index dad34de2e19..06b4deaa995 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java @@ -129,7 +129,7 @@ public class BraveClassAdapter { chain = new BraveTabbedActivityClassAdapter(chain); chain = new BraveTabbedNavigationBarColorControllerBaseClassAdapter(chain); chain = new BraveTabbedRootUiCoordinatorClassAdapter(chain); - chain = new BraveTabGroupModelFilterClassAdapter(chain); + chain = new BraveTabCollectionTabModelImplClassAdapter(chain); chain = new BraveThemeUtilsClassAdapter(chain); chain = new BraveTileViewClassAdapter(chain); chain = new BraveToolbarLayoutClassAdapter(chain); diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveTabCollectionTabModelImplClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveTabCollectionTabModelImplClassAdapter.java new file mode 100644 index 00000000000..40320261a6b --- /dev/null +++ b/build/android/bytecode/java/org/brave/bytecode/BraveTabCollectionTabModelImplClassAdapter.java @@ -0,0 +1,27 @@ +/* Copyright (c) 2023 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 BraveTabCollectionTabModelImplClassAdapter extends BraveClassVisitor { + static String sTabCollectionTabModelImplClassName = + "org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl"; + static String sBraveTabCollectionTabModelImplBaseClassName = + "org/chromium/chrome/browser/tabmodel/BraveTabCollectionTabModelImplBase"; + + public BraveTabCollectionTabModelImplClassAdapter(ClassVisitor visitor) { + super(visitor); + + changeSuperName( + sTabCollectionTabModelImplClassName, sBraveTabCollectionTabModelImplBaseClassName); + + changeMethodOwner( + sTabCollectionTabModelImplClassName, + "shouldGroupWithParent", + sBraveTabCollectionTabModelImplBaseClassName); + } +} diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveTabGroupModelFilterClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveTabGroupModelFilterClassAdapter.java deleted file mode 100644 index 085788e92b1..00000000000 --- a/build/android/bytecode/java/org/brave/bytecode/BraveTabGroupModelFilterClassAdapter.java +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2023 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 BraveTabGroupModelFilterClassAdapter extends BraveClassVisitor { - static String sTabGroupModelFilterClassName = - "org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl"; - static String sBraveTabGroupModelFilterClassName = - "org/chromium/chrome/browser/tabmodel/BraveTabGroupModelFilter"; - - public BraveTabGroupModelFilterClassAdapter(ClassVisitor visitor) { - super(visitor); - - changeSuperName(sTabGroupModelFilterClassName, sBraveTabGroupModelFilterClassName); - - deleteField(sTabGroupModelFilterClassName, "mIsResetting"); - - changeMethodOwner( - sTabGroupModelFilterClassName, - "shouldGroupWithParent", - sBraveTabGroupModelFilterClassName); - } -} diff --git a/build/android/config.gni b/build/android/config.gni index e920e94b5e6..9f77ce3691f 100644 --- a/build/android/config.gni +++ b/build/android/config.gni @@ -32,7 +32,6 @@ brave_chrome_java_deps = [ "//brave/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/settings:java", "//brave/browser/skus/android:java", "//brave/browser/tab_group_sync:java", - "//brave/browser/tabmodel/android:java", "//brave/browser/ui/android/logo:java", "//brave/browser/ui/android/omnibox:java", "//brave/browser/ui/android/theme:java",