removed: onVisitComplete
added: surfaceId
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/69824f1f754963700f7b97e6be05a8a9f58a4eb0
commit 69824f1f754963700f7b97e6be05a8a9f58a4eb0
Author: Xi Han <hanxi@google.com>
Date: Fri Apr 3 05:15:55 2026 -0700
[Memory] Refactor NavigationRecorder.
In this CL, we fix the issue that FeedStream can't be released from
memory after NTP navigates. This is due to a NavigationRecorder being
created when a NTP navigates, and it has a callback which keeps a
reference FeedSurfaceRendererBridge to log the duration of users
reading a card. The callback won't be called until a new Tab is
created, i.e. leaving the current Tab, and #onHidden() is called.
This leads to the FeedStream remain in memory after feeds is closed.
In this CL, we add NavigationRecorder in C++ which calls the FeedApi
directly to log the metrics. It no longer has a reference to the
FeedSurfaceRendererBridge, and FeedStream can be released after the
NTP navigates. FeedStream's memory foot print is cleaned up after
leaving NTPs: http://shortn/_3DjIXJjzfY.
This CL also fixes a visiting time logging issue. If the Tab never
becomes foreground (mStartTimeMs == 0), we will log 0 for visit
duration.
Bug: 487641528, 493844946
Change-Id: I34af7d2308d6ed070dff8ac52d11f17ae0977449
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7728181
Commit-Queue: Xi Han <hanxi@chromium.org>
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Reviewed-by: Dan Harrington <harringtond@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1609755}
Now it is NullableObservableSupplier, missed old change
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/416a61c418c152a7a7ae568d89302e5ecb6e4a3d
commit 416a61c418c152a7a7ae568d89302e5ecb6e4a3d
Author: Andrew Grieve <agrieve@chromium.org>
Date: Tue Dec 2 14:13:59 2025 -0800
Android: Split ObservableSupplier into Nullable / Monotonic / NonNull variants
The goal is to use proper @Nullable annotations with
ObservableSuppliers.
To achieve this, we use interfaces that define nullness:
* (Settable)NullableObservableSupplier
* (Settable)ObservableSupplier <-- monotonic
* (Settable)NonNullObservableSupplier
And we have ObservableSupplierImpl implement all of them.
In order to make this migration manageable, I've marked the interfaces
as @NullUnmarked, and will fix annotations in batches until they
can be marked @NullMarked.
This CL includes a batch in order to test out the new interfaces (and
because many were necessary to make the change).
Monotonic suppliers are by far the most common afaict, so that's why
the non-prefixed ObservableSupplier is the monotonic one (that, and
because "Monotonic" is a mouthful).
One implication of this approach is that we'll never have:
ObservableSupplier<@Nullable Foo>
We'd have instead:
NullableObservableSupplier<Foo>
Having the nullness in the interface rather than in the generic
allows for defining toNonNull() only on monotonic suppliers, and
simplifies the implementation.
Bug: 455874046
Change-Id: Id48e235b9ff16a5b21a9c1199863150d17c22736
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7206746
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Owners-Override: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1553094}
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/f85df3955cb3bcc7d90cf0af71458e5cad9d45cc
1. NewTabPage.initializeMainView renamed to
initializeFeedSurfaceProvider
2. Some code from NewTabPage.initializeMainView
was moved to c-tor
commit f85df3955cb3bcc7d90cf0af71458e5cad9d45cc
Author: Xi Han <hanxi@google.com>
Date: Mon Mar 30 09:06:59 2026 -0700
[NtpRefactor] Polish NewTabPageCoordinator.
1. Move several parameters passed in NewTabPageCoordinator#initialize()
to the constructor. This allows to set multiple member variables as
final variables.
2. Add missing @Nullable to member variables and add null check in
code for them. This includes: mSearchBoxCoorinator, mUiConfig etc.
3. Re-arange the sequencings in #destroy(): the last created object is
destroyed first.
Bug: 487641528
Change-Id: I935e3aee111a6fd816a228f004f7b1d9663d03d6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7709015
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Commit-Queue: Xi Han <hanxi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1607137}
- isOpenInOtherWindowSupported removed;
- isLinkNavigationToNewWindowSupported added;
- isLinkNavigationToIncognitoWindowSupported added.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/8ebbccb8137c4b44999c92edfb971e821d9365ba
commit 8ebbccb8137c4b44999c92edfb971e821d9365ba
Author: Aishwarya Rajesh <aishwaryarj@google.com>
Date: Mon Mar 30 11:44:27 2026 -0700
Update conditions for "Move to other window" / "Move to new window"
visibility on context menus for link navigation
The CL creates / updates utility methods in MultiWindowUtils to
determine when these options are shown on a link context menu per latest
recommendations:
- Open in new window
- Open in Incognito window
- Open in other window
The updates in this CL ensure that either "Open in new window" or "Open
in other window" (not both) are visible on the menu. Both options will
invoke the same codepath currently, this will be updated in fast-follow
CLs.
Bug: 475571336
Change-Id: I33a597703e634a7d5cd2d6b66c4c2ca9254374ef
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7680970
Reviewed-by: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: Sirisha Kavuluru <skavuluru@google.com>
Commit-Queue: Aishwarya Rajesh <aishwaryarj@google.com>
Reviewed-by: Shu Yang <shuyng@google.com>
Cr-Commit-Position: refs/heads/main@{#1607263}
New arg bringToFront
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/15b60a7f51080d75b18d37f6bbf83a7a39151c15
commit 15b60a7f51080d75b18d37f6bbf83a7a39151c15
Author: Lijin Shen <lazzzis@google.com>
Date: Fri Mar 27 14:06:30 2026 -0700
tabs.move on Android: allow moving tabs in the background
Fixes a behavior discrepancy between Android and Desktop when moving
tabs between windows via the extension API (e.g., chrome.tabs.move).
Currently on Android, the destination window is always brought to the
front
Added a bringToFront boolean parameter to conditionally controls the
call to ApiCompatibilityUtils.moveTaskToFront(). This defaults to true
such that this CL won't bring any behavior change. This sets false in
TabModelSelectorImpl.java such that tab.move won't activate the
destination window.
Bug: 495516043
Change-Id: I60e7b42794c240023669afcf3cd15f8031c16ded
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7685707
Reviewed-by: Linyu He <linyuh@google.com>
Reviewed-by: Aishwarya Rajesh <aishwaryarj@google.com>
Commit-Queue: Lijin Shen <lazzzis@google.com>
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1606471}
Upstream moved isTabModelRestored() into the TabGroupModelFilter
interface, which TabModel now extends, making the previously
private method in BraveTabCollectionTabModelImplBase conflict
with the now-public interface method.
Error message:
../../brave/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCollectionTabModelImplBase.java:61: error: isTabModelRestored() in BraveTabCollectionTabModelImplBase cannot implement isTabModelRestored() in TabGroupModelFilter
private boolean isTabModelRestored() {
^
attempting to assign weaker access privileges; was public
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/401697a07af594e4420ef1f4998d13f43533874f
commit 401697a07af594e4420ef1f4998d13f43533874f
Author: Jingping Sun <jings@microsoft.com>
Date: Fri Mar 27 10:23:32 2026 -0700
[TabModel] Make TabModel extend TabGroupModelFilter
As part of combining these interfaces this CL is the first step.
* IncognitoTabGroupModelFilterImpl is inlined onto
IncognitoTabModelImpl.
* StubTabGroupModelFilterImpl is no longer required.
* EmptyTabModel now has stub methods for TabGroupModelFilter.
BYPASS_LARGE_CHANGE_WARNING: all stub methods
Bug: 463685717, 476144237, 493519189
Change-Id: Ia27c3a355f92da60cdb3c1e8ac9fabe892b49bc0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7684470
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Reviewed-by: Sky Malice <skym@chromium.org>
Commit-Queue: Jingping Sun <jings@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1606333}
New args:
signinAndHistorySyncActivityLauncher;
activityResultTracker;
modalDialogManagerSupplier;
snackbarManager.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/0af385e0296806bb278d2c4b73e7e652d310def5
commit 0af385e0296806bb278d2c4b73e7e652d310def5
Author: quacksort <quacksort@google.com>
Date: Tue Mar 24 06:59:26 2026 -0700
[Signin][Android] Migrate send tab to self sign-in to activity-less flow
This is part of the effort to reduce reliance on
SigninAndHistorySyncActivity by sign-in entry points.
go/activityless-signin
The new flow uses BottomSheetSigninAndHistorySyncCoordinator to handle
the sign-in process, avoiding the need to launch a separate activity.
Bug: 478814334
Change-Id: I0448875de416af5e3e48d1ac5f2eeb3d18e6efcc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7647173
Reviewed-by: Anton Goncharenko <agonch@google.com>
Commit-Queue: Lucia Giorgi <quacksort@google.com>
Cr-Commit-Position: refs/heads/main@{#1604087}
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/040e46a7c7697d0eb32e58b30a39e9822d045d81
commit 040e46a7c7697d0eb32e58b30a39e9822d045d81
Author: Xi Han <hanxi@google.com>
Date: Wed Mar 11 18:33:45 2026 -0700
[NtpRefactor] Split NewTabPageLayout into NewTabPageCoordinator and
layout.
This is a refactor CL without any behavior changes. In this CL:
1. Split major logic from NewTabPageLayout to NewTabPageCoordinator,
only Layout implementations remains in the NewTabPageLayout;
2. To preserve the renaming history, temporarily renaming
NewTabPageLayout to NtpLayout. We will rename back in follow up CL
https://crrev.com/c/7658503.
Design doc: go/ntp-mvc-refactor.
Bug: 487641528
Bypass-Check-License: NewTabPageCoordinator is a renamed from NewTabPageLayout.
Change-Id: Ief8fd9b048696a875ccd8167421d88ad2e667f04
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7658403
Commit-Queue: Xi Han <hanxi@chromium.org>
Reviewed-by: Xinyi Ji <xinyiji@chromium.org>
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1598132}
Used MultiInstanceOrchestratorImpl override.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/1eff3e2dfcb821e6a6fbccae543632bb5ebbce98
commit 1eff3e2dfcb821e6a6fbccae543632bb5ebbce98
Author: Aishwarya Rajesh <aishwaryarj@google.com>
Date: Wed Mar 18 15:32:23 2026 -0700
[MIR] Create MultiInstanceOrchestrator as a singleton to hold business
logic that is not scoped to a specific ChromeTabbedActivity
This CL attempts to simplify accessing multi-instance business logic
from callers that do not have access to a MultiInstanceManager instance
(for example, CCT context based feature implementations), by introducing
a MultiInstanceOrchestrator singleton implementation.
The CL only moves method moveTabsToWindowByIdChecked() as an initial
example for usage of this class. Other MultiInstanceManager API methods
that can be extracted into the singleton will be moved in followup CLs.
Bug: 491893859
Change-Id: I459a5ed79b058b548f42fd3c85f0b9382e756803
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7659642
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Commit-Queue: Aishwarya Rajesh <aishwaryarj@google.com>
Cr-Commit-Position: refs/heads/main@{#1601584}
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/1eff3e2dfcb821e6a6fbccae543632bb5ebbce98
commit 1eff3e2dfcb821e6a6fbccae543632bb5ebbce98
Author: Aishwarya Rajesh <aishwaryarj@google.com>
Date: Wed Mar 18 15:32:23 2026 -0700
[MIR] Create MultiInstanceOrchestrator as a singleton to hold business
logic that is not scoped to a specific ChromeTabbedActivity
This CL attempts to simplify accessing multi-instance business logic
from callers that do not have access to a MultiInstanceManager instance
(for example, CCT context based feature implementations), by introducing
a MultiInstanceOrchestrator singleton implementation.
The CL only moves method moveTabsToWindowByIdChecked() as an initial
example for usage of this class. Other MultiInstanceManager API methods
that can be extracted into the singleton will be moved in followup CLs.
Bug: 491893859
Change-Id: I459a5ed79b058b548f42fd3c85f0b9382e756803
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7659642
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Commit-Queue: Aishwarya Rajesh <aishwaryarj@google.com>
Cr-Commit-Position: refs/heads/main@{#1601584}
Removed PREF_LOYALTY_CARDS from preferences.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/9d45f2f1f7f2f4e07a9ebf93be1873fd2bc34109
commit 9d45f2f1f7f2f4e07a9ebf93be1873fd2bc34109
Author: Norge Vizcay <vizcay@google.com>
Date: Fri Mar 13 07:52:52 2026 -0700
Remove kAutofillEnableLoyaltyCardsFilling feature flag
The AutofillEnableLoyaltyCardsFilling feature has been launched.
This CL removes the feature flag and all related code/tests that
were conditionally enabled by it. All loyalty card filling
functionality is now enabled by default.
Bug: 395831853
Test: CQ passes
Change-Id: I1a686fcdf1724138ade660229b54760d563f4d66
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7661784
Reviewed-by: Christoph Schwering <schwering@google.com>
Reviewed-by: Florian Leimgruber <fleimgruber@google.com>
Commit-Queue: Norge Vizcay <vizcay@google.com>
Cr-Commit-Position: refs/heads/main@{#1599049}
Seven new parameters added to TopToolbarCoordinator constructor after
MonotonicObservableSupplier<Profile>:
- SigninAndHistorySyncActivityLauncher
- WindowAndroid
- ActivityResultTracker
- DeviceLockActivityLauncher
- BottomSheetController
- ModalDialogManager
- SnackbarManager
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/c0e37322747db4f16956a53ff936c85905593c3b
commit c0e37322747db4f16956a53ff936c85905593c3b
Author: Sophie Crowley <crowleso@google.com>
Date: Wed Mar 11 10:30:11 2026 -0700
[Signin][Android] Add piping for Signin button onclick functionality
This will be immediately followed by its child CL
https://crrev.com/c/7604273 which uses all of these dependencies in
adding Seamless Signin + settings onclick functionality for this Signin
button. Split CL for ease of review. Adapted from
IdentityDiscController.java
Bug: 478828569
Change-Id: I600617b391ac061000998b1820ba573a57079e86
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7600378
Commit-Queue: Sophie Crowley <crowleso@google.com>
Reviewed-by: Liza Bipin <mlbipin@google.com>
Cr-Commit-Position: refs/heads/main@{#1597857}
Two new parameters added to ToolbarManager constructor between
WindowAndroid and OneshotSupplier<ChromeAndroidTask>:
- ActivityResultTracker
- DeviceLockActivityLauncher
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/c0e37322747db4f16956a53ff936c85905593c3b
commit c0e37322747db4f16956a53ff936c85905593c3b
Author: Sophie Crowley <crowleso@google.com>
Date: Wed Mar 11 10:30:11 2026 -0700
[Signin][Android] Add piping for Signin button onclick functionality
This will be immediately followed by its child CL
https://crrev.com/c/7604273 which uses all of these dependencies in
adding Seamless Signin + settings onclick functionality for this Signin
button. Split CL for ease of review. Adapted from
IdentityDiscController.java
Bug: 478828569
Change-Id: I600617b391ac061000998b1820ba573a57079e86
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7600378
Commit-Queue: Sophie Crowley <crowleso@google.com>
Reviewed-by: Liza Bipin <mlbipin@google.com>
Cr-Commit-Position: refs/heads/main@{#1597857}
SnapScrollHelperImpl constructor changed to accept NewTabPageCoordinator
instead of NewTabPageLayout. Added mNewTabPageCoordinator shadow field to
BraveNewTabPage and create it in initializeMainView after inflating the
layout.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/040e46a7c7697d0eb32e58b30a39e9822d045d81
commit 040e46a7c7697d0eb32e58b30a39e9822d045d81
Author: Xi Han <hanxi@google.com>
Date: Wed Mar 11 18:33:45 2026 -0700
[NtpRefactor] Split NewTabPageLayout into NewTabPageCoordinator and
layout.
This is a refactor CL without any behavior changes. In this CL:
1. Split major logic from NewTabPageLayout to NewTabPageCoordinator,
only Layout implementations remains in the NewTabPageLayout;
2. To preserve the renaming history, temporarily renaming
NewTabPageLayout to NtpLayout. We will rename back in follow up CL
https://crrev.com/c/7658503.
Design doc: go/ntp-mvc-refactor.
Bug: 487641528
Bypass-Check-License: NewTabPageCoordinator is a renamed from NewTabPageLayout.
Change-Id: Ief8fd9b048696a875ccd8167421d88ad2e667f04
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7658403
Commit-Queue: Xi Han <hanxi@chromium.org>
Reviewed-by: Xinyi Ji <xinyiji@chromium.org>
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1598132}
From `MonotonicObservableSupplier` to `OneshotSupplier`
Chromim change:
https://source.chromium.org/chromium/chromium/src/+/1886db4b40ccf9dfad5270be7861fefbb44c5ed3
commit 1886db4b40ccf9dfad5270be7861fefbb44c5ed3
Author: Anton Goncharenko <agonch@google.com>
Date: Tue Mar 10 17:49:16 2026 -0700
[Signin][Android] SafetyHub: Wait for UI dependencies before initializing sign-in coordinator.
For consistency with other fragments' provided dependencies, pass
Suppliers to SafetyHubModuleDelegateImpl rather than assuming the
Suppliers have already been initialized. Able to repro a
NullPointerException (WindowAndroid not being initialized) during
Activity recreation when killing Chrome during the "add new account"
sign-in flow (see repro steps in crbug.com/479179162).
Bug: 479179162
Change-Id: I8a37a6a532cf5d4650849ec86151e1ee9c9ee0f2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7642808
Reviewed-by: Menghan Yang <myuu@google.com>
Commit-Queue: Anton Goncharenko <agonch@google.com>
Reviewed-by: Zaina Al-Mashni <zalmashni@google.com>
Reviewed-by: Jinsuk Kim <jinsukkim@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1597438}
* [Android] Fixed containment at settings
Resolves https://github.com/brave/brave-browser/issues/54164
* Fixed containment for the Homepage settings screen
* Fixed containment for WebRTC policy screen
* Fixed containment at Languages settings; modified SettingsUtils.getVisiblePreferences
* Fixed privacy item
* Fixed containment for NFT discovery learn more preference
Replaced TextMessagePreference (BackgroundStyle.NONE, transparent) with
ChromeBasePreference so the NFT description groups with the Enable NFT
discovery toggle in one card. Follows the same camera OS-warning pattern:
ForegroundColorSpan for the link color, setOnPreferenceClickListener for
the tap action, matching Chromium upstream conventions.
* Moved NFT discovery block before Reset wallet preference
Enable NFT discovery toggle and its description now appear above
"Reset and clear wallet data", matching the intended UX order.
* Fixed containment for Brave Firewall + VPN settings
Set initial visibility of server_change_location in onCreatePreferences
to avoid animated removal artifact. Call notifyPreferencesUpdated() after
dynamic visibility changes in updateSummaries so containment styles stay
in sync with adapter positions.
* Fixed containment for New Tab Page settings learn more
Replaced ClickableSpansTextMessagePreference with ChromeBasePreference
for the sponsored images learn more link so it groups into the
Background Images card with the toggles above it.
* Removed On/Off captions from New Tab Page switch prefs
The Survey Panelist toggle and its "Learn more" row remained visible
under Settings -> Brave Shields & privacy for users with an active
Brave Origin subscription.
Extend the existing BRAVE_NTP_BRANDED_WALLPAPER_SURVEY_PANELIST
feature-flag gate in BravePrivacySettings to also require
!BraveOriginSubscriptionPrefs.getIsCredentialSummaryActiveCached() for
both the preference visibility and the settings-search index entry.
Resolves: https://github.com/brave/brave-browser/issues/54853
ShortcutsBackend initializes asynchronously. When clearBrowsingData() was
called during startup, the backend was still in the INITIALIZING state and
its OnHistoryDeletions handler silently returned early, leaving shortcut
suggestions (clock-icon entries) intact after exit.
Fix by adding a JNI bridge (BraveShortcutsUtils.initThenRun) that waits for
ShortcutsBackend to finish its async DB init via OnShortcutsLoaded() before
invoking clearBrowsingData(). Also move the clear-on-exit call from
initializeState() to finishNativeInitialization() where the profile is
available, and add FORM_DATA (autofill) to the cleared data types.
Brave Origin subscribers on Android currently receive general-engagement
notifications and unbidden promo dialogs that are not tied to any
Origin-disabled feature. Suppress them under the product stance that
Origin users get a cleaner, promo-free experience.
Surfaces gated:
- RetentionNotificationPublisher: HOUR_3, HOUR_24, DAY_6, EVERY_SUNDAY,
and DORMANT_USERS_DAY_14/25/40 notification fire-time.
- BraveActivity: showDormantUsersEngagementDialog (cold-start and
in-foreground tap paths), India ad-free callout, YouTube-in-Brave
dialog.
The existing getIsSubscriptionActive() pref only reflects Play Store
purchases, so it misses desktop-linked subscribers. Introduce a new
Java-side cached boolean BRAVE_ORIGIN_CREDENTIAL_SUMMARY_CACHED, written
from two authoritative any-source signals:
- fetchOrderCredentials success (primes the cache immediately on a
successful Play Store purchase).
- requestCredentialSummary callback (covers Play Store and
desktop-linked paths; the Skus service resolves both internally).
BraveActivity.finishNativeInitialization now calls
requestCredentialSummary on every app start to keep the cache fresh.
Resolves: https://github.com/brave/brave-browser/issues/54791
BraveActivity shows LinkVpnSubscriptionDialogFragment when a VPN
subscription is detected on the device and the link dialog has not yet
been shown. The guard did not consult the VPN policy pref, so the dialog
was presented even to users whose VPN has been disabled by policy (e.g.
Brave Origin users with VPN turned off at the policy layer).
Add !BraveVpnPolicy.isDisabledByPolicy(mTabModelProfileSupplier.get()) to
the guard.
Resolves: https://github.com/brave/brave-browser/issues/54786
String changes in android_brave_strings.grd:
- IDS_MENU_ORIGIN: "Origin" -> "Brave Origin" (Settings menu row).
- IDS_BRAVE_ORIGIN_PREMIUM: "Origin" -> "Brave Origin" (paywall title).
- IDS_ORIGIN_LEO_AI_TOGGLE: "AI" -> "Leo AI" (toggle label
consistency with other Leo surfaces).
- IDS_ORIGIN_DESCRIPTION_BODY: drop the trailing sentence
"Origin will remove most other features from the browser."
- IDS_ORIGIN_CHANGING_BRAVE_FEATURES_MESSAGE_POST_PURCHASE:
"once Origin has finished updating." ->
"once Brave Origin has finished updating."
- IDS_ORIGIN_PAYWALL_TEXT_4: rewritten to
"One-time purchase can be activated multiple times across all
your devices".
- IDS_ORIGIN_DESCRIPTION_NOTE: removed entirely (Search Premium
note no longer shown).
Layout changes:
- brave_origin_description_preference.xml: remove the
origin_description_note TextView from the preference-screen
description block.
- activity_brave_origin_plans.xml (portrait paywall) and
layout-land/activity_brave_origin_plans.xml (landscape
paywall): remove the note TextView; body description's bottom
margin bumped from 16dp to 24dp to preserve spacing with the
next section.
Resolves: https://github.com/brave/brave-browser/issues/54761
BraveSearchEnginesPreferences.removePreferenceIfPresent was calling
getPreferenceScreen().removePreference(pref) unconditionally. That
only removes direct children of PreferenceScreen — when the target
preference is nested inside a PreferenceCategory (as send_web_discovery
is, inside currently_used_search_engines_category), the remove call
silently returns false and the toggle stays visible.
Users whose WebDiscoveryEnabled pref is managed by policy (e.g. Brave
Origin subscribers, enterprise admins) saw the toggle rendered and
greyed-out instead of being hidden entirely.
Fix: remove from the preference's actual parent group.
preference.getParent() returns the containing PreferenceGroup — the
PreferenceCategory for nested prefs, the PreferenceScreen itself for
top-level prefs. Works for both cases.
Other PREF_CUSTOM_SEARCH_ENGINES_CATEGORY caller is a top-level
PreferenceCategory; new behavior is equivalent for that case.
Resolves: https://github.com/brave/brave-browser/issues/54751
brave_rewards::IsDisabledByPolicy() was hardcoded to return false on
Android regardless of the managed kDisabledByPolicy pref, so every
native call site that gates on brave_rewards::IsSupported() failed to
suppress for Brave Origin subscribers (and enterprise admins setting
the BraveRewardsDisabled policy).
Symptoms fixed:
- Ads service kept initializing on Android for Origin profiles
(AdsServiceFactory::GetForProfile gates on IsSupported).
- NTP sponsored background images and sponsored rich-media takeover
rendered (downstream of the ads service via ViewCounterService).
- DAY_10 / DAY_30 / DAY_35 Rewards retention notifications fired
(RetentionNotificationPublisher gates on rewardsNativeWorker
.isSupported).
Java-side Rewards UI surfaces were already correctly gated via
BraveRewardsPolicy.isDisabledByPolicy(profile) and are unaffected.
Also decouples BraveVpnUtils.isRegionSupported() from
BraveRewardsNativeWorker.isSupported() — otherwise the guard flip would
cause VPN UI to hide for any profile where Rewards is policy-disabled
as a side effect. Added BraveVpnNativeWorker.isSupportedRegion that
does the OFAC region check directly via brave_l10n.
Resolves: https://github.com/brave/brave-browser/issues/54703
When a user who previously purchased Brave Origin switches devices,
verifyPurchase() at startup finds the Play Store purchase and kicks off
the SKUs createOrderFromReceipt / fetchOrderCredentials chain to obtain
an order ID. Until that chain completes, requestCredentialSummary
returns inactive, so Settings -> Brave Origin launches the paywall even
though a purchase exists and is mid-restore.
Gate handleOriginPreferenceClick on isFetchingCredentials() and route
directly to BraveOriginPreferences (which renders the fetching spinner
via its existing setCredentialsFetchedCallback path) when a restore is
in flight.
Also harden setCredentialsFetchedCallback against a lost-notification
race: after registering the callback, re-check isFetchingCredentials()
and synthesize a success notification if the fetch already completed.
Order-ID-set is the only path that flips the state to false, so
synthesizing success is safe.
Resolves: https://github.com/brave/brave-browser/issues/54637
* [Android] Register Brave as Android AutofillService for address autofill
Re-enables the Android AutofillService that was removed in
https://github.com/brave/brave-core/pull/25759 due to crashes on
split-APK installs. Uses the SplitCompat pattern
(SplitCompatAutofillService base class) so the service works correctly
when installed from the Play Store.
When the user selects Brave as their autofill provider in Android Settings,
Brave can fill saved address profiles into third-party apps and save new
addresses from manually filled forms.
Resolves: https://github.com/brave/brave-browser/issues/41334