diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 156c24fc69aa..d8e4fdcee1c1 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -437,6 +437,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/toolbar/top/BraveTopToolbarCoordinator.java", "../../brave/android/java/org/chromium/chrome/browser/ui/messages/infobar/BraveSimpleConfirmInfoBarBuilder.java", "../../brave/android/java/org/chromium/chrome/browser/ui/system/BraveStatusBarColorController.java", + "../../brave/android/java/org/chromium/chrome/browser/undo_tab_close_snackbar/BraveUndoBarControllerBase.java", "../../brave/android/java/org/chromium/chrome/browser/upgrade/BravePackageReplacedBroadcastReceiver.java", "../../brave/android/java/org/chromium/chrome/browser/upgrade/BraveUpgradeJobIntentServiceImpl.java", "../../brave/android/java/org/chromium/chrome/browser/upgrade/NotificationIntent.java", diff --git a/android/java/apk_for_test.flags b/android/java/apk_for_test.flags index 53b31c91ef29..278b805207a0 100644 --- a/android/java/apk_for_test.flags +++ b/android/java/apk_for_test.flags @@ -892,6 +892,10 @@ public (...); } +-keep class org.chromium.chrome.browser.undo_tab_close_snackbar.UndoBarController { + *** showUndoBar(...); +} + -keep class org.chromium.chrome.browser.tabbed_mode.TabbedNavigationBarColorController { *** mContext; *** mTabModelSelector; diff --git a/android/java/org/chromium/base/BravePreferenceKeys.java b/android/java/org/chromium/base/BravePreferenceKeys.java index 71e7567de418..d0e5fcc8011f 100644 --- a/android/java/org/chromium/base/BravePreferenceKeys.java +++ b/android/java/org/chromium/base/BravePreferenceKeys.java @@ -79,6 +79,8 @@ public final class BravePreferenceKeys { public static final String DAY_ZERO_EXPT_FLAG = "day_zero_expt_flag"; + public static final String SHOW_UNDO_WHEN_TABS_CLOSED = "show_undo_when_tabs_closed"; + /* * Checks if preference key is used in Brave. * It's no op currently. We might reconsider diff --git a/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java b/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java index adccd04cd4cd..c9b25f0169a1 100644 --- a/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java +++ b/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java @@ -50,6 +50,7 @@ public class AppearancePreferences extends BravePreferenceFragment public static final String PREF_BRAVE_ENABLE_TAB_GROUPS = "brave_enable_tab_groups"; public static final String PREF_BRAVE_ENABLE_SPEEDREADER = "brave_enable_speedreader"; public static final String PREF_ENABLE_MULTI_WINDOWS = "enable_multi_windows"; + public static final String PREF_SHOW_UNDO_WHEN_TABS_CLOSED = "show_undo_when_tabs_closed"; private BraveRewardsNativeWorker mBraveRewardsNativeWorker; @@ -172,6 +173,17 @@ public void onActivityCreated(Bundle savedInstanceState) { .setChecked(BraveMultiWindowUtils.shouldEnableMultiWindows()); } } + + ChromeSwitchPreference showUndoButtonOnTabClosed = + (ChromeSwitchPreference) findPreference(PREF_SHOW_UNDO_WHEN_TABS_CLOSED); + if (showUndoButtonOnTabClosed != null) { + showUndoButtonOnTabClosed.setOnPreferenceChangeListener(this); + ((ChromeSwitchPreference) showUndoButtonOnTabClosed) + .setChecked( + ChromeSharedPreferences.getInstance() + .readBoolean( + BravePreferenceKeys.SHOW_UNDO_WHEN_TABS_CLOSED, true)); + } } @Override @@ -257,6 +269,10 @@ public void onDismiss() { } } BraveMultiWindowUtils.updateEnableMultiWindows((boolean) newValue); + } else if (PREF_SHOW_UNDO_WHEN_TABS_CLOSED.equals(key)) { + ChromeSharedPreferences.getInstance() + .writeBoolean( + BravePreferenceKeys.SHOW_UNDO_WHEN_TABS_CLOSED, (boolean) newValue); } if (shouldRelaunch) { BraveRelaunchUtils.askForRelaunch(getActivity()); diff --git a/android/java/org/chromium/chrome/browser/undo_tab_close_snackbar/BraveUndoBarControllerBase.java b/android/java/org/chromium/chrome/browser/undo_tab_close_snackbar/BraveUndoBarControllerBase.java new file mode 100644 index 000000000000..819672d62c82 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/undo_tab_close_snackbar/BraveUndoBarControllerBase.java @@ -0,0 +1,39 @@ +/* Copyright (c) 2024 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.undo_tab_close_snackbar; + +import org.chromium.base.BravePreferenceKeys; +import org.chromium.base.BraveReflectionUtil; +import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; + +import java.util.List; + +public class BraveUndoBarControllerBase implements SnackbarManager.SnackbarController { + public void showUndoBar(List closedTabs, boolean isAllTabs) { + boolean showUndoBar = + ChromeSharedPreferences.getInstance() + .readBoolean(BravePreferenceKeys.SHOW_UNDO_WHEN_TABS_CLOSED, true); + if (!showUndoBar) { + if (closedTabs.isEmpty()) { + return; + } + Object actionData = closedTabs.size() == 1 ? closedTabs.get(0).getId() : closedTabs; + onDismissNoAction(actionData); + return; + } + + BraveReflectionUtil.invokeMethod( + UndoBarController.class, + this, + "showUndoBar", + List.class, + closedTabs, + boolean.class, + isAllTabs); + } +} diff --git a/android/java/proguard.flags b/android/java/proguard.flags index 7fbe47e05f59..a50ae34dd9c3 100644 --- a/android/java/proguard.flags +++ b/android/java/proguard.flags @@ -81,6 +81,10 @@ *** mReferenceButtonData; } +-keep class org.chromium.chrome.browser.undo_tab_close_snackbar.UndoBarController { + *** showUndoBar(...); +} + -keep class org.chromium.chrome.browser.tabbed_mode.TabbedNavigationBarColorController { *** getNavigationBarColor(...); } diff --git a/android/java/res/xml/appearance_preferences.xml b/android/java/res/xml/appearance_preferences.xml index 09caf59bcc4e..d0ca8a485549 100644 --- a/android/java/res/xml/appearance_preferences.xml +++ b/android/java/res/xml/appearance_preferences.xml @@ -49,6 +49,12 @@ android:title="@string/enable_multi_windows_title" android:summary="@string/enable_multi_windows_summary" /> + + Filter list could not be updated. Please try again + + Show undo button when tabs are closed + diff --git a/build/android/bytecode/BUILD.gn b/build/android/bytecode/BUILD.gn index bee93c788d76..ef20b41862a8 100644 --- a/build/android/bytecode/BUILD.gn +++ b/build/android/bytecode/BUILD.gn @@ -120,6 +120,7 @@ java_binary("java_bytecode_rewriter") { "//brave/build/android/bytecode/java/org/brave/bytecode/BraveToolbarManagerClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveToolbarSwipeLayoutClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveTopToolbarCoordinatorClassAdapter.java", + "//brave/build/android/bytecode/java/org/brave/bytecode/BraveUndoBarControllerBaseClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveVariationsSeedFetcherClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveWebsiteClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveWebsitePermissionsFetcherClassAdapter.java", diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java index 27f277588314..91fec1887e4f 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java @@ -119,6 +119,7 @@ public static ClassVisitor createAdapter(ClassVisitor chain) { chain = new BraveToolbarManagerClassAdapter(chain); chain = new BraveToolbarSwipeLayoutClassAdapter(chain); chain = new BraveTopToolbarCoordinatorClassAdapter(chain); + chain = new BraveUndoBarControllerBaseClassAdapter(chain); chain = new BraveVariationsSeedFetcherClassAdapter(chain); chain = new BraveWebsiteClassAdapter(chain); chain = new BraveWebsitePermissionsFetcherClassAdapter(chain); diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveUndoBarControllerBaseClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveUndoBarControllerBaseClassAdapter.java new file mode 100644 index 000000000000..b8e984134288 --- /dev/null +++ b/build/android/bytecode/java/org/brave/bytecode/BraveUndoBarControllerBaseClassAdapter.java @@ -0,0 +1,23 @@ +/* Copyright (c) 2024 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 BraveUndoBarControllerBaseClassAdapter extends BraveClassVisitor { + static String sUndoBarController = + "org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController"; + static String sBraveUndoBarControllerBase = + "org/chromium/chrome/browser/undo_tab_close_snackbar/BraveUndoBarControllerBase"; + + public BraveUndoBarControllerBaseClassAdapter(ClassVisitor visitor) { + super(visitor); + + changeSuperName(sUndoBarController, sBraveUndoBarControllerBase); + + changeMethodOwner(sUndoBarController, "showUndoBar", sBraveUndoBarControllerBase); + } +}