* feat: Add network selector and compatible networks screen to send page for EVMs
* feat: add redesigned payanything flow and handle cases for evms, solana and tron
* feat: adding the swap part to the entire flow
* refactor: update navigation and error handling in send and swap flows
* adjust structuring and use the chain badge icons, also fix crypto and currency values not consistent on single network picker
* fix: modify guard for non-evm chains and minor cleanup
* use multipicker layout for receive section, streamline send to available balances and adjust colors as needed
* handle btc case for picker, update style and images across
* fix all pending issues with scanning qr and network handling for both evm and non evm, plus token and amount resolving
* fix all pending issues with scanning qr and network handling for both evm and non evm, plus token and amount resolving
* fix: expand fetch for tokens across networks and fix other issues regarding scanning from homepage
* auto-reformat
* fix conflict
* handle evm qr scan from homepage and add guards for swap and switch flows
* chore: Cleanup
* chore: set estimated fee to 0 when switching wallet
* fix merge conflicts
* fix to review comments and reformatting for lints
* fix: root cause for token bug reported
* chore: cleanup
* feat: add improved anypay swap screen which focuses on the receive amount
fix: fiat input toggle erro (also present on prod)
reformat: anypay related widgets
* feat: add alert for unsupported networks in payment requests
* fix: prevent rate and provider from showing until amount is calculated and loaded
fix: remove send icon in rate widget and align to center
fix: adjust network badge in swap confirm widget
* feat: embed tokens for solana and tron in QR generated for swap from external
* test: add unit tests for Tron, Solana, and ERC681 URI handling and detection
* fix: review comments
* fix: handle more edgecases
* feat: enhance ERC681URI to support raw token amounts and decimals
* refactor: streamline EVM chain ID retrieval in send page and recipient network row
* fix: minor review comments
---------
Co-authored-by: Robert Malikowski <malikowskirobert@gmail.com>
* Add strings for receive-flow accessibility labels
New English keys: info, long_press_to_copy, standard, token. They replace
hard-coded English in the receive amount modal, the payjoin copy modal and
the addresses long-press menu, and name the copy hint.
* Collapse copy-to-clipboard controls to one accessible button
CopyWrapper gains an optional controlBuilder that hands the copy callback to
the control it builds instead of stacking its own gesture layer on top, and it
now announces the copy through SemanticsService so screen-reader users get the
same feedback the copied state gives sighted users. When there is nothing to
copy it no longer leaves a gesture detector behind that reads as actionable
but does nothing. Its own tap/long-press wrapper is exposed as one merged
button node with a copy hint and a Copy custom action, so tap-to-copy stays
reachable on rows that also navigate.
The receive copy button used an outer gesture detector for the real work while
the visible ModernButton had a no-op onPressed behind two IgnorePointers.
It is now a single ModernButton whose onPressed copies, or opens the payjoin
copy modal when there is no direct URI to copy; the AnimatedSwitcher copied
state is unchanged. The payjoin modal announces the copy and no longer
hard-codes "Standard".
* Add screen-reader semantics to receive flow and address pickers
Every control touched here becomes exactly one merged semantics node with a
localized name, the right role and, where it exists, its selection state:
- receive page: the label chip is a button hinted with set_label and is kept
out of the semantics tree while it is collapsed to zero height.
- amount modal: token picker and currency picker are buttons named by
select_token / select_fiat_currency_title, the amount field carries the
amount label instead of relying on its placeholder, and the visible captions
are excluded so they are not announced twice.
- amount display: amount, symbol and fiat equivalent are announced together.
- info box: Dismiss is a real button, the info icon and the illustrative
currency stack are decorative (the message text carries their meaning).
- address type: the row and its chevron triggered the same picker; only the row
is exposed now, named by address_type.
- address type selector: More Options exposes its expanded state, each option
row reports selected + inMutuallyExclusiveGroup (its checkbox is excluded so
the state is announced once), and the collapsed options are unreachable.
- label modal quick-label chips are buttons.
- addresses page: rows are buttons reporting selection, with the long-press
actions (set label, hide/unhide, info) also exposed as custom semantics
actions; the checkmark is decorative; the search field keeps a name once it
has text; show-hidden-addresses is a button.
- currency picker: search field, clear button, currency rows, chain chips and
network rows get names, roles and selection state; icons and chevrons are
decorative.
No visual or pointer behaviour changes.
* Drop single-use locals to keep the diff minimal
* Address review: replace deprecated copy announcements with semantic state
* Give ModernButton and CoinActionButton one labeled a11y node
ModernButton, CoinActionButton and the ModalTopBar chrome buttons were
icon-only IconButtons with no tooltip and a detached caption sibling, so
screen readers announced an unnamed "button" plus unrelated static text.
- Add optional semanticLabel to ModernButton; wrap the control in
MergeSemantics + Semantics(button: true, label: semanticLabel ?? label)
and exclude both the icon and the visible caption so exactly one node
is exposed. No visual or pointer change.
- Give CoinActionButton the same treatment, reusing the label callers
already pass (dashboard Send / Receive / Swap / Scan).
- Add leadingSemanticLabel / trailingSemanticLabel to ModalTopBar,
defaulting the leading button to "Close", and mark a non-empty title
as a semantics header.
- Migrate every ModernButton / ModalTopBar call site to pass a localized
label, and drop the now-redundant external Semantics wrapper in
base_page.dart so the back button is not labeled twice.
- Localize the hard-coded "Settings" modal title in settings_page.dart.
New English keys: rotate_address, swap_reverse_direction, switch_camera,
switch_input_currency, test_node_speeds, turn_flash_off, turn_flash_on.
* Require explicit accessible names on ModalTopBar and ModernButton icons
ModalTopBar defaulted every leading icon's accessible name to "Close", so
the ~40 callers that pass a back arrow announced the wrong action, and
trailingSemanticLabel was optional, leaving the trailing icon controls
unnamed.
- Drop the "?? close" fallback in ModalTopBar: the leading ModernButton
now gets exactly leadingSemanticLabel, and constructor asserts require a
non-empty label whenever leadingIcon / trailingIcon is supplied. Callers
that pass leadingWidget / trailingWidget instead are unaffected, and a
null icon still builds no button at all.
- Assert in both ModernButton constructors that the control has a name:
either semanticLabel or a non-empty visible label.
- Pass the matching localized label at every ModalTopBar call site: "Go
back" for back arrows, "Close" for close icons, and the action name for
trailing icons (History, Configure, Export CSV, Save, Scan, Close).
- Label the last unnamed ModernButton (wallet accounts, wallet_info.dart).
No new localization keys; all labels reuse existing strings_en.arb keys.
* fix(a11y): put ModalTopBar header flag on the title Text node
On-device audit (CW-1574, defect D2) found zero [heading] nodes in the
Android accessibility tree on the Receive page: Semantics(header:) wrapped
the AnimatedSwitcher rather than the Text inside it, so the flag never
landed on the node that carries the title label.
Move the header semantics inside the AnimatedSwitcher, directly around the
Text. The ValueKey(title) moves with it onto the Semantics wrapper, since
AnimatedSwitcher switches on its direct child's key -- keying the Semantics
by title preserves the existing switch/animation behavior exactly.
No test or robot resolves the title ValueKey through a Text-typed finder,
so the key relocation is not observable from the test suites on this branch.
* Set headingLevel so Android surfaces modal titles as headings
The Flutter 3.41 engine drives AccessibilityNodeInfo.setHeading from
headingLevel, not the IS_HEADER flag (which 3.35 used). Proven by an
on-device probe: header:-only headings print on a 3.35-engine build and
vanish on the 3.41-engine CI build.
* Add masked token image to to currency picker items and adjust estacked badge icon for node share qr
* fix: Missing chain images in bridge flow
* chore: Update image paths
* fix: WC connection not triggering for Solana from scan qr
* fix: Wallet icon and eth currency icon displaying wrongly in various places for Base wallets
* Redesign for CurrencyPicker and FiatPicker, introduce recents and currency groupings
* chore: cleanup
* refactor: switch recents to previously completed trades, specify stables to be displayed, fix scrollable and adjust badge
* refactor: switch recents to previously completed trades, specify stables to be displayed, fix scrollable, adjust badge, add fiat and multinetwork currency pickers to buy and sell flows
* fresh set of changes and fixes for new currency picker flow
* add chain label to items on search and smooth pop
* add chain pill and label to xstocks
* properly filter search results
* shorten chain pill name for BSC tokens
* Review fixes
* cleanups
* safe pop
---------
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>