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
The deferred PostTask introduced to avoid ANR was causing the bottom
controls to be initialized after the progress bar, breaking it.
Revert to synchronous initialization.
Resolves: https://github.com/brave/brave-browser/issues/54458
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}