Chromium changes:
https://chromium.googlesource.com/chromium/src/+/2965a40033399f1c1df4f51702f2b45d93b8825b
commit 2965a40033399f1c1df4f51702f2b45d93b8825b
Author: Anton Goncharenko <agonch@google.com>
Date: Tue Mar 3 05:40:39 2026 -0800
[Signin][Android] Migrate Safety Hub to activity-less sign-in flow.
This is part of the effort to reduce reliance on
SigninAndHistorySyncActivity by sign-in entry points.
go/activityless-signin
Dependency Injection: Updated SettingsActivity and
FragmentDependencyProvider to manage and provide WindowAndroid,
Activity, and ActivityResultTracker to settings fragments.
SafetyHubModuleDelegateImpl to use
BottomSheetSigninAndHistorySyncCoordinator for starting sign-in flows
instead of launching separate activities via intents. The new sign-in
flow is hidden behind ENABLE_SEAMLESS_SIGNIN and
ENABLE_ACTIVITYLESS_SIGNIN_ALL_ENTRY_POINT feature flags.
Safety Hub: 3-dots menu > Settings > Safety Check > Sign in to Chrome
Bug: 479179162
Change-Id: I768cb4bda8e217d5be40a1e5de7ef0d97d180dd7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7614169
Reviewed-by: Zaina Al-Mashni <zalmashni@google.com>
Commit-Queue: Anton Goncharenko <agonch@google.com>
Reviewed-by: Tanmoy Mollik <triploblastic@google.com>
Reviewed-by: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: Łukasz Barczyński <lbarczynski@google.com>
Cr-Commit-Position: refs/heads/main@{#1593148}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/61a82a1566fd970e84e97a209528055da082b76e
commit 61a82a1566fd970e84e97a209528055da082b76e
Author: Henrique Nakashima <hnakashima@chromium.org>
Date: Mon Mar 2 13:10:58 2026 -0800
[Android] Null-annotate RootUiCoordinator (part 5)
This CL focuses on ModalDialogManager.
In different places it's nullable or not, and it is sometimes passed as
a Supplier and sometimes not. Generally, ChromeBaseAppCompatActivity has
a MonotonicObservableSupplier which in some subclasses never gets set,
but in the ones that create a RootUiCoordinator, the provider is set
before the RootUiCoordinator is created.
I've tried to keep Suppliers where instances are mostly passed via
Supplier and the actual ModalDialogManager where the Suppliers have
generally already been resolved.
Reduced NullAway errors down to 69 again.
Cq-Include-Trybots: luci.chrome.try:android-internal-dbg,android-internal-binary-size
Change-Id: I081f4cfab1a80dc074b2886a0ff59cb176feff30
Bug: 485252552
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7604913
Owners-Override: Henrique Nakashima <hnakashima@chromium.org>
Reviewed-by: Andrew Grieve <agrieve@chromium.org>
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1592697}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/b5a2265620263469792b5a322df732b40d2e8c83
commit b5a2265620263469792b5a322df732b40d2e8c83
Author: Anton Goncharenko <agonch@google.com>
Date: Wed Feb 18 06:02:50 2026 -0800
[Signin][Android] Migrate Feed Surfaces to activity-less sign-in flow
This is part of the effort to reduce reliance on
SigninAndHistorySyncActivity by sign-in entry points.
Integrated BottomSheetSigninAndHistorySyncCoordinator initialization and
cleanup in FeedActionDelegateImpl. The new sign-in flow is hidden behind
ENABLE_SEAMLESS_SIGNIN and ENABLE_ACTIVITYLESS_SIGNIN_ALL_ENTRY_POINT
feature flags.
Design Doc: go/activityless-signin
Bug: 478812795
Change-Id: I58f670525db5c9669a9c0af25245df2e49dec5c9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7557299
Commit-Queue: Liza Bipin <mlbipin@google.com>
Reviewed-by: Adam Arcaro <adamta@google.com>
Reviewed-by: Liza Bipin <mlbipin@google.com>
Auto-Submit: Anton Goncharenko <agonch@google.com>
Cr-Commit-Position: refs/heads/main@{#1586376}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/08483c4fea866719a9712db5d9a2d1ed531628f4
commit 08483c4fea866719a9712db5d9a2d1ed531628f4
Author: Hitarth Kothari <hitarthkothari@google.com>
Date: Mon Feb 23 12:50:37 2026 -0800
[ThinWebView] Add ThinWebViewContextMenuItemDelegate
This CL adds context menu support for ThinWebView (used in the
Preview/Ephemeral Tab) on Android.
Key Changes:
New Delegate: Implemented ThinWebViewContextMenuItemDelegate to handle
actions like "Copy to clipboard" and "Open in default browser" for
ThinWebView.
New Menu Mode: Added ContextMenuMode.THIN_WEB_VIEW to
ChromeContextMenuPopulator, providing a streamlined menu that excludes
standard tab features (like "Read Later" or "Open in New Tab").
Integration: Updated EphemeralTabCoordinator and ThinWebViewImpl to initialize and pass the context menu populator factory through the UI stack.
ChromeContextMenuPopulatorTest to verify correct menu item filtering for the new mode.
Testing: Added comprehensive unit tests in
Bug: 483656137
Change-Id: I4f293a21bd1a7eb74f90b2b06750aa7bb6473b67
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7572842
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Auto-Submit: Hitarth Kothari <hitarthkothari@google.com>
Reviewed-by: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: Shakti Sahu <shaktisahu@chromium.org>
Commit-Queue: Hitarth Kothari <hitarthkothari@google.com>
Cr-Commit-Position: refs/heads/main@{#1588868}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/de1cd37fe0fc3226977521f3f7a5413683b0164e
commit de1cd37fe0fc3226977521f3f7a5413683b0164e
Author: Henrique Nakashima <hnakashima@chromium.org>
Date: Mon Feb 23 09:49:15 2026 -0800
[Android] Supply SnackbarManager through MonotonicObservableSupplier
- ChromeActivity now provides a SnackbarManager supplier.
- RootUiCoordinator uses the supplier and handles its potential
nullability with assertNonNull/assumeNonNull as appropriate.
- Subclasses of RootUiCoordinator updated to accept the new supplier
type.
Bug: 485252552
Change-Id: Ib52b4080d277d3ce718de3e28551a452e316e663
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7596981
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1588775}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/f3299a56bec5f5f0848d62984e01defc3a7f0499
commit f3299a56bec5f5f0848d62984e01defc3a7f0499
Author: Tomasz Wiszkowski <ender@google.com>
Date: Wed Feb 18 07:11:44 2026 -0800
Move OmniboxActionDelegateImpl back to omnibox folder.
The change reverts https://crrev.com/c/7077115 and exposes the
OmniboxActionDelegateImpl to the Autocomplete subsystem.
The OmniboxActionDelegate (the interface) is needed to bridge the gap
between the //chrome/android and //components, and its function under
//chrome/android is irrelevant.
Propagating the Impl down to Autocomplete stack allows us to include
additional bits of information needed by Omnibox Actions that should not
be a part of the interface / should not be modifiable by Actions.
Bypass-Check-License: files moved.
Change-Id: I9842386460f91f476a3bb309e1a7f8b31251990c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7586837
Reviewed-by: Keigo Oka <oka@chromium.org>
Auto-Submit: Tomasz Wiszkowski <ender@google.com>
Commit-Queue: Tomasz Wiszkowski <ender@google.com>
Reviewed-by: Hidehiko Abe <hidehiko@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1586414}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/b3f1b6b71c7b8c6587f4788d009574d7e47f9409
commit b3f1b6b71c7b8c6587f4788d009574d7e47f9409
Author: Aishwarya Rajesh <aishwaryarj@google.com>
Date: Fri Feb 13 15:04:51 2026 -0800
[MIR] Cleanup moveTabs* APIs
See updated bug description for rationale on updates in this CL.
At the end of this CL, we will have 3 APIs to move tabs to a window:
1. moveTabsToNewWindow(): Moves tabs to a brand new window. This will
show a message at instance limit.
2. moveTabsToWindowByIdChecked(): Moves tabs to an active instance or
creates a new activity for an inactive instance or an active instance
that has its activity destroyed. This API will fail if the id provided
does not have persisted state.
3. moveTabsToOtherWindow(): Gives the user a chance to select a window
from the TargetSelectorDialog to move the tabs to. This implicitly
invokes #2 for a window selected from the dialog and #1 if we have
exactly one eligible window running currently.
Bug: 476106567
Change-Id: I701f46a1090220d4f9db705cb4df803b30ac284a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7564470
Commit-Queue: Aishwarya Rajesh <aishwaryarj@google.com>
Reviewed-by: Sirisha Kavuluru <skavuluru@google.com>
Cr-Commit-Position: refs/heads/main@{#1584943}
Chromium changes:
https://chromium.googlesource.com/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 changes:
https://chromium.googlesource.com/chromium/src/+/79c909bca53dfd97ed264b823b1ced45e7956d54
commit 79c909bca53dfd97ed264b823b1ced45e7956d54
Author: Xi Han <hanxi@google.com>
Date: Fri Feb 13 08:46:30 2026 -0800
[MagicStack] Refactor ModuleRegistry to fix ChromeTabbedActivity leak.
The leak was due to never unregister entries in
mModuleConfigCheckerMap which is owned by singleton
HomeModulesConfigManager when the CTA is destroyed. In this CL, we
remove this map from HomeModulesConfigManager, and all checks go
through ModuleRegistry which is one per CTA and is destroyed when CTA
is destroyed.
1) Remove ModuleConfigChecker interface, and move the isEligible() to
ModuleProviderBuilder interface;
2) Reuse the existing |mModuleBuildersMap| in ModuleRegistry for
modules' eligibility checks.
3) Only one behavior change is: the "new tab page cards" is empty if the
bottom sheet is opened from the Ntp's customization toolbar button.
We have deprecated this button and the list works as before if the
bottom sheet is opened from all other entry points, i.e., from menu
and magic stack cards.
Bug: 462709210
Change-Id: I2cd442a82cf8515246635ecb79cfa102fbebb366
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7574493
Commit-Queue: Xi Han <hanxi@chromium.org>
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Reviewed-by: Xinyi Ji <xinyiji@chromium.org>
Reviewed-by: Theresa Sullivan <twellington@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1584704}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/3c9e581ce27c3a692be86c19edd659a721eb78bd
commit 3c9e581ce27c3a692be86c19edd659a721eb78bd
Author: Aishwarya Rajesh <aishwaryarj@google.com>
Date: Mon Feb 9 18:28:07 2026 -0800
[MIR] Create TabReparentingDelegate to hold implementation for tab and
group reparenting initiated from MultiInstanceManagerApi31
This is largely a non-functional refactor that involves moving existing
reparenting logic from MultiInstanceManagerApi31 to the new
TabReparentingDelegate for better division of responsibility.
The CL introduces a behavioral change where previously we would trigger
openWindow() to show the max-instance toast while attempting to move
tabs to a new window at instance limit, whereas we now show the instance
creation limit message which provides a link to the window manager and
hence offering an improved user experience.
The CL also cleans up low value tests and updates some test fixtures in
MultiInstanceManagerApi31UnitTest and adds increased coverage for the
existing reparenting logic in TabReparentingDelegateUnitTest.
Bug: 479933537
Change-Id: I3e9b501c215a3add20cdb1c156c2b872e1c38a3d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7551974
Reviewed-by: Sirisha Kavuluru <skavuluru@google.com>
Commit-Queue: Aishwarya Rajesh <aishwaryarj@google.com>
Cr-Commit-Position: refs/heads/main@{#1582211}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/4f22c9c8d3976fc7ccae881d2645dfb480fd46dc
commit 4f22c9c8d3976fc7ccae881d2645dfb480fd46dc
Author: Anton Goncharenko <agonch@google.com>
Date: Wed Feb 11 06:12:57 2026 -0800
[Signin][Android] Migrate NTP Avatar to the activity-less sign-in flow.
This is part of the effort to reduce reliance on
SigninAndHistorySyncActivity by sign-in entry points.
BottomSheetSigninAndHistorySyncCoordinator is instantiated in
IdentityDiscController#setProfile, if it's a regular profile (not
off-the-record). It gets destroyed if switched to incognito profile. In
incognito the profile avatar button should be disabled, but as extra
reassurance the sign-in flow crashes with an incognito profile.
IdentityDiscController#onClick triggers the new flow via the coordinator
when available, falling back to the legacy activity-based flow
otherwise.
Bug: 478812680
Change-Id: I1643d7d12794b7c90bafd419191926cceae2f561
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7531719
Reviewed-by: Boris Sazonov <bsazonov@chromium.org>
Commit-Queue: Anton Goncharenko <agonch@google.com>
Reviewed-by: Menghan Yang <myuu@google.com>
Cr-Commit-Position: refs/heads/main@{#1583182}
- Removes `AssetsPricesHelper` class by inlining `fetchPrices` at its two call sites (`BraveWalletPanel` and `Utils`) with direct `assetRatioService.getPrice()` calls, eliminating an unnecessary `MultiResponseHandler` wrapper.
- Moves price lookup helpers (`getPrice`, `getPriceForAsset`, `parseAssetPrice`) into Utils.java where all callers already have access.
- Removes the now-unused `FetchPricesResponseContext` from `AsyncUtils`.
- Fixes copy-paste bug in `ParsedTransaction` where `minBuyAmountArg` was reading `txArgs[1]` (same as `sellAmountArg`) instead of `txArgs[2]`, confirmed against the desktop C++ implementation in `eth_data_parser.cc`.
- Fixes general warnings for `ParsedTransaction` class.
- Improves Javadocs.
Remove policy-disabled features from the settings search index so
they don't appear in search results when disabled by Brave Origin
or enterprise policy.
Resolves: https://github.com/brave/brave-browser/issues/53530
* [Android] Show loading state in Origin preferences during post-purchase credential fetch
When a Brave Origin purchase is completed, there is a delay while the
receipt is passed from Play Store to the SKUs SDK via
fetchOrderCredentials. During this time, the Origin preferences screen
opens but credentials aren't ready yet.
- Disable all toggles and clickable preferences until
fetchOrderCredentials completes
- Show a snackbar with "Disabling features" spinner instead of
"Restart now" during the credential fetch
- On success, re-enable preferences and transition to "Restart now"
- On failure, close the preferences screen
- Always show restart snackbar on toggle change regardless of
setPolicyValue result, since failure means a restart is needed
- Remove duplicate color definitions (schemes_primary_fixed_dim,
schemes_on_primary_fixed, semantic_text_secondary,
semantic_text_tertiary) that already exist in nala tokens
Resolves: https://github.com/brave/brave-browser/issues/53915
Add support for linking Brave Origin subscriptions after purchase on
Android, following the same link-order flow used by Leo (AI Chat).
- Add OriginIAPSubscription Mojo interface and C++ implementation to
read purchase token/order ID from prefs and persist link status
- Handle product=origin in SubscriptionRenderFrameObserver: inject
braveOrigin.receipt and braveOrigin.orderId into localStorage on
the initial landing page, and linkResult.setStatus() callback on
the /order-link/ result page
- Register OriginIAPSubscription Mojo binding in
BraveContentBrowserClient
- Update LinkSubscriptionUtils to use link-order intent for Origin
- Hide Purchase section in Origin preferences when already linked
- Move subscription_render_frame_observer.h include out of
ENABLE_BRAVE_VPN guard so it is available for all Android
subscription products
- Generalize Leo-specific constants (kIntentParamValueLeo,
kResultLandingPagePathLeo) since they are now shared with Origin
- Add Origin test cases to browser tests
Resolves: https://github.com/brave/brave-browser/issues/53613
BraveRewardsNativeWorker crashes when constructed before the browser is
fully initialized. This happens when an AlarmManager retention
notification (DAY_10/DAY_30/DAY_35) fires and the app process is started
by Android just to handle the broadcast — ProfileManager::
GetActiveUserProfile() dereferences a null g_browser_process in this
case.
The fix:
- Checks that GetActiveUserProfile() returns a valid profile before
creating the native worker in JNI_BraveRewardsNativeWorker_Init. If it
doesn't, the native object is not created.
- Resets the Java singleton when native init is skipped, so subsequent
calls can retry once the browser is fully initialized.
- Adds null-profile guards to IsSupported, IsSupportedSkipRegionCheck,
and IsRewardsEnabled which also call GetActiveUserProfile()
independently.
- Adds null checks for getInstance() at all call sites since it can now
return null.
Resolves: https://github.com/brave/brave-browser/issues/53877
brave:// should be converted to chrome:// as early as possible so all internal checks for chrome:// are valid. You can still open brave:// urls and they should display as brave:// urls, but internally both the actual url and virtual url should be chrome://
Adds four filter options, already present in Shields & privacy → Content filtering, and include them also in Settings → Media → YouTube section.
Each filter option is synchronized in both sections (i.e. modifying an option under Settings → Media will be reflected in the other section accordingly).
The YouTube section is also reordered:
Block YouTube Shorts
Block YouTube Playables
Block YouTube recommended content
Block YouTube distracting elements
Block YouTube thumbnails
Block YouTube auto-dubbed videos
Block YouTube members-only videos
Uncomments `getDayZeroVariant` to fetch the variant names and it renames them to X (default) and Y (new onboarding) to avoid naming collision with NTP A/B study.
Guard mojo calls with try/catch for IllegalStateException since the
pipe can be closed by onDetachedFromWindow() or onConnectionError()
before the BEST_EFFORT task executes, and Java mojo bindings have no
non-destructive validity check.
Resolves: https://github.com/brave/brave-browser/issues/53479
Initializes exit menu item as hidden for new users only by setting it as disabled during onboarding. Exit item will be shown as disabled in the customized menu and tapping it on the toggle will bring it back.
When a user purchases Brave Origin on one device and later switches to a
new device (or reinstalls), the local preferences are empty and the
Origin menu always shows the purchase screen instead of the settings
screen.
This adds a verifyPurchase() method to BraveOriginSubscriptionPrefs that
queries Google Play for an existing Origin purchase and restores the
local preferences (purchase token, product ID, package name) if one is
found. The query is triggered during
BraveActivity.finishNativeInitialization() only when the local
subscription pref is not already active, so it doesn't run unnecessarily
for users who already have their purchase recorded locally.
Toasts are suppressed during the startup query to avoid showing billing
error messages on devices without Google Play, and re-enabled when the
purchase screen is opened.
Resolves: https://github.com/brave/brave-browser/issues/53405
* [Android][cr146] Put url into url bar after QR scan
This commit brings back pre-cr146 behaviour
on scanning QR codes with url - url text now
is at the url bar and selected again.
Resolves https://github.com/brave/brave-browser/issues/53318
The verified publisher checkmark could persist when switching tabs
because brave:// URLs were not treated as internal URLs and
OnPanelPublisherInfo silently dropped null publisher info without
notifying the Java layer.
- Treat brave:// URLs as internal alongside chrome:// so they
clear the checkmark instead of querying getPublisherInfo.
- Notify Java with an empty publisher ID when OnPanelPublisherInfo
receives null info, so the UI clears stale state.
- Reset the checkmark immediately in didSelectTab as a safety net
before the async publisher query completes.
Resolves: https://github.com/brave/brave-browser/issues/53332
Migrate Origin settings icons from custom drawables with hardcoded fill
colors to Leo design token equivalents that use @color/icon_default for
proper dark theme support. Remove manual icon tinting code that was
working around the hardcoded colors.
Resolves: https://github.com/brave/brave-browser/issues/53334