The maybeHideRewardsLayout() method controls rewards icon visibility on
tablets based on width but didn't check BraveRewardsPolicy, causing it
to override the main visibility logic that correctly hides the icon when
rewards are disabled.
Resolves: https://github.com/brave/brave-browser/issues/54358
* Android: Implement favicons for Password Manager entries
We now display favicons for Password Manager as happens for our desktop
edition.
In order to do this, the C++ side now passes in the full origin so that
we have the clean, proper URI in order to fetch the favicon.
Resolvesbrave/brave-browser#52775
Always check credentials via SKUs SDK (requestCredentialSummary) in
handleOriginPreferenceClick() instead of gating on the Play Store
purchase pref. This mirrors how Leo uses getPremiumStatus() to handle
both Play Store and desktop purchases.
Only show "Link Purchase" when there is an actual Play Store purchase
that hasn't been linked yet. Desktop purchases have no Play Store
receipt to link.
Resolves: https://github.com/brave/brave-browser/issues/54312
Custom push notifications rendered notification ads as popup windows as a
fallback when native OS notifications were unavailable. Native notifications
are now the only delivery path so the entire custom rendering path, its
feature flags, platform bridge, Views UI, Android dialog UI, P3A position
metric, and three migrated prefs are removed.
Co-authored-by: Aleksei Seren <aseren@brave.com>
Upstream Chromium cr147 (https://chromium-review.googlesource.com/c/chromium/src/+/7559078)
made FOREGROUND_SERVICE_CAMERA unconditional for all Android builds by
removing the is_desktop_android guard. However, the feature that
actually uses it (kAndroidEnableBackgroundMediaCapturing) is disabled
by default and not enabled by Brave, so the permission is declared but
never used.
This blocks Play Store publishing because Google requires a declaration
with a demo video for any app using FOREGROUND_SERVICE_CAMERA.
This PR:
- Re-gates FOREGROUND_SERVICE_CAMERA behind is_desktop_android so it's
excluded from Brave builds
- Removes AndroidManifest_user_permissions.xml since upstream now
declares FOREGROUND_SERVICE_MICROPHONE unconditionally, making
Brave's duplicate unnecessary
Resolves: https://github.com/brave/brave-browser/issues/54143
Move the bottom controls setup (ViewStub inflation, coordinator
creation, native initialization) from synchronous execution during
finishNativeInitialization to a deferred UI task via PostTask. The
synchronous inflation was triggering HardwareRenderer.nNotifyExpensiveFrame
which blocked the main thread waiting for the GPU, causing ANR on
devices under GPU pressure during startup.
This is safe because all consumers of mBottomControlsCoordinatorSupplier
and mTabGroupUiOneshotSupplier already null-check before use, and the
bottom toolbar starts with visibility="gone" making the one-frame delay
imperceptible. The task is wrapped with mCallbackController.makeCancelable()
to auto-cancel during Activity teardown.
Resolves: https://github.com/brave/brave-browser/issues/54077
[Ads] Serve new-tab takeover ads on demand instead of prefetching
Removing prefetching reduces unnecessary complexity.
Ads will instead be served on demand, ensuring they are
only delivered within the campaign’s configured start and
end dates.
Co-authored-by: Aleksei Seren <aseren@brave.com>
* [Android] Move tab switcher controls to bottom when address bar is at bottom
When the address bar is configured to show at the bottom, reposition the
entire hub toolbar (new tab, menu, pane switcher, search, shred) from
the top to the bottom of the tab switcher for one-handed accessibility.
- BraveHubManagerImpl: Add maybeRepositionToolbarToBottom() that changes
the toolbar wrapper's FrameLayout gravity to BOTTOM and swaps the pane
host container's top margin to bottom margin. Uses EdgeToEdge pad
adjuster (same pattern as upstream HubBottomToolbarCoordinator) to
handle navigation bar insets. Properly cleans up the adjuster on hub
hide since the coordinator and views are destroyed between show/hide
cycles.
- BraveHubManagerImplClassAdapter: Expose parent's mEdgeToEdgeSupplier
field via deleteField/makeProtectedField bytecode pattern.
- BraveToolbarManager: Remove setLayoutStateProvider() and its
LayoutStateObserver that toggled menu popup direction on tab switcher
transitions. No longer needed since the hub toolbar is now at the
bottom when address bar is at bottom.
- BraveHubToolbarView: Change INVISIBLE to GONE for hidden action/menu
buttons when bottom navigation controls are enabled (address bar on
top). INVISIBLE left the buttons clickable despite being hidden.
Resolves: https://github.com/brave/brave-browser/issues/53326
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}