Skip to content

🚀 Release/v4.9.1 - #211

Merged
kcw-grunt merged 122 commits into
mainfrom
release/v4.9.1
Apr 24, 2026
Merged

kcw-grunt merged 122 commits into
mainfrom
release/v4.9.1

Conversation

@kcw-grunt

@kcw-grunt kcw-grunt commented Apr 23, 2026 •

Copy link
Copy Markdown
Collaborator

📱 Description

Changes

  • [Fixes the bug: BreadActivity.initializeViews]
  • Further fix
  • [adjust config for running]
  • [adjust the config]
  • [Updated the InstrumentedTest]
  • [Add WalletManager; make validateAddress instance]
  • [Added More comprehensive Send Tests to cover better stability]

Platform

  • Android

🎯 Type of Change

  • 🐛 Bug fix
  • ✨ New feature
  • 🔧 Refactoring (code change that neither fixes a bug nor adds a feature)
  • 📚 Documentation update
  • 🎨 UI/UX improvement
  • ⚡ Performance improvement
  • 🧪 Test addition or improvement

📋 Changes

New Components Added

  • BRClipboardManager.putDetailsClipboard() - New method for copying transaction details to clipboard with analytics logging
  • New design constants in Constants.kt:
    • transactionActionHt (40.dp)
    • transactionDetailHt (240.dp)
    • bentoBorderWidth (1.1.dp)
    • bentoCornerRadius (16.dp)
    • bentoSpacer (6.dp)
    • tripleBentoSpacer (18.dp)

Modifications

  • BalanceBentoScreen.kt: Added analytics logging for balance visibility toggle (did_toggle_balance_visibility) and fiat/LTC swap toggle (did_toggle_fiat_ltc)
  • BalanceBentoViewModel.kt: Removed debug Timber logging statement
  • NoWifiBalanceAlertScreen.kt: Updated border width to use new bentoBorderWidth constant
  • ReceiveDialog.kt: Updated border width to use new bentoBorderWidth constant
  • FavouritesBentoScreen.kt: Refactored to use new bentoSurface() modifier instead of separate background/border styling; cleaned up imports; added spacer for better layout distribution; simplified preview
  • GameHubBentoScreen.kt: Refactored from Card-based layout to Box with bentoSurface() modifier; simplified structure and improved image clipping with clip() modifier; removed redundant Card elevation settings
  • LTCPickerBentoScreen.kt: Refactored to use bentoSurface() modifier; repositioned label text to bottom with improved spacing; adjusted wheel picker item height from 24.dp to 30.dp; changed vertical arrangement from Center to Bottom
  • MainViewModel.kt, MainScreenEvent.kt, MainScreen.kt: Minor updates (details truncated in diff)
  • TransactionBento screens: Multiple UI improvements across TransactionFilter.kt, TransactionsBentoScreen.kt, ConfirmationStatus.kt, CopyTransactionWidget.kt, ExportTransactionsWidget.kt, NoTxRow.kt, TransactionDetail.kt, TransactionFilterWidget.kt, TransactionRow.kt (details truncated)
  • BentoBottomNavBar.kt, SubWidgets.kt: Updates to composable implementations
  • BentoModifiers.kt: Theme modifier updates
  • build.gradle.kts: Version number updates (versionCode: 202506315, versionName: v4.9.0)
  • Localization: Updated 18 language string resources (ar, de, es, fa, fr, hi, in, it, ja, ko, pa, pl, pt-rBR, ru, sv, tr, uk, zh-rCN, zh-rTW)
  • CI/CD: Updated GitHub Actions workflows for auto-translation and build logic

Removals

  • Removed separate gradient definitions for Bento surfaces (replaced with consolidated bentoSurface() modifier)
  • Removed Card-based wrapper from GameHubBentoScreen in favor of Box with consistent styling
  • Removed explicit border and background modifiers across multiple screens (consolidated into bentoSurface())
  • Removed unused imports (e.g., androidx.compose.foundation.border, androidx.compose.material3.Card, androidx.compose.material3.CardDefaults)
  • Removed debug Timber logging from BalanceBentoViewModel

📊 Statistics

  • Additions: 936 lines
  • Deletions: 792 lines
  • Files Changed: 54
  • Commits: 8

🧪 Tests Status

  • Tests ran successfully locally?
  • Added more tests? How many?
  • Code coverage percentage of the codebase: __%

🎯 Reviewers

@kcw-grunt, @josikie


kcw-grunt and others added 30 commits March 30, 2025 10:50
🚀[Release v4.4.1] Merge into Develop
This reverts commit 4e252ac.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt
This reverts commit 4e252ac.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt
fix: race condition when clear shared prefs values after wipeAll
from the new peer discovery (v4.2.0)
* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1
- 98644c4
- 9396927
- 7ad4b98
- 8e57d2a

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>
kcw-grunt and others added 17 commits April 16, 2026 13:23
* updated tests

Added thai and dutch
refactored the old scripts
Added some tests strings

* updated the workflow

* changed the base

* fixes

* chore(i18n): auto-translate missing strings [skip ci]

Languages updated: ar, de, es, fa, fr, hi, in, it, ja, ko, nl, pa, pl, pt-rBR, ru, sv, th, tr, uk, zh-rCN, zh-rTW
Triggered by: a62c3ab4f52cd4216af5e47ba865c52c31c4cea6

* Release/v4.9.0 (#201)

* Release/v4.8.0 (#145)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* feat: remove unused activity (ImportActivity) at AndroidManifest.xml (#71)

* fix: fix crash IllegalStateException: cannot make a new request because the previous response is still open (#73)

* code bump

* Feat/move tx fee (#74)

* chore: add new translations at strings.xml

* feat: move network fee to HomeSettingDrawerSheet & remove unused code

* fix: fix dismiss allow state loss (#76)

* fix: fix typo at strings.xml (#75)

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* version and code bump

* Added support url (#81)

- changed the language
- code bump

* version and code bump

* Revert from eda0f532 & cherry pick (#86)

* version bump

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* chore: set allowSpend to false when recommend rescan click

* fix: add delete transaction data from local database

* Removed chatty event

* chore: add analytics at BRWalletManager.publishCallback

* chore: make sure calculation and static fee same as iOS, add setting for selected fee type

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* build bump

* chore: open bread activity first then open moonpay widget (#88)

* Adjustment for circleci (#89)

* chore: wip adjustment for screengrab

* chore: [circleci] adjust config.yml

* chore: [circleci] update config.yml, Fastfile, Gemfile.lock, RecoverWalletScreenGrabsTest.kt

* chore: [circleci] for now just unit-test

* fix: android: Footer version label is obfuscated (#92)

* fix: android: Footer version label is obfuscated

* fix: [#92] android: Footer version label is obfuscated

* fix: You saved it right screen reset button covers words (#93)

* fix: [#84] change seed words layout to lazy vertical grid

* fix: [#84] refactor seed words layout

* tiny resizing (#94)

* code and version bump

* change break (#97)

adds a android user agent and externalID

* build code number

fix: [#96] remove bottom_nav_menu_us and just using bottom_nav_menu for consistency (#98)

* fix: [#137] fix: Reset fiat options in Buy / Receive modal (#99)

* Chore/update device data (#100)

* change break

adds a android user agent and externalID

* Update ReceiveDialogViewModel.kt

* chore: refactor request params for fetchMoonpaySignedUrl

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* Add agent string obfuscation (#103)

* updated metadata (#105)

* chore: remove screen lock detection (#106)

* 🧰  Fx/seed words UI polish (#108)

* changed to tap

* Added instruction label

-added localizations

* Added 'empty string for when confirm is completed

* version and code bump

* fix typo

replaced click file with mp3
added error sound

* ❇️ Feat/add polish punjabi farsi (#109)

* changed to tap

* Added instruction label

-added localizations

* Added 'empty string for when confirm is completed

* version and code bump

* fix typo

replaced click file with mp3
added error sound

* added 3 languages

* Removed unused audio files

* polished tests

* removed unused asset pack

* code bump

* fix: fix YourSeedProveItState.isWordUsedCorrectly (#111)

* Upgrade targetSdk 36 (#113)

* chore: change drawable with density for brainwallet_logotype_white

* chore: adjustment WelcomeScreen.kt

* chore: adjustment for targetSdk 36 also support 16KB page size

* feat(#195): adopt koin annotation for dependency injection (#120)

* Create PULL_REQUEST_TEMPLATE.md

Create PULL_REQUEST_TEMPLATE.md

* bump for test (#121)

* bump for test

* Updated the template

* polishes

* feat(#174): initiate games module (#119)

* Force pushed the version and code bump and catch up with Prod.

* 🚀[Release v4.7.2] Merge into Develop (#127)

* 🚀[Release v4.4.7] Merge into Main  (#70)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* 🚀[Release v4.5.0] Merge into Main  (#78)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* feat: remove unused activity (ImportActivity) at AndroidManifest.xml (#71)

* fix: fix crash IllegalStateException: cannot make a new request because the previous response is still open (#73)

* code bump

* Feat/move tx fee (#74)

* chore: add new translations at strings.xml

* feat: move network fee to HomeSettingDrawerSheet & remove unused code

* fix: fix dismiss allow state loss (#76)

* fix: fix typo at strings.xml (#75)

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* version and code bump

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* 🚀[Release v4.5.4] Merge into Main (#87)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* feat: remove unused activity (ImportActivity) at AndroidManifest.xml (#71)

* fix: fix crash IllegalStateException: cannot make a new request because the previous response is still open (#73)

* code bump

* Feat/move tx fee (#74)

* chore: add new translations at strings.xml

* feat: move network fee to HomeSettingDrawerSheet & remove unused code

* fix: fix dismiss allow state loss (#76)

* fix: fix typo at strings.xml (#75)

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* version and code bump

* Added support url (#81)

- changed the language
- code bump

* version and code bump

* Revert from eda0f532 & cherry pick (#86)

* version bump

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* chore: set allowSpend to false when recommend rescan click

* fix: add delete transaction data from local database

* Removed chatty event

* chore: add analytics at BRWalletManager.publishCallback

* chore: make sure calculation and static fee same as iOS, add setting for selected fee type

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* build bump

* Updated README

* code bump

* chore: open bread activity first then open moonpay widget (#88)

* code bump

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* 🚀[Release v4.5.5] Merge into Main (#101)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* feat: remove unused activity (ImportActivity) at AndroidManifest.xml (#71)

* fix: fix crash IllegalStateException: cannot make a new request because the previous response is still open (#73)

* code bump

* Feat/move tx fee (#74)

* chore: add new translations at strings.xml

* feat: move network fee to HomeSettingDrawerSheet & remove unused code

* fix: fix dismiss allow state loss (#76)

* fix: fix typo at strings.xml (#75)

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* version and code bump

* Added support url (#81)

- changed the language
- code bump

* version and code bump

* Revert from eda0f532 & cherry pick (#86)

* version bump

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* chore: set allowSpend to false when recommend rescan click

* fix: add delete transaction data from local database

* Removed chatty event

* chore: add analytics at BRWalletManager.publishCallback

* chore: make sure calculation and static fee same as iOS, add setting for selected fee type

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* build bump

* chore: open bread activity first then open moonpay widget (#88)

* Adjustment for circleci (#89)

* chore: wip adjustment for screengrab

* chore: [circleci] adjust config.yml

* chore: [circleci] update config.yml, Fastfile, Gemfile.lock, RecoverWalletScreenGrabsTest.kt

* chore: [circleci] for now just unit-test

* fix: android: Footer version label is obfuscated (#92)

* fix: android: Footer version label is obfuscated

* fix: [#92] android: Footer version label is obfuscated

* fix: You saved it right screen reset button covers words (#93)

* fix: [#84] change seed words layout to lazy vertical grid

* fix: [#84] refactor seed words layout

* tiny resizing (#94)

* code and version bump

* change break (#97)

adds a android user agent and externalID

* build code number

fix: [#96] remove bottom_nav_menu_us and just using bottom_nav_menu for consistency (#98)

* fix: [#137] fix: Reset fiat options in Buy / Receive modal (#99)

* Chore/update device data (#100)

* change break

adds a android user agent and externalID

* Update ReceiveDialogViewModel.kt

* chore: refactor request params for fetchMoonpaySignedUrl

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* Update build.gradle.kts

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* 🚀[Release v4.6.0] Merge into Main (#104)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* feat: remove unused activity (ImportActivity) at AndroidManifest.xml (#71)

* fix: fix crash IllegalStateException: cannot make a new request because the previous response is still open (#73)

* code bump

* Feat/move tx fee (#74)

* chore: add new translations at strings.xml

* feat: move network fee to HomeSettingDrawerSheet & remove unused code

* fix: fix dismiss allow state loss (#76)

* fix: fix typo at strings.xml (#75)

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* version and code bump

* Added support url (#81)

- changed the language
- code bump

* version and code bump

* Revert from eda0f532 & cherry pick (#86)

* version bump

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* chore: set allowSpend to false when recommend rescan click

* fix: add delete transaction data from local database

* Removed chatty event

* chore: add analytics at BRWalletManager.publishCallback

* chore: make sure calculation and static fee same as iOS, add setting for selected fee type

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* build bump

* chore: open bread activity first then open moonpay widget (#88)

* Adjustment for circleci (#89)

* chore: wip adjustment for screengrab

* chore: [circleci] adjust config.yml

* chore: [circleci] update config.yml, Fastfile, Gemfile.lock, RecoverWalletScreenGrabsTest.kt

* chore: [circleci] for now just unit-test

* fix: android: Footer version label is obfuscated (#92)

* fix: android: Footer version label is obfuscated

* fix: [#92] android: Footer version label is obfuscated

* fix: You saved it right screen reset button covers words (#93)

* fix: [#84] change seed words layout to lazy vertical grid

* fix: [#84] refactor seed words layout

* tiny resizing (#94)

* code and version bump

* change break (#97)

adds a android user agent and externalID

* build code number

fix: [#96] remove bottom_nav_menu_us and just using bottom_nav_menu for consistency (#98)

* fix: [#137] fix: Reset fiat options in Buy / Receive modal (#99)

* Chore/update device data (#100)

* change break

adds a android user agent and externalID

* Update ReceiveDialogViewModel.kt

* chore: refactor request params for fetchMoonpaySignedUrl

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* Add agent string obfuscation (#103)

* version bump

* code bump

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* 🚀[Release v4.6.1] Merge into Main (#107)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* feat: remove unused activity (ImportActivity) at AndroidManifest.xml (#71)

* fix: fix crash IllegalStateException: cannot make a new request because the previous response is still open (#73)

* code bump

* Feat/move tx fee (#74)

* chore: add new translations at strings.xml

* feat: move network fee to HomeSettingDrawerSheet & remove unused code

* fix: fix dismiss allow state loss (#76)

* fix: fix typo at strings.xml (#75)

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* version and code bump

* Added support url (#81)

- changed the language
- code bump

* version and code bump

* Revert from eda0f532 & cherry pick (#86)

* version bump

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* chore: set allowSpend to false when recommend rescan click

* fix: add delete transaction data from local database

* Removed chatty event

* chore: add analytics at BRWalletManager.publishCallback

* chore: make sure calculation and static fee same as iOS, add setting for selected fee type

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* build bump

* chore: open bread activity first then open moonpay widget (#88)

* Adjustment for circleci (#89)

* chore: wip adjustment for screengrab

* chore: [circleci] adjust config.yml

* chore: [circleci] update config.yml, Fastfile, Gemfile.lock, RecoverWalletScreenGrabsTest.kt

* chore: [circleci] for now just unit-test

* fix: android: Footer version label is obfuscated (#92)

* fix: android: Footer version label is obfuscated

* fix: [#92] android: Footer version label is obfuscated

* fix: You saved it right screen reset button covers words (#93)

* fix: [#84] change seed words layout to lazy vertical grid

* fix: [#84] refactor seed words layout

* tiny resizing (#94)

* code and version bump

* change break (#97)

adds a android user agent and externalID

* build code number

fix: [#96] remove bottom_nav_menu_us and just using bottom_nav_menu for consistency (#98)

* fix: [#137] fix: Reset fiat options in Buy / Receive modal (#99)

* Chore/update device data (#100)

* change break

adds a android user agent and externalID

* Update ReceiveDialogViewModel.kt

* chore: refactor request params for fetchMoonpaySignedUrl

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* Add agent string obfuscation (#103)

* updated metadata (#105)

* chore: remove screen lock detection (#106)

* build bump

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* 🚀[Release v4.6.2] Merge into Main (#110)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* feat: remove unused activity (ImportActivity) at AndroidManifest.xml (#71)

* fix: fix crash IllegalStateException: cannot make a new request because the previous response is still open (#73)

* code bump

* Feat/move tx fee (#74)

* chore: add new translations at strings.xml

* feat: move network fee to HomeSettingDrawerSheet & remove unused code

* fix: fix dismiss allow state loss (#76)

* fix: fix typo at strings.xml (#75)

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* version and code bump

* Added support url (#81)

- changed the language
- code bump

* version and code bump

* Revert from eda0f532 & cherry pick (#86)

* version bump

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* chore: set allowSpend to false when recommend rescan click

* fix: add delete transaction data from local database

* Removed chatty event

* chore: add analytics at BRWalletManager.publishCallback

* chore: make sure calculation and static fee same as iOS, add setting for selected fee type

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* build bump

* chore: open bread activity first then open moonpay widget (#88)

* Adjustment for circleci (#89)

* chore: wip adjustment for screengrab

* chore: [circleci] adjust config.yml

* chore: [circleci] update config.yml, Fastfile, Gemfile.lock, RecoverWalletScreenGrabsTest.kt

* chore: [circleci] for now just unit-test

* fix: android: Footer version label is obfuscated (#92)

* fix: android: Footer version label is obfuscated

* fix: [#92] android: Footer version label is obfuscated

* fix: You saved it right screen reset button covers words (#93)

* fix: [#84] change seed words layout to lazy vertical grid

* fix: [#84] refactor seed words layout

* tiny resizing (#94)

* code and version bump

* change break (#97)

adds a android user agent and externalID

* build code number

fix: [#96] remove bottom_nav_menu_us and just using bottom_nav_menu for consistency (#98)

* fix: [#137] fix: Reset fiat options in Buy / Receive modal (#99)

* Chore/update device data (#100)

* change break

adds a android user agent and externalID

* Update ReceiveDialogViewModel.kt

* chore: refactor request params for fetchMoonpaySignedUrl

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* Add agent string obfuscation (#103)

* updated metadata (#105)

* chore: remove screen lock detection (#106)

* changed to tap

* Added instruction label

-added localizations

* Added 'empty string for when confirm is completed

* version and code bump

* fix typo

replaced click file with mp3
added error sound

* added 3 languages

* 🧰  Fx/seed words UI polish (#108)

* changed to tap

* Added instruction label

-added localizations

* Added 'empty string for when confirm is completed

* version and code bump

* fix typo

replaced click file with mp3
added error sound

* Removed unused audio files

* polished tests

* removed unused asset pack

* code bump

* code bump

* ❇️ Feat/add polish punjabi farsi (#109)

* changed to tap

* Added instruction label

-added localizations

* Added 'empty string for when confirm is completed

* version and code bump

* fix typo

replaced click file with mp3
added error sound

* added 3 languages

* Removed unused audio files

* polished tests

* removed unused asset pack

* code bump

* broke out completion of the seed phrase and navigation

- Feedback was a user could complete seed phrase and not tap "Game and Sync"
- Forced users to start all over
- Saved a correct seed phrase confirmation into memory

* code bump

* fix for

https://console.firebase.google.com/project/brainwallet-mobile/crashlytics/app/android:ltd.grunt.brainwallet/issues/1386f366ab35e9112a6b742d629bb0be?time=last-seven-days&types=crash&sessionEventKey=685DA96C00BF00015A7AFEA30E0DB49C_2098799426616143441

* measure where users tap

* code bump

* fix: fix YourSeedProveItState.isWordUsedCorrectly

* Cleaned commented out BuyLitecoinscreen

* code bump

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* 🚀[Release v4.7.0] Merge into Main  (#115)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* Add version and code to welcome screen

* reset padding

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManager.

* fix: fix crash when FragmentSignal dismissed

* fix: fix sync after wipe

* fix: fix wrong lifecycle to trigger callback at FragmentSignal

* Update issue templates

* updated core changes

per @andhikayuana

* Rename .java to .kt

* chore: refactor BRApiManager & APIClient

* chore: remove unused part at APIClient

* feat: wip new peer discovery

* feat: implement selected peer ip address from cache (fetched from API)

* feat: implement selected peer ip address from cache (fetched from API)

* feat: filter out peers with NODE_NETWORK, NODE_BLOOM

* fix: race condition when clear shared prefs values after wipeAll

* Updating the core library

from the new peer discovery (v4.2.0)

* Chore/revert pre peer discovery (Android) (#69)

* chore: update core submodule

* chore: resolve conflict

* Update build.gradle.kts

version and code bump

* chore: for now at BRPeerManager.wrapConnectV2 only using connect, since the core using hardcoded peers

* fix: fix write down confirm screen (#63)

* fix: fix write down confirm screen

* fix: fix allow seed word item not unique

* chore: cherry picked and adjust from
- f2fa8e1e4fb9c7429fa86461b24b4463a7969ecf
- 98644c425b2fdae7b8b424708fb1a61ad983a9d8
- 93969278da8f95adc0c9f0f8411c8a27876a4d77
- 7ad4b9853b7d1bf7ddbaa576242d8800615a48fb
- 8e57d2a67420565b40b753dec5a533776da4821f

* fix: fix crash can't parse response inside LtcRepository.fetchRates

* fix: fix crash (failed parse) when SelectedPeersRepository.fetchSelectedPeers got unsuccessful response

* code bump

* fix: ConcurrentModificationException at BRPeerManager.txStatusUpdate

* feat: implement new API

* code bump

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* feat: remove unused activity (ImportActivity) at AndroidManifest.xml (#71)

* fix: fix crash IllegalStateException: cannot make a new request because the previous response is still open (#73)

* code bump

* Feat/move tx fee (#74)

* chore: add new translations at strings.xml

* feat: move network fee to HomeSettingDrawerSheet & remove unused code

* fix: fix dismiss allow state loss (#76)

* fix: fix typo at strings.xml (#75)

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* version and code bump

* Added support url (#81)

- changed the language
- code bump

* version and code bump

* Revert from eda0f532 & cherry pick (#86)

* version bump

* feat: new UI for receive and topup flow (moonpay integration) (#72)

* feat: [WIP][UI] new UI for receive and topup flow

* feat: [WIP][UI] implement copy address and some refactor

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: replace webview using CustomTabsIntent from androidx.browser

* feat: add PickerWheel

* chore: rename param at QRUtils.generateQR

* chore: revert default startDestination at BrainwalletActivity

* feat: wip moonpay integration

* feat: wip moonpay integration

* chore: new UI for ReceiveDialog

* chore: parse error from response API at BrainwalletViewModel

* chore: add /moonpay/buy-quote and remove dev base url

* chore: make LegacyNavigation.showMoonPayWidget receive params for the widget url

* chore: add GetMoonpayBuyQuoteResponse

* chore: wip moonpay integration to call buy-quote

* fix: fix wheel picker for IDR at ReceiveDialog

* fix: fix invalid signature

* feat: moonpay integration at onboarding flow at BuyLitecoinScreen also fix some stuffs

* chore: replace base url for moonpay buy integration when debug

* chore: introduce LocalCacheSource.kt and cache fetch limits

* chore: adjustment receive dialog UI
- debounce fiat currency to 2s
- increment in 10
- remove decimal places
- default value to 10% of range

* chore: reorder bottom navigation item and add new strings

* chore: add new translations

* chore: refactor UI for buy and receive dialog

* chore: cleanup ReceiveDialogViewModel

* chore: using MoonpayBuyWidget

* chore: adjustment moonpaywidget

* chore: for now moonpay widget using CustomTabsIntent

* chore: set allowSpend to false when recommend rescan click

* fix: add delete transaction data from local database

* Removed chatty event

* chore: add analytics at BRWalletManager.publishCallback

* chore: make sure calculation and static fee same as iOS, add setting for selected fee type

---------

Co-authored-by: Kerry Washington <mrkerrywashington@icloud.com>

* build bump

* chore: open bread activity first then open moonpay widget (#88)

* Adjustment for circleci (#89)

* chore: wip adjustment for screengrab

* chore: [circleci] adjust config.yml

* chore: [circleci] update config.yml, Fastfile, Gemfile.lock, RecoverWalletScreenGrabsTest.kt

* chore: [circleci] for now just unit-test

* fix: android: Footer version label is obfuscated (#92)

* fix: android: Footer version label is obfuscated

* fix: [#92] android: Footer version label is obfuscated

* fix: You saved it right screen reset button covers words (#93)

* fix: [#84] change seed words layout to lazy vertical grid

* fix: [#84] refactor seed words layout

* tiny resizing (#94)

* code and version bump

* change break (#97)

adds a android user agent and externalID

* build code number

fix: [#96] remove bottom_nav_menu_us and just using bottom_nav_menu for consistency (#98)

* fix: [#137] fix: Reset fiat options in Buy / Receive modal (#99)

* Chore/update device data (#100)

* change break

adds a android user agent and externalID

* Update ReceiveDialogViewModel.kt

* chore: refactor request params for fetchMoonpaySignedUrl

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* Add agent string obfuscation (#103)

* updated metadata (#105)

* chore: remove screen lock detection (#106)

* 🧰  Fx/seed words UI polish (#108)

* changed to tap

* Added instruction label

-added localizations

* Added 'empty string for when confirm is completed

* version and code bump

* fix typo

replaced click file with mp3
added error sound

* ❇️ Feat/add polish punjabi farsi (#109)

* changed to tap

* Added instruction label

-added localizations

* Added 'empty string for when confirm is completed

* version and code bump

* fix typo

replaced click file with mp3
added error sound

* added 3 languages

* Removed unused audio files

* polished tests

* removed unused asset pack

* code bump

* fix: fix YourSeedProveItState.isWordUsedCorrectly (#111)

* Upgrade targetSdk 36 (#113)

* chore: change drawable with density for brainwallet_logotype_white

* chore: adjustment WelcomeScreen.kt

* chore: adjustment for targetSdk 36 also support 16KB page size

* bump

clean extra semicolon

* Update pro-guard-rules

* Updated the version

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* Updated games module to v1.1.0

* Updated the games submodule

* Renamed and tested with user skips

---------

Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* Fix(#227): Crash when launching MoonPay Widget (#126)

Refactored the MoonPay widget integration to a dedicated Composable
(`MoonPayWidgetLauncher`) to ensure proper state handling and loading
behavior.

- Added `MoonPayWidgetLauncher.kt` with Composable and ViewModel
  for managing signed URL fetch and Custom Tab launch.
- Ensures loading state covers the whole screen, preventing UI crashes.
- Removed legacy static method `LegacyNavigation.showMoonPayWidget`.
- Updated `ReceiveDialog.kt` and `BuyLitecoinScreen.kt` to use the new
  Composable.
- Minor cleanup in `LegacyNavigation.kt`.

* feat(#138): Improve Unlock Screen UI and add dark mode toggle (#122)

* Redesign welcome screen (#123)

* Redesign welcome screen

* Redesign ready screen

* 🚀[Release v4.7.2] Merge into Develop (#127)

* 🚀[Release v4.4.7] Merge into Main  (#70)

* Revert "Updated the APIManager"

This reverts commit 4e252ac29cfb6c3ab26ae5ea4a8f6de154311f2e.

# Conflicts:
#	app/src/main/java/com/brainwallet/tools/manager/APIManager.kt

* Reverted the Kotlin APIManage…
* Added an informational locale test

removed dead Twitter key

* Add actual test result in locale coverage test

* added-analytics

* Removed many unused activities

Advanced activity
Security Activity
etc

* Add send/receive transaction integration tests

Adds 31 unit integration tests covering the two core wallet flows:
- BWSenderIntegrationTest (15 tests): verifies prepareTransaction success,
  guard conditions (AlreadySending, TimedOut), null/error paths, and
  amount validation against both minOutput thresholds.
- TxRepositoryImplIntegrationTest (16 tests): verifies StateFlow lifecycle,
  null/empty wallet responses, filter correctness for sent vs received
  transactions, and Turbine-based flow emission sequencing.

To enable mocking without triggering UnsatisfiedLinkError on BRWalletManager's
JNI class, extract two minimal interfaces (WalletOperations, TransactionSource)
and have BWSender / TxRepositoryImpl depend on those instead of the concrete
singleton. Production behaviour is unchanged; the default values still
delegate to BRWalletManager.getInstance().

Also cleans up AndroidManifest registrations for the three activities that
were deleted in the previous commit.

Updated gitignore

polished test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* reformatted the test

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Changed the borders

* Change border 1dp

white 20percent

* Polished the no tx row

* Polished the layout values

updated the images

* version bump

* bump
* Changed the borders

* Change border 1dp

white 20percent

* Polished the layout values

updated the images

* Polish the faliinscene

 Update abl
Remove some tests
Added FallinScene to welcome screen
* Moved clipboard test point into event

* renamed
Added caller when the value is updated
bump version

WIP
Created an android test directory for instrumented test
Introduce a WalletManager interface and make BRWalletManager implement it. Change validateAddress from a static native to an instance native method and update call sites (BitcoinUrlHandler, LitecoinURIHandler, PaymentProtocolTask, SendViewModel, etc.) to use BRWalletManager.getInstance().validateAddress(...).

Add FakeWalletManager test doubles for unit and instrumentation tests. Remove the legacy FragmentSend implementation and related showSendFragment usages from BRAnimator and simplify BreadActivity navigation (cleanup for Compose send flow). Enable testFixtures in build.gradle.kts and remove the custom AAB renaming task. Also load the native library in SendInstrumentationTest to ensure native methods are available during instrumentation tests.
polished the bentos
Added more tests for sender
This crash is a java.lang.NullPointerException occurring during the initialization of BreadActivity.java . Specifically, it's an attempt to invoke the observeBus method on a null HomeSettingDrawerComposeView object within the initializeViews method of BreadActivity . NullPointerExceptions are very common in Android development, often accounting for a significant portion of application crashes.
@kcw-grunt kcw-grunt changed the title Release/v4.9.1 🚀 Release/v4.9.1 Apr 23, 2026
@kcw-grunt kcw-grunt self-assigned this Apr 23, 2026
@kcw-grunt
kcw-grunt requested a review from josikie April 23, 2026 18:48
@kcw-grunt
kcw-grunt marked this pull request as ready for review April 24, 2026 06:50
@kcw-grunt
kcw-grunt merged commit ee688c0 into main Apr 24, 2026
2 of 4 checks passed
@kcw-grunt
kcw-grunt deleted the release/v4.9.1 branch May 4, 2026 07:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants