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}
* [Android] Fix autofill toggle greyed out when Google is the system autofill service
When Google's Autofill with Google (AWG) is set as the preferred autofill
service in Android OS settings, Chromium disables the third-party autofill
toggle in Settings because Chrome has its own built-in Google-synced
autofill. Since Brave does not have built-in Google autofill, AWG should
be treated like any other third-party provider (e.g. 1Password, Bitwarden).
This fix has two parts:
Java side: Override AutofillClientProviderUtils.getAndroidAutofillFramework-
Availability() via bytecode changeMethodOwner to remap the
ANDROID_AUTOFILL_SERVICE_IS_GOOGLE status to AVAILABLE or SETTING_TURNED_OFF
based on the user's existing pref. This makes the toggle interactive in the
Settings UI.
Native side: The C++ code calls the Java method via JNI, bypassing the
bytecode redirect. To handle this, BraveAutofillClientProviderUtils is
annotated with @CalledByNative to generate its own JNI header. A chromium_src
override of autofill_client_provider.cc uses #define to redirect the original
JNI function to the Brave version, ensuring the native code also uses the
remapped availability status and doesn't reset the pref on browser startup.
Resolves: https://github.com/brave/brave-browser/issues/52960
- 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.
* [CodeHealth][Android] Ignore patch generation for overwritten resources
This is update of the Android resources list we should
not generate patch for because we overwrite them.
Converted bookmark_toolbar.xml layout file override to patch,
because it is trivial.
Resolves https://github.com/brave/brave-browser/issues/53436
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
The email aliases toggle in Brave Origin settings was always visible
regardless of whether the feature flag is enabled. Since the feature is
disabled by default, users would see a non-functional toggle.
Expose kEmailAliases to Java via ChromeFeatureList and hide the
preference when the flag is disabled.
Resolves: https://github.com/brave/brave-browser/issues/53323
Chromium 146 introduced BadMessageException in the Java Mojo bindings
(crbug.com/469861566, https://github.com/chromium/chromium/commit/c04b8552deeef)
to surface malformed or unexpected messages (invalid headers, unknown methods,
deserialization errors, responses for already-cancelled requests). However, the
default ExceptionHandler simply re-throws the exception as unchecked, causing
crashes instead of gracefully closing the pipe.
This differs from the C++ Mojo bindings behavior where
Connector::DispatchMessage (mojo/public/cpp/bindings/lib/connector.cc) handles
dispatch failures by calling HandleError() which resets the pipe cleanly.
Set a delegate on ExceptionHandler.DefaultExceptionHandler that catches
BadMessageException and returns false (closing the pipe), while re-throwing
all other exceptions to preserve existing behavior.
Resolves: https://github.com/brave/brave-browser/issues/53290
Implements new layout for widget search promo panel and introduces better handling of activity recreations and configuration changes to redraw the widget search promo panel with correct theme (day/night) and proper position.
Other notable enhancements:
- Tweak tablet margins to better frame the onboarding cards on foldable devices after initial review with the design team.
- Fix post-FRE intent and delay activity to avoid a glitch on foldable devices by following the same strategy applied upstream.
- Accessibility: include content descriptions for widget search promo panel images.
- Nala: include new drawables from Nala tokens.
- Append new source android-widget for all searches made from the widget.
- Implement tests to verify new source android-widget.
PlayCoreDialogWrapperActivity (from core-common) lives in base.apk
but deserializes a Parcelable (review.zzc) from split_chrome.apk.
The base split's ClassLoader can't see chrome split classes, causing
ClassNotFoundException. Chromium fixes this for its own activities
via BundleUtils.checkContextClassLoader(), but PlayCoreDialogWrapperActivity
extends plain Activity and is not covered.
Fix by registering an ActivityLifecycleCallbacks that sets the
Application's ClassLoader on the Intent extras Bundle before onCreate().
Also adds a QA preference to force the in-app review flow from settings
for easier testing.
Resolves: https://github.com/brave/brave-browser/issues/53179
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/2eb1baa19a3548ac2bee87fdd1231ea4051442f0
[E2E] Encapsulate TopInsetProvider observer two-step pattern
This CL introduces a new class to encapsulates the common
two-step pattern of:
1. Waiting for TopInsetProvider to become available via a supplier
2. Adding an observer to the provider once available
This pattern was duplicated in ToolbarPositionController,
AutocompleteCoordinator, and NewTabPage.
The new utility class manage TopInsetProvider access with clear
separation between owners and consumers
TransitiveTopInsetProvider:
- Provides access to consumers who need to observe inset changes
- Automatically manages observer registration when provider becomes available
- Queues observers added before provider is set
Bug: 478739083
Change-Id: Ib818c4f16df88f1d6ab6befc633f1fb9031ba3d5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7509092
This reverts commit 7d23353a12adf000a22615fd1d07ed389e9fd94c.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/ecc16f6754610b4e29b7dde1748bea45b3e48a9c
Revert (partial) "Fix @Nullable annotation for ChromeContextMenuPopulator's ShareDelegate"
This reverts commit c6562cde86eaf48819f83a7bd68e37b37626e51b.
Reason for revert:
The Suspect CL https://chromium-review.googlesource.com/q/Icc52e361fd3c5f64ef4ab1ff51397d841bc13f64 is highly likely the cause of the crash. Please see the crash report http://crash/d477a2ee4d2284d8.
Rebase the Revert CL on top of main branch with conflicts allowed option to prevent false positive merge conflicts.
If you agree with the revert CL, please approve it and mark as Commit-Queue +2 to submit it.
More details can be found in the go/crash-revert-cls-creation.
Original change's description:
> Fix @Nullable annotation for ChromeContextMenuPopulator's ShareDelegate
>
> And switch it to not be a Supplier, since nothing currently requires it
> to be one.
>
> Bug: 467389696
> Change-Id: Icc52e361fd3c5f64ef4ab1ff51397d841bc13f64
> Cq-Include-Trybots: luci.chrome.try:android-internal-dbg,android-internal-binary-size
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7542574
> Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
> Commit-Queue: Andrew Grieve <agrieve@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1579495}
>
Crash Bug: 482849462
Change-Id: I6042384ff35cd6d3747fa2dab28607fe243e18f8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7555790