🚀 [Release v4.11.0] - #259
Merged
Merged
Conversation
🚀[Release v4.4.1] Merge into Develop
This reverts commit 4e252ac. # Conflicts: # app/src/main/java/com/brainwallet/tools/manager/APIManager.kt
Add version and code to welcome screen
This reverts commit 4e252ac. # Conflicts: # app/src/main/java/com/brainwallet/tools/manager/APIManager.kt
…et-co/android into hotfix/api-manager-fix
Hotfix/api manager fix
fix: race condition when clear shared prefs values after wipeAll
Feat/new peer discovery
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>
…se the previous response is still open (#73)
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: c45fa05 Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…tup NPE (#248) The "Techdebt/improve shop" refactor (d0886db) deleted initializeViews(), which was the only place binding bottomNav, menuBut, drawerLayout, primaryPrice, and secondaryPrice via findViewById. The refactor left onCreate/setListeners still dereferencing those never-assigned fields, so BreadActivity crashed with a guaranteed NullPointerException on BottomNavigationView.setOnNavigationItemSelectedListener on every launch. These views were already non-functional before the crash: the bottom nav's menu was only ever wired up via a design-time-only tools:menu attribute (never inflated at runtime), and primaryPrice/secondaryPrice had no code left to populate their text. Rather than resurrect dead legacy UI, remove it outright: drop the associated fields, listeners, and R.id.bottomNav/menuBut/drawerLayout/primary_price/secondary_price views plus the now-unreferenced R.menu.bottom_nav_menu resource, and fix the layout refs that pointed at the removed views. Co-authored-by: Claude <noreply@anthropic.com>
) Commit 1b353ae (release/v4.9.4) renamed the bw-gdlib submodule from modules/bw-gdlib to bw-gdlib in .gitmodules, but never removed the old gitlink entry from the tree. That left a tracked gitlink at modules/bw-gdlib with no corresponding .gitmodules mapping, so `git submodule sync --recursive && git submodule update --init --recursive` (CircleCI's setup_environment step) fails on every build with: fatal: no submodule mapping found in .gitmodules for path 'modules/bw-gdlib' Removing the dangling gitlink brings the tree's 5 submodule entries back in sync with .gitmodules' 5 declared paths. Co-authored-by: Claude <noreply@anthropic.com>
#250) * Bump version to v4.10.5 (202506343) * fix(shop-bento): eliminate flaky ShopBentoViewModelTest failure ShopBentoViewModelTest had no MainDispatcherRule, unlike every other ViewModel test in this codebase, so Dispatchers.Main was never explicitly installed for it. ShopBentoViewModel.init launches its work via viewModelScope (backed by Dispatchers.Main), so this test was actually running against whatever Dispatchers.Main happened to be left as by other test classes sharing the same Gradle test JVM fork — explaining why `testBrainwalletReleaseUnitTest` failed intermittently with `TurbineAssertionError: Unconsumed events found` only under the full suite (order/load-dependent) and never in isolation. Added MainDispatcherRule to match the established pattern (see UnLockViewModelTest, BWSenderIntegrationTest, TxRepositoryImplIntegrationTest). Also collapsed ShopBentoViewModel's two independent viewModelScope.launch blocks (one collecting settingRepository.settings, one collecting shopProxyRepository.shopProxy) into a single combine()-driven collector. Previously each block called _state.update independently, so real observers of `state` (not just the test) could see transient, incomplete intermediate states depending on collector interleaving. Swapped the fixed-duration advanceTimeBy(100) for advanceUntilIdle() in the affected test, which deterministically drains all pending coroutine work instead of guessing a virtual-time delay. Verified with repeated full `testBrainwalletReleaseUnitTest` runs (previously failed roughly 1 in 3-5 runs under the full 415-test suite). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Removed the auto summary in place of Claude summary * fix(ci): lower Gradle daemon memory footprint to stop OOM-kill The unit-test job's Gradle daemon was being killed mid-build ("The message received from the daemon indicates that the daemon has disappeared... it may have been killed or may have crashed"), consistently right as testBrainwalletDebugUnitTest started after a heavy multi-module build (KSP across 5 modules, detekt across 4, dataBinding, bw-gdlib texture packing, 415 unit tests). -Xmx4g for the Gradle daemon plus AGP-forked unit-test worker JVMs plus OS/container overhead was exceeding the resource_class: large executor's available RAM. Lowered the daemon heap to -Xmx3g and org.gradle.workers.max/--max-workers from 2 to 1 to leave more headroom for the forked test JVMs, without changing the resource class (and its higher CircleCI billing tier). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * perf(ci): skip detekt in the unit-test job android-build-logic's DetektSetup.attachDetektTask() wires `detekt` as a dependency of every compile*/assemble* task project-wide (tasks.whenTaskAdded { if (name.startsWith("compile") || ...) dependsOn(detekt) }), so a plain `./gradlew testBrainwalletDebugUnitTest` was also running 3-4 full detekt passes (autoCorrect=true, parallel=true, HTML/XML/TXT/ SARIF/Markdown reports across app/core/iap/general-purpose-app) that have nothing to do with running tests. That's real CPU/memory work competing with compilation and the forked unit-test JVMs on the resource-constrained `large` executor, on top of the daemon heap/worker tuning from the previous commit. Verified locally: `-x detekt` removes all detekt tasks from the graph (confirmed via --dry-run) with no other effect, and the full unit test run still passes. Scoped to this CI job's command line only, not the shared build-logic, so local dev/lint workflows are unaffected. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: kcw-grunt <mrkerrywashington@icloud.com> Co-authored-by: Claude <noreply@anthropic.com>
) * docs: add SECURITY.md with a real vulnerability disclosure process PR #246 (kcw-grunt-patch-1) added SECURITY.md but left it as GitHub's unedited default template — placeholder version numbers (5.1.x/5.0.x) that don't match any real Brainwallet release, and instructional placeholder text ("Use this section to tell people...") never filled in with actual content. Replaced with a real policy: reporting instructions pointing at the verified support channel (brainwallet.co/support, from BWConstants.SUPPORT_WEB_LINK — there's no dedicated security@ email anywhere in this repo, and GitHub's private vulnerability reporting is not enabled for this repo, confirmed via the API), explicit scope (wallet/key-management code in scope, third-party deps and social engineering out of scope), a supported-versions policy matching how this app actually ships (continuous release, latest version only), and a safe harbor statement — all relevant for a wallet app handling real user funds and seed phrases. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * docs: restructure README with a real front page for new visitors/contributors The README opened straight into CI badges followed by a raw dump of release notes in inconsistent order (v4.9.0, then v4.8.3, then a jump back to v3.9.0-v3.9.1, v3.6.0, v3.3.1) — no description of what the app actually does beyond the title, no download links, no build/setup instructions, no contributing/security/license pointers. For an actively-developed open-source wallet repo, that's a poor front door for anyone landing here from GitHub search or the Play Store listing. Added, all verified against the actual repo/app rather than assumed: - A real description and feature list - Download links (Play Store id ltd.grunt.brainwallet, verified live; the gruntsoftware/ios sibling repo; brainwallet.co) - Clone/build instructions grounded in the actual submodule setup and local.properties/google-services.json requirements from .circleci/config.yml - Architecture summary (Koin, Compose, Coroutines, native wallet core) matching the real module layout - Testing, Security (linking the new SECURITY.md), Contributing (linking the existing PR template), and License sections Preserved the full existing release-notes content underneath a "Release Notes" heading rather than deleting project history, with a pointer to GitHub Releases/compare views for the current changelog going forward. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * updated the README.md --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: kcw-grunt <mrkerrywashington@icloud.com>
* Bump bw-gdlib submodule to 5c2faab Picks up the fix removing the exported launcher intent-filter from AndroidLauncher, which caused a duplicate ghost home-screen icon in release builds and crashed on launch (Crashlytics 0cdfcd994445922abf96c307663673c8). See bw-gdlib PR #14. * Update build.gradle.kts --------- Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com>
Syncs develop with everything already shipped: Release v4.10.4 (#244) and Release v4.10.6 (#253), which develop was missing entirely (develop had been stale since before v4.10.4). Brings in the ReLinker native-lib crash fix, the BWSender flaky-test fix, the ghost-launcher-icon crash fix, and the BreadActivity NPE fix. Conflicts resolved: - app/build.gradle.kts: kept main's v4.10.6 (202506345) over develop's older v4.10.5 - gradle/libs.versions.toml: kept the ReLinker dependency addition Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…at (#254) Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com>
* update Fallinmoji v1.6.0 bump version * Update .gitignore --------- Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com>
…ce logic Covers previously-untested Base58, TypesConverter, BytesUtil, BRCompressor, and BRDateUtil classes, plus the GameKoinModule DI wiring and GdxGameView's game-exit JSON parsing/social-share dispatch logic (GameExitData and handleGameExit widened from private to internal to make them testable).
* di: register InAppReviewService in AppModule Wires the previously-dormant InAppReviewService into Koin using the existing BrainwalletApp.breadContext activity tracker. No call sites added yet — showInAppReviewDialogIfNeeded() is not invoked anywhere, so behavior is unchanged until it's called from the app. * feat: activate InAppReviewService and wire up review prompts Registers InAppReviewService in Koin DI and calls showInAppReviewDialogIfNeeded() from four placements: after a successful send, the game hub exit flow, the balance-visibility toggle, and two tutorial pages. Fixes several placement bugs found along the way (broken suspend-context usage, unresolved DI references, malformed syntax, and an unreachable branch in GameHubViewModel), and adds unit test coverage for the service's gating and Play Core success/failure branches.
kcw-grunt
approved these changes
Jul 31, 2026
kcw-grunt
left a comment
Collaborator
There was a problem hiding this comment.
LGTM...added request review
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📱 Description
This release branch merges
release/v4.11.0intomain: the Fallinmoji mini-game's Ready/Countdown intro sequence (v1.6.0), new unit test coverage for previously-untested pure-logic utilities and thegameinterfacepackage, and a couple of small chores (skills lockfile,.gitignoreentry). Version bumped from v4.10.6 (202506345) to v4.11.0 (202506346).Platform
🎯 Type of Change
📋 Changes
New Components Added
Base58Test,TypesConverterTest,BytesUtilTest,BRCompressorTest,BRDateUtilTest— unit tests for previously-untested pure-logic utility classesGameKoinModuleTest— verifiesgameModuleKoin DI wiringGdxGameViewTest— verifiesGameExitDataJSON parsing and thehandleGameExitsocial-share dispatch logicskills-lock.json— tracks installed Claude Code skills (aso,mobile-android-design)Modifications
bw-gdlibsubmodule bumped to pick up Fallinmoji v1.6.0 (Ready dialog + 3-2-1-GO! countdown intro sequence, main menu button art polish) (🎮 Fallinmoji v1.6.0: Ready, Set, GO! #257)GdxGameView.kt:GameExitDataandhandleGameExitwidened fromprivatetointernalso the new tests can exercise them directly (no behavior change)README.md: added v4.11.0 entry to the Release Notes sectionapp/build.gradle.kts: version bump v4.10.6 (202506345) → v4.11.0 (202506346).gitignore: also excludeCLAUDE.local.mdRemovals
None
📊 Statistics
release/v4.11.0branch history (test coverage, README release notes, plus the pre-existing Fallinmoji v1.6.0 / skill / version-bump commits)🧪 Tests Status
./gradlew testBrainwalletDebugUnitTest)📓 Release Notes
See the v4.11.0 draft release and the new v4.11.0 section in README.md for the full write-up.
Full Changelog: v4.10.6...release/v4.11.0
🎯 Reviewers
@kcw-grunt, @josikie