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 + + + +