From a5c0b652be4f332a4b6c146829b2b88736447bfe Mon Sep 17 00:00:00 2001
From: Deep Pandya <5146988+deeppandya@users.noreply.github.com>
Date: Sat, 22 Feb 2025 16:34:57 -0500
Subject: [PATCH] Rewards 3.0 android (#26945)
* Add rewards 3.0 feature flag
* Add a function to check for rewards 3.0 flag
Update entry points for rewards with rewards 3.0 flag
* Add RewardsPageActivity/RewardsCustomTabRootUiCoordinator to show rewards 3.0 changes in custom tab
* Address rewards reset for rewards 3.0
* Add activity transition for rewards page
* Remove onBackPressed override
* Add close button to close the rewards panel as we have disabled back press
Update close button position on the page
* Add creator changes for rewards 3.0
Remove logs
Add null check
Remove changes for backpress
* Add changes for handling creators
Encode Url for creators
* Add open url native fucntion
* Add bubble in query params
* Add bytecode changes for BaseCustomTabActivity
Add native function to open url into rewards_page_ui
* Update copyright header year
* Update close icon for rewards page
Remove comments and refactor changes
* Address naming related changes
* Add test for bytecode changes
Resolve rebase error
* Update changes to use TabUtils open tab
* Remove close button
* Add FullScreenCustomTabActivity
---
android/brave_java_sources.gni | 2 +
android/java/AndroidManifest.xml | 6 +
android/java/apk_for_test.flags | 10 ++
.../org/chromium/base/BraveFeatureList.java | 1 +
.../chrome/browser/BraveRewardsHelper.java | 11 +-
.../browser/BraveRewardsNativeWorker.java | 18 +--
.../chrome/browser/app/BraveActivity.java | 10 +-
.../FullScreenCustomTabActivity.java | 119 ++++++++++++++++
.../FullScreenCustomTabRootUiCoordinator.java | 132 ++++++++++++++++++
.../browser/toolbar/BraveToolbarManager.java | 7 +
.../toolbar/top/BraveToolbarLayoutImpl.java | 40 ++++--
.../chrome/browser/util/TabUtils.java | 16 +++
android/java/res/values/brave_dimens.xml | 2 +
android/java/res/values/brave_styles.xml | 11 ++
.../chromium/chrome/browser/BytecodeTest.java | 24 ++++
.../android/brave_rewards_native_worker.cc | 4 +-
browser/ui/BUILD.gn | 2 +
.../brave_rewards/rewards_page_helper.cc | 21 +++
.../brave_rewards/rewards_page_helper.h | 18 +++
.../ui/webui/brave_rewards/rewards_page_ui.cc | 7 +-
build/android/BUILD.gn | 1 +
build/android/bytecode/BUILD.gn | 1 +
...raveBaseCustomTabActivityClassAdapter.java | 37 +++++
.../org/brave/bytecode/BraveClassAdapter.java | 1 +
.../flags/android/chrome_feature_list.cc | 1 +
25 files changed, 479 insertions(+), 23 deletions(-)
create mode 100644 android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabActivity.java
create mode 100644 android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabRootUiCoordinator.java
create mode 100644 browser/ui/android/brave_rewards/rewards_page_helper.cc
create mode 100644 browser/ui/android/brave_rewards/rewards_page_helper.h
create mode 100644 build/android/bytecode/java/org/brave/bytecode/BraveBaseCustomTabActivityClassAdapter.java
diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni
index da227de4059..a7c9c44f9ec 100644
--- a/android/brave_java_sources.gni
+++ b/android/brave_java_sources.gni
@@ -206,6 +206,8 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/popup_window_tooltip/ArrowColorDrawable.java",
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/popup_window_tooltip/PopupWindowTooltip.java",
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/popup_window_tooltip/PopupWindowTooltipUtils.java",
+ "../../brave/android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabActivity.java",
+ "../../brave/android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabRootUiCoordinator.java",
"../../brave/android/java/org/chromium/chrome/browser/customtabs/features/partialcustomtab/BravePartialCustomTabBottomSheetStrategy.java",
"../../brave/android/java/org/chromium/chrome/browser/day_zero/DayZeroHelper.java",
"../../brave/android/java/org/chromium/chrome/browser/decentralized_dns/settings/ENSSettingsFragment.java",
diff --git a/android/java/AndroidManifest.xml b/android/java/AndroidManifest.xml
index beceb2a0704..6598bbd88dd 100644
--- a/android/java/AndroidManifest.xml
+++ b/android/java/AndroidManifest.xml
@@ -17,6 +17,12 @@
android:name="org.chromium.chrome.browser.BraveRewardsUserWalletActivity"
android:theme="@style/BraveTranslucent"/>
+
+
diff --git a/android/java/apk_for_test.flags b/android/java/apk_for_test.flags
index d11d336b326..a13d0578b61 100644
--- a/android/java/apk_for_test.flags
+++ b/android/java/apk_for_test.flags
@@ -917,3 +917,13 @@
}
-keep class org.chromium.chrome.browser.multiwindow.InstanceInfo
+
+-keep class org.chromium.chrome.browser.customtabs.BaseCustomTabActivity {
+ *** mBaseCustomTabRootUiCoordinator;
+ *** mIntentDataProvider;
+ *** mToolbarCoordinator;
+ *** mTabController;
+ *** mMinimizationManagerHolder;
+ *** mCustomTabFeatureOverridesManager;
+ public (...);
+}
diff --git a/android/java/org/chromium/base/BraveFeatureList.java b/android/java/org/chromium/base/BraveFeatureList.java
index 3986eb031b9..d673a86f627 100644
--- a/android/java/org/chromium/base/BraveFeatureList.java
+++ b/android/java/org/chromium/base/BraveFeatureList.java
@@ -39,4 +39,5 @@ public abstract class BraveFeatureList {
public static final String BRAVE_BLOCK_ALL_COOKIES_TOGGLE = "BlockAllCookiesToggle";
public static final String BRAVE_SHIELDS_ELEMENT_PICKER = "BraveShieldsElementPicker";
public static final String BRAVE_WEB_DISCOVERY_NATIVE = "BraveWebDiscoveryNative";
+ public static final String NEW_REWARDS_UI_FEATURE = "BraveRewardsNewRewardsUI";
}
diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java b/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java
index faaa3605fc3..72d738060e8 100644
--- a/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java
+++ b/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java
@@ -32,12 +32,14 @@ import androidx.annotation.Nullable;
import org.jni_zero.CalledByNative;
+import org.chromium.base.BraveFeatureList;
import org.chromium.base.Callback;
import org.chromium.base.ContextUtils;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.profiles.ProfileManager;
@@ -640,7 +642,14 @@ public class BraveRewardsHelper implements LargeIconBridge.LargeIconCallback {
tosTextSS.setSpan(
clickableSpan, index, index + spanLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Typeface typeface = Typeface.create("sans-serif", Typeface.NORMAL);
- tosTextSS.setSpan(new StyleSpan(typeface.getStyle()), index, index + spanLength,
+ tosTextSS.setSpan(
+ new StyleSpan(typeface.getStyle()),
+ index,
+ index + spanLength,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
+
+ public static boolean shouldShowNewRewardsUI() {
+ return ChromeFeatureList.isEnabled(BraveFeatureList.NEW_REWARDS_UI_FEATURE);
+ }
}
diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java b/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java
index 2129fa0531d..67619a9deb5 100644
--- a/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java
+++ b/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java
@@ -25,10 +25,10 @@ import java.util.List;
@JNINamespace("chrome::android")
public class BraveRewardsNativeWorker {
- /**
- * Allows to monitor a front tab publisher changes.
- */
- public interface PublisherObserver { void onFrontTabPublisherChanged(boolean verified); }
+ /** Allows to monitor a front tab publisher changes. */
+ public interface PublisherObserver {
+ void onFrontTabPublisherChanged(boolean verified, String publisherId);
+ }
// Rewards notifications
// Taken from components/brave_rewards/content/rewards_notification_service.h
@@ -128,7 +128,7 @@ public class BraveRewardsNativeWorker {
new Runnable() {
@Override
public void run() {
- notifyPublisherObservers(false);
+ notifyPublisherObservers(false, "");
}
});
} else if (newUrl) {
@@ -138,9 +138,9 @@ public class BraveRewardsNativeWorker {
mFrontTabUrl = url;
}
- private void notifyPublisherObservers(boolean verified) {
+ private void notifyPublisherObservers(boolean verified, String publisherId) {
for (PublisherObserver observer : mFrontTabPublisherObservers) {
- observer.onFrontTabPublisherChanged(verified);
+ observer.onFrontTabPublisherChanged(verified, publisherId);
}
}
@@ -567,10 +567,10 @@ public class BraveRewardsNativeWorker {
}
@CalledByNative
- public void onPublisherInfo(int tabId) {
+ public void onPublisherInfo(int tabId, String publisherId) {
int pubStatus = getPublisherStatus(tabId);
boolean verified = pubStatus != PublisherStatus.NOT_VERIFIED;
- notifyPublisherObservers(verified);
+ notifyPublisherObservers(verified, publisherId);
// Notify BraveRewardsObserver (panel).
for (BraveRewardsObserver observer : mObservers) {
diff --git a/android/java/org/chromium/chrome/browser/app/BraveActivity.java b/android/java/org/chromium/chrome/browser/app/BraveActivity.java
index 34207fd47d3..5040dcc12db 100644
--- a/android/java/org/chromium/chrome/browser/app/BraveActivity.java
+++ b/android/java/org/chromium/chrome/browser/app/BraveActivity.java
@@ -430,7 +430,7 @@ public abstract class BraveActivity extends ChromeActivity
} else if (id == R.id.set_default_browser) {
BraveSetDefaultBrowserUtils.showBraveSetDefaultBrowserDialog(BraveActivity.this, true);
} else if (id == R.id.brave_rewards_id) {
- openNewOrSelectExistingTab(BRAVE_REWARDS_SETTINGS_URL);
+ showRewardsPage();
} else if (id == R.id.brave_wallet_id) {
openBraveWallet(false, false, false);
} else if (id == R.id.brave_playlist_id) {
@@ -2110,6 +2110,14 @@ public abstract class BraveActivity extends ChromeActivity
}
}
+ public void showRewardsPage() {
+ if (BraveRewardsHelper.shouldShowNewRewardsUI()) {
+ getBraveToolbarLayout().showRewardsPage();
+ } else {
+ openNewOrSelectExistingTab(BRAVE_REWARDS_SETTINGS_URL);
+ }
+ }
+
public static ChromeTabbedActivity getChromeTabbedActivity() {
return (ChromeTabbedActivity) getActivityOfType(ChromeTabbedActivity.class);
}
diff --git a/android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabActivity.java b/android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabActivity.java
new file mode 100644
index 00000000000..c7ac84e0563
--- /dev/null
+++ b/android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabActivity.java
@@ -0,0 +1,119 @@
+/* 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.customtabs;
+
+import static androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_DARK;
+import static androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_LIGHT;
+
+import static org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider.EXTRA_UI_TYPE;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.provider.Browser;
+import android.view.View;
+
+import androidx.browser.customtabs.CustomTabsIntent;
+
+import org.chromium.base.IntentUtils;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabController;
+import org.chromium.chrome.browser.customtabs.features.minimizedcustomtab.CustomTabMinimizationManagerHolder;
+import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator;
+import org.chromium.chrome.browser.ui.RootUiCoordinator;
+import org.chromium.ui.util.ColorUtils;
+
+/** New Rewards 3.0 custom tab activity */
+public class FullScreenCustomTabActivity extends CustomTabActivity {
+
+ private BaseCustomTabRootUiCoordinator mBaseCustomTabRootUiCoordinator;
+ private CustomTabToolbarCoordinator mToolbarCoordinator;
+ private BrowserServicesIntentDataProvider mIntentDataProvider;
+ private CustomTabActivityTabController mTabController;
+ private CustomTabMinimizationManagerHolder mMinimizationManagerHolder;
+ private CustomTabFeatureOverridesManager mCustomTabFeatureOverridesManager;
+
+ @Override
+ public boolean supportsAppMenu() {
+ return false;
+ }
+
+ @Override
+ public void performPostInflationStartup() {
+ super.performPostInflationStartup();
+
+ View toolbarContainer = findViewById(R.id.toolbar_container);
+ if (toolbarContainer != null) {
+ toolbarContainer.setVisibility(View.GONE);
+ }
+ }
+
+ public static void showPage(Context context, String url) {
+ Intent intent = new Intent();
+ intent.setAction(Intent.ACTION_VIEW);
+ intent.setClassName(context, FullScreenCustomTabActivity.class.getName());
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.putExtra(CustomTabsIntent.EXTRA_TITLE_VISIBILITY_STATE, CustomTabsIntent.NO_TITLE);
+ intent.putExtra(CustomTabsIntent.EXTRA_ENABLE_URLBAR_HIDING, false);
+ intent.putExtra(
+ CustomTabsIntent.EXTRA_COLOR_SCHEME,
+ ColorUtils.inNightMode(context) ? COLOR_SCHEME_DARK : COLOR_SCHEME_LIGHT);
+ intent.setData(Uri.parse(url));
+ intent.setPackage(context.getPackageName());
+ intent.putExtra(
+ EXTRA_UI_TYPE, BrowserServicesIntentDataProvider.CustomTabsUiType.INFO_PAGE);
+ intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
+ if (!(context instanceof Activity)) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ IntentUtils.addTrustedIntentExtras(intent);
+
+ context.startActivity(intent);
+ }
+
+ @Override
+ protected RootUiCoordinator createRootUiCoordinator() {
+ mBaseCustomTabRootUiCoordinator =
+ new FullScreenCustomTabRootUiCoordinator(
+ this,
+ getShareDelegateSupplier(),
+ getActivityTabProvider(),
+ mTabModelProfileSupplier,
+ mBookmarkModelSupplier,
+ mTabBookmarkerSupplier,
+ getTabModelSelectorSupplier(),
+ getBrowserControlsManager(),
+ getWindowAndroid(),
+ getLifecycleDispatcher(),
+ getLayoutManagerSupplier(),
+ /* menuOrKeyboardActionController= */ this,
+ this::getActivityThemeColor,
+ getModalDialogManagerSupplier(),
+ /* appMenuBlocker= */ this,
+ this::supportsAppMenu,
+ this::supportsFindInPage,
+ getTabCreatorManagerSupplier(),
+ getFullscreenManager(),
+ getCompositorViewHolderSupplier(),
+ getTabContentManagerSupplier(),
+ this::getSnackbarManager,
+ mEdgeToEdgeControllerSupplier,
+ getActivityType(),
+ this::isInOverviewMode,
+ /* appMenuDelegate= */ this,
+ /* statusBarColorProvider= */ this,
+ getIntentRequestTracker(),
+ () -> mToolbarCoordinator,
+ () -> mIntentDataProvider,
+ mBackPressManager,
+ () -> mTabController,
+ () -> mMinimizationManagerHolder.getMinimizationManager(),
+ () -> mCustomTabFeatureOverridesManager,
+ getBaseChromeLayout(),
+ getEdgeToEdgeManager());
+ return mBaseCustomTabRootUiCoordinator;
+ }
+}
diff --git a/android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabRootUiCoordinator.java b/android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabRootUiCoordinator.java
new file mode 100644
index 00000000000..b28a53c0143
--- /dev/null
+++ b/android/java/org/chromium/chrome/browser/customtabs/FullScreenCustomTabRootUiCoordinator.java
@@ -0,0 +1,132 @@
+/* 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.customtabs;
+
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.base.supplier.Supplier;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ActivityTabProvider;
+import org.chromium.chrome.browser.back_press.BackPressManager;
+import org.chromium.chrome.browser.bookmarks.BookmarkModel;
+import org.chromium.chrome.browser.bookmarks.TabBookmarker;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.compositor.CompositorViewHolder;
+import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
+import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabController;
+import org.chromium.chrome.browser.customtabs.features.minimizedcustomtab.CustomTabMinimizeDelegate;
+import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator;
+import org.chromium.chrome.browser.flags.ActivityType;
+import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
+import org.chromium.chrome.browser.fullscreen.FullscreenManager;
+import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.share.ShareDelegate;
+import org.chromium.chrome.browser.tab_ui.TabContentManager;
+import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.ui.appmenu.AppMenuBlocker;
+import org.chromium.chrome.browser.ui.appmenu.AppMenuDelegate;
+import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController;
+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
+import org.chromium.chrome.browser.ui.system.StatusBarColorController.StatusBarColorProvider;
+import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeManager;
+import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController;
+import org.chromium.ui.base.ActivityWindowAndroid;
+import org.chromium.ui.base.IntentRequestTracker;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+
+import java.util.function.BooleanSupplier;
+
+public class FullScreenCustomTabRootUiCoordinator extends BaseCustomTabRootUiCoordinator {
+
+ public FullScreenCustomTabRootUiCoordinator(
+ @NonNull AppCompatActivity activity,
+ @NonNull ObservableSupplier shareDelegateSupplier,
+ @NonNull ActivityTabProvider tabProvider,
+ @NonNull ObservableSupplier profileSupplier,
+ @NonNull ObservableSupplier bookmarkModelSupplier,
+ @NonNull ObservableSupplier tabBookmarkerSupplier,
+ @NonNull ObservableSupplier tabModelSelectorSupplier,
+ @NonNull BrowserControlsManager browserControlsManager,
+ @NonNull ActivityWindowAndroid windowAndroid,
+ @NonNull ActivityLifecycleDispatcher activityLifecycleDispatcher,
+ @NonNull ObservableSupplier layoutManagerSupplier,
+ @NonNull MenuOrKeyboardActionController menuOrKeyboardActionController,
+ @NonNull Supplier activityThemeColorSupplier,
+ @NonNull ObservableSupplier modalDialogManagerSupplier,
+ @NonNull AppMenuBlocker appMenuBlocker,
+ @NonNull BooleanSupplier supportsAppMenuSupplier,
+ @NonNull BooleanSupplier supportsFindInPage,
+ @NonNull Supplier tabCreatorManagerSupplier,
+ @NonNull FullscreenManager fullscreenManager,
+ @NonNull ObservableSupplier compositorViewHolderSupplier,
+ @NonNull Supplier tabContentManagerSupplier,
+ @NonNull Supplier snackbarManagerSupplier,
+ @NonNull ObservableSupplierImpl edgeToEdgeControllerSupplier,
+ @ActivityType int activityType,
+ @NonNull Supplier isInOverviewModeSupplier,
+ @NonNull AppMenuDelegate appMenuDelegate,
+ @NonNull StatusBarColorProvider statusBarColorProvider,
+ @NonNull IntentRequestTracker intentRequestTracker,
+ @NonNull Supplier customTabToolbarCoordinator,
+ @NonNull Supplier intentDataProvider,
+ @NonNull BackPressManager backPressManager,
+ @NonNull Supplier tabController,
+ @NonNull Supplier minimizeDelegateSupplier,
+ @NonNull Supplier featureOverridesManagerSupplier,
+ @Nullable View baseChromeLayout,
+ @NonNull EdgeToEdgeManager edgeToEdgeManager) {
+ super(
+ activity,
+ shareDelegateSupplier,
+ tabProvider,
+ profileSupplier,
+ bookmarkModelSupplier,
+ tabBookmarkerSupplier,
+ tabModelSelectorSupplier,
+ browserControlsManager,
+ windowAndroid,
+ activityLifecycleDispatcher,
+ layoutManagerSupplier,
+ menuOrKeyboardActionController,
+ activityThemeColorSupplier,
+ modalDialogManagerSupplier,
+ appMenuBlocker,
+ supportsAppMenuSupplier,
+ supportsFindInPage,
+ tabCreatorManagerSupplier,
+ fullscreenManager,
+ compositorViewHolderSupplier,
+ tabContentManagerSupplier,
+ snackbarManagerSupplier,
+ edgeToEdgeControllerSupplier,
+ activityType,
+ isInOverviewModeSupplier,
+ appMenuDelegate,
+ statusBarColorProvider,
+ intentRequestTracker,
+ customTabToolbarCoordinator,
+ intentDataProvider,
+ backPressManager,
+ tabController,
+ minimizeDelegateSupplier,
+ featureOverridesManagerSupplier,
+ baseChromeLayout,
+ edgeToEdgeManager);
+ }
+
+ @Override
+ public int getControlContainerHeightResource() {
+ return R.dimen.full_screen_custom_tabs_control_container_height;
+ }
+}
diff --git a/android/java/org/chromium/chrome/browser/toolbar/BraveToolbarManager.java b/android/java/org/chromium/chrome/browser/toolbar/BraveToolbarManager.java
index 56f30d4ce03..77ca9dab3a5 100644
--- a/android/java/org/chromium/chrome/browser/toolbar/BraveToolbarManager.java
+++ b/android/java/org/chromium/chrome/browser/toolbar/BraveToolbarManager.java
@@ -33,6 +33,7 @@ import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsV
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager;
+import org.chromium.chrome.browser.customtabs.FullScreenCustomTabActivity;
import org.chromium.chrome.browser.data_sharing.DataSharingTabManager;
import org.chromium.chrome.browser.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.findinpage.FindToolbarManager;
@@ -455,6 +456,12 @@ public class BraveToolbarManager extends ToolbarManager {
setBraveBottomControlsVisible(isBraveBottomControlsVisible);
}
+ if (mActivity instanceof FullScreenCustomTabActivity) {
+ // When rewards page is shown on rotated screen we don't care about
+ // the toolbar.
+ return;
+ }
+
if (mActivity instanceof BraveActivity) {
((BraveActivity) mActivity).updateBottomSheetPosition(mCurrentOrientation);
}
diff --git a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayoutImpl.java b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayoutImpl.java
index 8b1a9308b66..4384afa6cdd 100644
--- a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayoutImpl.java
+++ b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayoutImpl.java
@@ -58,6 +58,7 @@ import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.brave_stats.BraveStatsUtil;
import org.chromium.chrome.browser.crypto_wallet.controller.DAppsWalletController;
import org.chromium.chrome.browser.custom_layout.popup_window_tooltip.PopupWindowTooltip;
+import org.chromium.chrome.browser.customtabs.FullScreenCustomTabActivity;
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar;
import org.chromium.chrome.browser.dialogs.BraveAdsSignupDialog;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -122,6 +123,7 @@ import org.chromium.url.GURL;
import org.chromium.url.mojom.Url;
import java.net.URL;
+import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@@ -183,6 +185,7 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
private int mCurrentToolbarColor;
private boolean mIsPublisherVerified;
+ private String mPublisherId;
private boolean mIsNotificationPosted;
private boolean mIsInitialNotificationPosted; // initial red circle notification
@@ -459,7 +462,6 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
if (mBraveRewardsNativeWorker != null) {
mBraveRewardsNativeWorker.addObserver(this);
mBraveRewardsNativeWorker.addPublisherObserver(this);
- mBraveRewardsNativeWorker.triggerOnNotifyFrontTabUrlChanged();
mBraveRewardsNativeWorker.getAllNotifications();
}
}
@@ -505,6 +507,7 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
mBraveShieldsHandler.clearBraveShieldsCount(tab.getId());
dismissShieldsTooltip();
hidePlaylistButton();
+ mPublisherId = "";
}
@Override
@@ -536,13 +539,17 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
@Override
public void onDidFinishNavigationInPrimaryMainFrame(
Tab tab, NavigationHandle navigation) {
+ if (mBraveRewardsNativeWorker != null) {
+ mBraveRewardsNativeWorker.triggerOnNotifyFrontTabUrlChanged();
+ }
if (getToolbarDataProvider().getTab() == tab
&& mBraveRewardsNativeWorker != null
&& !tab.isIncognito()) {
mBraveRewardsNativeWorker.onNotifyFrontTabUrlChanged(
tab.getId(), tab.getUrl().getSpec());
}
- if (PackageUtils.isFirstInstall(getContext())
+ if (!BraveRewardsHelper.shouldShowNewRewardsUI()
+ && PackageUtils.isFirstInstall(getContext())
&& tab.getUrl().getSpec() != null
&& tab.getUrl()
.getSpec()
@@ -1067,8 +1074,13 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
}
hideRewardsOnboardingIcon();
OnboardingPrefManager.getInstance().setOnboardingShown(true);
- mRewardsPopup = new BraveRewardsPanel(v);
- mRewardsPopup.showLikePopDownMenu();
+ if (BraveRewardsHelper.shouldShowNewRewardsUI()) {
+ showRewardsPage();
+ } else {
+ mRewardsPopup = new BraveRewardsPanel(v);
+ mRewardsPopup.showLikePopDownMenu();
+ }
+
if (mBraveRewardsNotificationsCount.isShown()) {
ChromeSharedPreferences.getInstance()
.writeBoolean(
@@ -1088,6 +1100,14 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
}
}
+ public void showRewardsPage() {
+ String rewardsUrl = BraveActivity.BRAVE_REWARDS_SETTINGS_URL + "?bubble";
+ if (mPublisherId != null && !mPublisherId.isEmpty()) {
+ rewardsUrl += "&creator=" + URLEncoder.encode(mPublisherId);
+ }
+ FullScreenCustomTabActivity.showPage(getContext(), rewardsUrl);
+ }
+
private void maybeShowWalletPanel() {
try {
BraveActivity activity = BraveActivity.getBraveActivity();
@@ -1347,7 +1367,9 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
public void onCompleteReset(boolean success) {
if (success) {
BraveRewardsHelper.resetRewards();
- showOrHideRewardsBadge(false);
+ if (!BraveRewardsHelper.shouldShowNewRewardsUI()) {
+ showOrHideRewardsBadge(false);
+ }
}
}
@@ -1447,13 +1469,13 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
}
/**
- * BraveRewardsNativeWorker.PublisherObserver:
- * Update a 'verified publisher' checkmark on url bar BAT icon only if
- * no notifications are posted.
+ * BraveRewardsNativeWorker.PublisherObserver: Update a 'verified publisher' checkmark on url
+ * bar BAT icon only if no notifications are posted.
*/
@Override
- public void onFrontTabPublisherChanged(boolean verified) {
+ public void onFrontTabPublisherChanged(boolean verified, String publisherId) {
mIsPublisherVerified = verified;
+ mPublisherId = publisherId;
updateVerifiedPublisherMark();
}
diff --git a/android/java/org/chromium/chrome/browser/util/TabUtils.java b/android/java/org/chromium/chrome/browser/util/TabUtils.java
index 19c79a8ef61..2d5ebea6cf1 100644
--- a/android/java/org/chromium/chrome/browser/util/TabUtils.java
+++ b/android/java/org/chromium/chrome/browser/util/TabUtils.java
@@ -27,6 +27,8 @@ import androidx.browser.customtabs.CustomTabsIntent;
import androidx.core.content.ContextCompat;
import androidx.core.view.MenuCompat;
+import org.jni_zero.CalledByNative;
+
import org.chromium.base.IntentUtils;
import org.chromium.base.Log;
import org.chromium.base.supplier.ObservableSupplier;
@@ -279,6 +281,12 @@ public class TabUtils {
}
}
+ /**
+ * Brings the ChromeTabbedActivity to the foreground of the screen. Creates an intent that
+ * clears the activity stack and brings ChromeTabbedActivity to the top with ACTION_VIEW.
+ *
+ * @param activity The activity context used to create and start the intent
+ */
public static void bringChromeTabbedActivityToTheTop(Activity activity) {
Intent braveActivityIntent = new Intent(activity, ChromeTabbedActivity.class);
braveActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
@@ -296,6 +304,14 @@ public class TabUtils {
TabUtils.bringChromeTabbedActivityToTheTop(activity);
}
+ /**
+ * Opens a URL in a new or existing tab using BraveActivity. This method attempts to open the
+ * URL in BraveActivity and bring it to the foreground. If BraveActivity cannot be found, logs
+ * an error.
+ *
+ * @param url The URL to open in BraveActivity
+ */
+ @CalledByNative
public static void openURLWithBraveActivity(String url) {
try {
BraveActivity activity = BraveActivity.getBraveActivity();
diff --git a/android/java/res/values/brave_dimens.xml b/android/java/res/values/brave_dimens.xml
index c16893d1827..c36c1eca63d 100644
--- a/android/java/res/values/brave_dimens.xml
+++ b/android/java/res/values/brave_dimens.xml
@@ -33,6 +33,8 @@
30dp
15dp
+ 0dp
+
32dp
103dp
diff --git a/android/java/res/values/brave_styles.xml b/android/java/res/values/brave_styles.xml
index 49edf504604..8425b298218 100644
--- a/android/java/res/values/brave_styles.xml
+++ b/android/java/res/values/brave_styles.xml
@@ -303,6 +303,17 @@
- @anim/slide_out_bottom
+
+
+
+