From 3f2db9d04b455f13741a07074d8436092b90b5f2 Mon Sep 17 00:00:00 2001 From: grunt-claude-bot Date: Wed, 29 Jul 2026 14:17:53 +0100 Subject: [PATCH 1/3] docs: standardize release headers to bold version + PR + divider format (#254) (#256) Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> --- README.md | 101 ++++++++++++++++++++++++++++---- images/google-play-badge-en.png | Bin 0 -> 6956 bytes 2 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 images/google-play-badge-en.png diff --git a/README.md b/README.md index ce2ed228..fb5c5225 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,33 @@ **Brainwallet** is a free, open-source, self-custodial [Litecoin](https://litecoin.org) wallet for Android. Your seed phrase and keys stay on your device — Brainwallet never has custody of your funds. +### CircleCI status +[![Release](https://img.shields.io/github/v/release/gruntsoftware/android?style=plastic)](https://github.com/gruntsoftware/android/releases) [![CircleCI](https://dl.circleci.com/status-badge/img/gh/gruntsoftware/android/tree/main.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/gruntsoftware/android/tree/main) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) -[![Website](https://img.shields.io/badge/website-brainwallet.co-blue)](https://brainwallet.co) -**CI status** — [main](https://dl.circleci.com/status-badge/redirect/gh/gruntsoftware/android/tree/main) · [develop](https://dl.circleci.com/status-badge/redirect/gh/gruntsoftware/android/tree/develop) +## Play Store +[![Get it on Google Play](images/google-play-badge-en.png)](https://play.google.com/store/apps/details?id=ltd.grunt.brainwallet) -## Download - -- **Play Store**: [ltd.grunt.brainwallet](https://play.google.com/store/apps/details?id=ltd.grunt.brainwallet) -- **iOS**: [gruntsoftware/ios](https://github.com/gruntsoftware/ios) +## Important Links & Download +- **iOS Repo**: [gruntsoftware/ios](https://github.com/gruntsoftware/ios) - **Website**: [brainwallet.co](https://brainwallet.co) - **Support**: [brainwallet.co/support](https://www.brainwallet.co/support) +## Why Brainwallet + +**Standalone, not a client of our servers.** Brainwallet connects directly to the Litecoin peer-to-peer network using [SPV](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki) (simplified payment verification) — checking balances and broadcasting transactions doesn't depend on any Brainwallet-run backend. An already-installed copy keeps working even if Brainwallet the company disappeared. + +**Deterministic recovery.** Brainwallet is a [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) hierarchical-deterministic wallet — one seed phrase (paper key) recovers your full balance and transaction history on any device, forever. + +**Keys never leave your device.** Private keys are generated and held in the Android Keystore, not in Brainwallet's infrastructure — we never have custody of your funds and no backend path to recover them for you. + +**Built on open standards**, not a proprietary protocol: +- [SPV](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki) for fast sync without running a full node +- [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) deterministic wallets +- [BIP38](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki) import of password-protected paper wallets +- [BIP70](https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki) payment protocol support + ## Features - Self-custodial Litecoin wallet — your seed phrase never leaves your device @@ -57,8 +71,62 @@ Brainwallet Android is released under the [MIT License](LICENSE). For the full, up-to-date changelog see [GitHub Releases](https://github.com/gruntsoftware/android/releases) and the [compare view](https://github.com/gruntsoftware/android/compare). Highlights from recent versions: -### v4.9.0 +--- + +### **v4.10.6** [PR [#253](https://github.com/gruntsoftware/android/pull/253)] +--- +#### 🐛 Crash Fixes +- **`UnsatisfiedLinkError` on `core-lib` load** — `BRActivity`/`SyncReceiver` loaded the native wallet library via unguarded `System.loadLibrary()` static initializers, crashing every screen on launch if the OS failed to extract the `.so` (a common install/update failure mode on some OEMs). Native lib loading is now centralized in `BrainwalletApp.onCreate()` via [ReLinker](https://github.com/KeepSafe/ReLinker), which falls back to manual extraction from the APK when the system loader fails. +- **Ghost launcher icon crash** — the LibGDX game module's `AndroidLauncher` was accidentally exported with its own `MAIN`/`LAUNCHER` intent-filter, producing a second home-screen icon that crashed with `UnsatisfiedLinkError: libgdx.so not found` when tapped (it bypassed the app's real startup path). Fixed by removing the exported intent-filter. +- **`BreadActivity` NPE fix (#248)** — removed dead bottom-nav/toolbar code left over from an earlier refactor that deleted the view-binding logic but not the code still referencing those views, guaranteeing a `NullPointerException` on every launch. + +#### 🧪 Test Reliability +- Fixed a flaky `BWSender` reentrancy test that relied on `Thread.sleep()` racing real-time against a `StandardTestDispatcher` — replaced with deterministic `CountDownLatch` synchronization. +- Eliminated a flaky `ShopBentoViewModelTest` (#250). +- Removed a stale `modules/bw-gdlib` gitlink that was breaking CI (#249). + +#### 📚 Docs +- Real `SECURITY.md` with an actual vulnerability disclosure process, replacing GitHub's unfilled default template. +- Restructured `README.md` for external visitors/contributors (#251). +**Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.10.4...v4.10.6 + +--- + +### **v4.10.4** [PR [#236](https://github.com/gruntsoftware/android/pull/236)] +--- +A feature-rich release centered on the Game Hub / emoji mini-game experience and an MVI refactor of the main screens: + +- **New screens**: emoji pager/picker (`EmojiPagerScreen`, `PickEmojisScreen`, `YourEmojisScreen`, `HowToSetEmojisScreen`) and Game Hub bento screens (`GameHubBentoScreen`, `GameHubBentoPagerScreen`) +- **MVI refactor**: `MainScreen`, `SettingsScreen`, and `GameHub` all restructured into Event/State/ViewModel patterns (`MainScreenEvent`/`MainScreenState`/`MainViewModel`, `SettingsEvent`/`SettingsState`/`SettingsViewModel`, `GameHubEvent`/`GameHubState`/`GameHubViewModel`) +- **In-app review**: Google Play in-app review integration (`InAppReviewService`) +- Design system, font (`Bolden Van`, `Lilita One`, `Open Sauce One`), and localization updates alongside the above + +**Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.9.3...v4.10.4 + +--- + +### **v4.9.4 & v4.9.3** [PRs [#236](https://github.com/gruntsoftware/android/pull/236), [#222](https://github.com/gruntsoftware/android/pull/222)–[#229](https://github.com/gruntsoftware/android/pull/229)] +--- +- Fixed a crash in the send flow (`sendModelOnEvent`) +- Fixed the LTC/fiat picker layout +- Refactored analytics and reduced sync rate polling frequency (techdebt) +- Switched release tagging from release branches to tags going forward + +**Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.9.1...v4.9.4 + +--- + +### **v4.9.1** [PR [#211](https://github.com/gruntsoftware/android/pull/211)] +--- +- Fixed `BreadActivity.initializeViews` crash +- Added `WalletManager`, made `validateAddress` an instance method +- Expanded Send flow test coverage for better stability + +--- + +### **v4.9.0** [PR [#201](https://github.com/gruntsoftware/android/pull/201)] +--- #### ✨ New Features ##### 📋 Copy Transaction Details to Clipboard @@ -95,8 +163,10 @@ A new `bentoSurface()` modifier in `BentoModifiers.kt` consolidates gradient and **Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.7.2...v4.9.0 -### v4.8.3 +--- +### **v4.8.3** +--- #### ✨ New UI — Favourites & Tutorials Bento Sections **PR [#191](https://github.com/gruntsoftware/android/pull/191)** The main screen now features two new purpose-built bento panels replacing the generic placeholder container. The **Favourites** panel displays a set of coloured circular indicators using the app's design theme colours (affirm, info, warn, error) with full dark/light mode support. The **Tutorials** panel shows a "Coming Soon" placeholder consistent with the broader bento design language. The old `HomeBentoContainer` has been removed. String resources for both sections have been translated across 19 locales including Arabic, Chinese (Traditional & Simplified), French, German, Farsi, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Punjabi, Brazilian Portuguese, Russian, Spanish, Swedish, Turkish, and Ukrainian. @@ -109,7 +179,10 @@ The send transaction flow has been fully redesigned as a multi-step paged screen **PR [#182](https://github.com/gruntsoftware/android/pull/182)** Unit test coverage has been significantly expanded alongside the send screen work, bringing the total suite to **309 tests**. New test classes include `AppModuleTest`, `SendStateTest`, and `BrainwalletAppTest`, covering the Koin DI module wiring, send state logic, and core app initialisation paths. -### v3.9.0 – v3.9.1 +--- + +### **v3.9.0 – v3.9.1** +--- - Update README for improved description by @kcw-grunt in #78 - Beta Release [ 🚀 ] Merge Develop into Main by @kcw-grunt in #81 - Current fiat preference from Settings needs to be reset if set in the TickerBento @@ -121,7 +194,10 @@ Unit test coverage has been significantly expanded alongside the send screen wor - Layout fixes for iPhone 8 – iPhone 17 Pro Max on the Welcome Screen - Support.brainwallet.co link fixed -### v3.6.0 +--- + +### **v3.6.0** +--- - 🚀 [Release v3.5.0] merged into Main by @kcw-grunt in #51 - Full Changelog: v3.4.2...v3.6.0 - Switched to `bundle exec fastlane single_unit_test_all` @@ -134,7 +210,10 @@ Unit test coverage has been significantly expanded alongside the send screen wor - Chore/refactor Firebase analytics - Chore/activate test coverage -### v3.3.1 +--- + +### **v3.3.1** +--- - Added locale filter - UI improvements - Various fixes diff --git a/images/google-play-badge-en.png b/images/google-play-badge-en.png new file mode 100644 index 0000000000000000000000000000000000000000..0a1c1f9f7b0e517201267fb66474fd080edc49c4 GIT binary patch literal 6956 zcmbtZ^;Z|2{IHw~nGL zpnQa8=P@I1XQ*tit`6XMOhW;{$kzbKeb)l+ zPa}#i^8XC-T|f)@GDdgOy$446xmq8Z;x%~QuJb|5v~eEKkL`R+#9^buJ8Ns}&gqg@ z!X>|b7N=3*+O4*W1^3*tpDtHhxxuIWe0(a-lQw05(>5@HfZJG}%)gqNn&dz!i=&Q? z4q6Zpyp+MvASAq1en0BjmY$eM=r~)knp9O)^^Apu<)|b;qiMft@YH!AnhN}9T#^1D zudRVsSorcz`rjSD>r%6SQfev-wXj?1j_IQBWAB@AFR!W^mpL831y|uYyL2-zYC$If zMjoD{Rcf~ehHBQF87OSV?2Q={?cJyB?Cg>y|1H`~UYqxNj;O4mcC&R6LT~)yejda@ zZF=^*-LDfhuO|_&%1!<2vrMS-Y1tX(aUGY-&6@7d*YoR_gG`Dva}V3JNmze4*KuG? zbtNqa-KtC79m{E-{TnDOENl^^tY8J4)H;q^Z(9W4r^al0{1MU06@6hhK&tH^`O|fw zF5H=Kv>3?eIF?81i@X`h7OiGoZ*-=?S{neW1>5S=UjFo1DRjh2pn{c|)NAPeoi?D& zb?o&zpvBrnf*}b4`P23Zk{3$Rejsfoj(OmN`oVPC?|nZ*v@Goxw6KQ^^{u!b0^wE- z?4UWmaQKK6vmd=rm%a}QW;rU@kP84Ntt4Zr>oQkbB|!#2I!Pv64|uf$>+*=!>AD#J z@=<*SCbma<^2VG>&CgcTkw%4Qu*%23t0bJ@M5W^uou>d&cG5GvpjXcGNFq>w+H#CFHfk2)X2FEEkiEGyvjwF%fZW~7iK?vK6K)XtJN*IiGveq{bt*t=OmgE3;+mTm2E$<|HJjx z%jBZddFSu_NNf`1as3-IESOo7pJ0bn(A`_31`l+$-~4N@wP>~h{a0oz#-WzTPok3- z+XV?}j{`Jmxjhu8F6@LN$b`$V$^mhy6Ks;#;)$6k;zBX!!A^6Q|x z>XTmj;O6tanNa|!EVLg<&VXtOx_`%Tg3PUO`z>Z8#?Y4`UV8I5&wR3_(YoWu^>@de z1p1eTCuKD?Q#I}TYu{geHE3AQ?u!*kX_KH0&a~ypt@;1mw@0b=8PBXr3zN2+m*d^$u=lag_>_-4UM<7 z;QyBM*OpSh=s*Cso0QI7w7-5<;hF;IGY%y1P~Fd+DgH;DmU@+`-~jP6<0^BNUy5c5 zBxHzV+KSuD1$XJ|`^)8xvic>yIw|{^CBzYTW@e^>Bb!Dxd;M=e6GKbG_IM``O`D-c zQSZ&ZM_c124JkLO?#X7UQZOURv|`kEe9<=4e5?*7CuHd4@gfz+@4|+uWw7hRle|$c zs(G-K%h%8<$r&UWW>n)UO3H}_;bO|`bY=1GNrIkVNgc?QjI8w8r)m<$rA1m4X*`jO z{#!XcDKf{#wN7?O;*azsnCPy#p6K_62cCtl6Qt_ao%QXLIG^ogX*;c2|2^CeFW1hP za{`FRh$I&RFMmha{K~Dgv3y7CJEiS4@azkccDc?scia<(0$5pZ6zO=4tZpJa&$Jl? zqhEi0i&Gq&w8*GGpF5_Wb>YP3+-g#&{ax+Z5{{J>&1T8>mU;P94Uttyk);}2h|E+B zJCSIlOgLtL1ckXHGOZb-I|~4@+PXd67#yx`|L1{9T_!%*7AIBmXb{!tyS_Uc6;3DI zoaS&^PxJXgB|R{Cq>dm+rqxGaKLEDZN--_Q;lExM8D=QYOP;u3->?&!(LX zb$(PTl)gDdMTC#KAMxH?f7ku@aK90T`~1p;;>VJ4x;`PE^jfLR{?tH(*w>1BQLV*O zrf2Hrg^Ab%#OuY*tWveAy2?&7hL}DCN+pzYr^D{RYv->A!a}(}u+^?`i?n)OsFAa* zH~YLt4#$m35K4#NH?XCaE4oGc-Z4Iu^>U{Phxucc z$;QfYYIwo8=}vO9aeMwa4`bHu$o{-`p{hyl`OYVH8@8JbRgA&&>pz@MK_q~%D6)Rp zd?QjkVylig^hGow7YY%`y4!O6@mRkDgMcw7`1ayJZqxn+_envRy42Onv5;aq8$>et z1Imbgei|IohRLIJ-XwPTdAGsF&B)_i<@pRvAhljdrddJ0zeNB`b~5d_rAg(u zGFuMw?NMthmwB@xA0M9+8HklRZ?&QqB5URbSr$nD2^O;yMN%VP^3dJdF5d6ae^CNYLB%SPR#FjT@oNbm=ujl+}=$xvInyVF6Q;crpO zFCnTH3^o^z0DL4yMWRIM_ZmR~>RZ!dgF1O`%B+aHvE$XwcuJh7oh)hxz6%2mk`u5r zyIt|^8DxITg!3wmX#FJHMEy0#NqPhUaDkIkdIuhuoFld^O+-8&I^n&WWk~dR6ZEbA z9)`>o{tox=eZ+eArHqq7p4NpdL`QwRN)=Uu~NSN z#Z>adadwY`XSSzhN-m_>Y)>`OZO>sK5kuEDfh<}lX+nv3!TGd|%PVwClxu`*M(KkD ziBrXUd|Ib(Uc6*|YKS+Gc_{z^S?d*p`O56szYER7+``YVj!$~c->zclF7_{Fy8Zs) znl!bT=C3mfSkrw1KpFAbuBuikUg$j=abpb1 z3*z$7zLOLqCgsO54r`AU6WQiU+LBmj(Th8FBxQVq-+{5W=imH-X<+WS7iS6 zmz+3dg%z;1OALQBPJaBm%R^U=CsE{Hi>h(M%{%lDx-HeU>W%LpiR$g+{D_z^jB1rj zmr)yv{4@s_AhU#U)}EVQ=9L57oOV6k2$u;A-6R{QgSL10;IQ5i$fhr)PS&lqGo&Cx zqy4l8yD_eC(Y?JyBYrKv=slum=(ewXCDWha`13NfR!s z9&OH%xyunXw~@t!>tVR{D#A3Pm4+FpOxvJCyx{sxnV9tHkL`gWjC|t)34+s-F!}ln zdHJaql^f)1RuKd4S{EowOkAv)<2>HM**QgJv8D$?KL`d^?hUtj6?{&@cn3pdo}bD?B!bP6vI@`?JJ^?2c|^_mTWM6Le8MF6|6aXUn*QPGbR zq_pXR%Z+WP8-i_F-ndCsO~iHe?v@(Qp}>en4vZci5kHccWDAQGg7mEEL`O^Uz_>tU{)eYXG8_l7 zlQy2lKg5%)Q_>lb8)ElrX&R3_?utR9VIXv4m%<{T5}V!zMW~|i0*DKPt5$p_hXV=c z`RRxRLpm=^kbQNEggeWiKeILosaBouGrwBpW00&c@PHCU5}4HKu!eh|o~zPBpMPl9 z3LIm*{m=hZyFAA}+Fvj?9QXHxlt@|Pvvv$0Uw+9A;zK)(6pRBlq;B_ZIyzhc>*mT6 zpMq|7?8SlbkVr080QJ8F?!J>eF-)b@&8Od_uvXe+ggI=gn-r5%KAK=tZK=?wJlmVV z+32MNUaL7*w#3y0v;>y0&eMtD;u!kRi_~rpCi?&7~ukH zT;Ne>NE8LlH_@rBW9nR{J6GrSCgz=il*?Bn*DS)CEzbwjd4m5A(#Hz^CCY3fs`7@Q zQj;U)^9kF}#d1u$P;&4!76V;4&`N^{JN)h2M+jT$g22ED0IQf4W~S{7@-gdSpK7eG zuy7kFewarOrNh%R2)CRcl{JrqC>4+4PI%xM8URuPf~jyj4zYZ$%p4W&V2s*V5|7Ug z-i96?+?UG8QPp1w@I*PHGl-8PI~>&*E!}%xB?5dJWdlf+z?~;dCRpD8ph)*2SyO6m z5uEu>D5^Vl7YZX=>1!|58Lrf5Cz54BWF{8Iaq26KYV!mv&eKp{B3jf2XYLtz-vV(; zHrR3l7@Li;615mTmjf>|$)-nu3@f9m;h1=QoctrA7ZUDIL$6#f1K%!yi8-ern1<5~ z0vZh$7w_(#Kqx_D=y~_Ai@%)}Ku^pa4x3&H{xA1CZS~@yO^1&0cG;7VJ)9iH3wHMjW1kp_7)#4Cd?Yr#!Pr ztb57H(MI&gTh9Z&OvZ>kP}6vgar!I9_jGvP#ps7s0qM>ziR#)vQ5ourDr*v^I3z;u zU`(!JZYQz~RTlpm8Er$W>2msb>z*kcSQ1^Mv2nAEoTSUe=-`qIX&&c5RXa^chsh%# z8B!Gs<5JAL+(zD`4;MjvtSdd(Jw^)b2PF{=((ust?aif+8_uH!0&k!&FO9Tkjd^d> z;~9pN;TwlHF1^XI`Lu;-L!vo^fF!ojGkb6Cnea%J~0{>ADf>r7H=MO7JF;0aq^39h{=tLISf&H)zh9s#C<} z#rFnD#A%{15!t(j9iKBeuOI-be_@UO{R&BhdbwxZ=qtae2iWai3RI;!pMRHimClDy%hk-A;^maya*T1oa(Gwp}S z@Mqz$c`TH_ydxPKW%Uz=dXC)40fgskezhDm0|f{L8e}V<0{~tKcgY3sd`^$Uj#v)= z8qo%0uj&07d@<+1DVJZvRuh{LUY%gDo!*Ins@b<-sG)O zp5i5So$jl6X(vSufWp#J`3n;vl@Vh}mHFb)P$6yS>QnO*en4+?2jlcpXWRYVzq<~k zsxpO{Ed!sN{$Z@b#=D&&RC;Luu-U6@n*`>_v1p5V9^h5+0U>t|!Xv1r9IJ#dr%7~C(0l=EA$Kl~XTXOu(;h+5O^KIZwt1V^e zjG&C->|pg}gv-$&iYQ^U0nlZU!Yw`&AS3oVtiBD54@-*6MROiGlvMrc9OBA+rNwN- za^l_5!AmK#k}$?1)HDq%T|+Y}Ed?EuC}jZ!hH#-knNB2Q&q}vIU2QHAA8F z0xAB8!hQ3nLNs`78LhAKu2F6IMuzBd14nobaoAH7l&}r#Zm~M=mE8@l7+<;=3d zv^Vj1R&l#JRu4W_9)nNx8wl=df8;d)nDa~?mTqqec4mH-_&BE+@2HaQ4BTAra*^a@ zefY?e*-bsXx3L>WwAv%D6pkTiy0EeiH51S?Ll~G1sEs+2vLwYZpN$M?*g``pKsHBm z(CjxaFGeEPm&DkP8nu?o5+lVZb`2XUMd?&XAfqJSB+`V8Jj90w&(S@ojmic95?gcp zCZS}DE9qbD>*r>ZR4V1=#?p3MgI)VHMnypimBG5YENQ~m?mM^)?MLm(Yzd+3qr9>; z@<`AjLU9OD@tC}*6KL{pr;@JNqzX6D({=;&RNmV{Q zzxd%OaQ78SQ8{0xPh1DrApnBpCb&fmPvE`9!~{}*_MqDDAkFqRIdqdyr|p&UiTTh2=2HzR^C z-vK1f(^JxY{+(fsZF)SHxZk(k_1msw*r?u_iE6vJqupjam5zkPVBKUNmF}(XWTCNO zXX7LaOyn7o1jBi*EZ~%5TyDRn=qP(`RVFhSR~(+FAczUQcieEY@eR7+)Y35Eo-pBW z7uRFA^h?Mbdl?VTQDR7xS ztL5yTHSNQADApTl=n21^v~{+it{LN(W@2J;>Rl91Fa~!mWCkVp2Fv_z%KdLhZALGM mD*FY!XgvO3A&LR(fj**#ChR%xO7ed{Rmv|l Date: Fri, 31 Jul 2026 11:17:31 +0100 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=9A=80=20[Release=20v4.11.0]=20(#259)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 * 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 * 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 * 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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) --------- Co-authored-by: Kerry Washington Co-authored-by: andhikayuana Co-authored-by: Joseph Sanjaya * fix(#226): android test failure on RecoverWalletScreenGrabsTest (#130) Move SCREENGRAB_PAPERKEY build config to debug build type The `SCREENGRAB_PAPERKEY` build configuration field, used for screengrab tests, was previously defined in both the `debug` and `screengrab` build types. This commit moves the definition solely to the `debug` build type, as the `screengrab` build type inherits from `debug` and thus already has access to this field. Additionally, unused imports were removed from `BrainwalletScreengrabApp.kt`. * fix(#223): fix issue on test environment SLF4J + agent warnings in test env (#129) - Added `slf4j-android` as a test dependency to provide a proper SLF4J binding and avoid "StaticLoggerBinder" warnings. - Configured JVM args for Gradle test tasks to enable dynamic agent loading, suppressing Byte Buddy agent warnings during test runs. * feat(#225): Send sync duration in Firebase Analytics as a custom event and in Settings row (#131) * feat(#225): Send sync duration in Firebase Analytics as a custom event and in Settings row This commit introduces analytics tracking for the sync process. It includes: - `TimeProvider`: A utility class for getting the current time, allowing for easier testing. - `AnalyticsSource`: An interface for logging analytics events. - `FirebaseAnalyticsSource`: An implementation of `AnalyticsSource` that uses Firebase Analytics. - `SyncAnalyticsRepository`: A repository to manage and persist sync-related analytics data, and log events. - `startSync()`: Records the start time of a sync. - `stopSync()`: Records the stop time of a sync and accumulates the duration if the sync is paused/resumed. - `completeSync()`: Persists the total sync duration, end timestamp, and a unique ID. It then logs a "user_did_complete_sync" event with these details and the current block height. - `getLastSyncMetadata()`: Retrieves the metadata of the last completed sync. - Unit tests for the new classes. - Integration of `SyncAnalyticsRepository` into `SyncManager` to call the respective methods at the start, stop, and completion of the sync process. - `FakeSharedPreferences`: A testing utility for mocking SharedPreferences. * chore(#225): Move SyncMetadata formatting to Formatter class This commit introduces a `Formatter` class within `SyncAnalyticsRepository.SyncMetadata` to handle the formatting of sync metadata. The `getFormatted()` method has been removed from `SyncAnalyticsRepository.SyncMetadata` and its logic is now encapsulated in the `SyncMetadata.Formatter.format()` method. This change improves the separation of concerns and makes the formatting logic more testable. The `HomeSettingDrawerSheet` has been updated to use the new `Formatter` class. Unit tests have been added to `SyncAnalyticsRepositoryTest` to verify the correctness of the `SyncMetadata.Formatter`. * feat(#234): Implement language-specific Firebase messaging topics (#132) This commit introduces the ability to subscribe and unsubscribe from Firebase messaging topics based on the user's selected language. Key changes: - Added `MessagingTopicDataSource` to fetch topic configurations from a JSON file. - Added `MessagingTopicRepository` to manage topic data. - Added `MessagingTopicUseCase` to handle subscription logic. - Added `LanguageSwitcherUseCase` to orchestrate language switching and topic subscription updates. - Integrated topic subscription updates into `SettingsViewModel` and `ChangeLanguageBottomSheet`. - Added a `topics.json` asset file containing the topic definitions. - Included unit tests for the new data source, repository, and use cases. - Initialized messaging topics on app startup in `BrainwalletApp`. * bump code * chore(#234): normalize Indonesian language code to "id" (#133) The Indonesian language code "in" is normalized to "id" in `MessagingTopicDataSource` to align with the ISO 639-1 standard used by the backend. This ensures consistency in topic generation for Indonesian language users. Tests have been added to verify this normalization for both "in" and "in_ID" inputs. * Feat: Detekt and Test Plugins, (Including Create Detekt Baseline) (#136) * feat: integrate build logic submodule Integrates the `gruntsoftware-build-logic` Git submodule into the project. This change includes: - Adding the submodule to `.gitmodules`. - Including the build logic in `settings.gradle.kts`. - Applying build logic plugins (`test` and `detekt`) in `app/build.gradle.kts`. * chore(detekt): apply baseline rules * chore: Remove ktlint from project This commit removes the ktlint configuration and associated tasks from the `app/build.gradle.kts` file. It also removes the `pinterest-ktlint` dependency from the `gradle/libs.versions.toml` file. * Chore/renamed gp module (#140) * Fixed the Git Submodule references * updated gitmodules config * create private gp submodule * Update settings.gradle.kts * chore: Migrate build logic to version catalog and update submodules This commit migrates the project's build logic to use a centralized version catalog (`grunt`) and updates submodule references. Specific changes include: * **Submodule Updates:** * Updated `gruntsoftware-build-logic` submodule pointer. * Updated `modules/private-general-purpose` submodule pointer. * **Build Configuration (`settings.gradle.kts`):** * Removed the conditional loading of the `games` version catalog. * Added a `grunt` version catalog loaded from `gruntsoftware-build-logic/gradle/libs.versions.toml`. * Changed the included module from `:modules:private-general-purpose:content` to `:modules:private-general-purpose:games`. * Removed conditional inclusion logic for `:modules:private-general-purpose:content`. * **Root `build.gradle.kts`:** * Updated plugin aliases from `libs.plugins.android.*` to `grunt.plugins.android.*`. * **App `build.gradle.kts`:** * Updated plugin alias for `com.android.application` from `libs` to `grunt`. * Updated the `games` module dependency to `implementation(project(":modules:private-general-purpose:games"))` and removed the conditional logic for `findProject(":modules:games:content")`. * Updated various dependencies to use the `grunt` version catalog (e.g., `grunt.androidx.core.ktx`, `grunt.androidx.compose.bom`, `grunt.bundles.androidx.compose`, `grunt.material`). * **Version Catalog (`gradle/libs.versions.toml`):** * Removed versions for `agp` and `androidx-core-ktx`. * Removed versions for `androidx-compose-bom`, `androidx-activity-compose`, and `androidx-fragment-compose`. * Removed `androidx-core` library alias. * Removed various `androidx-compose` library aliases and the `androidx-compose` bundle. * Removed `android-application` and `android-library` plugin aliases. * ci: Configure GitHub token for submodules in CircleCI This commit updates the CircleCI configuration to include a step that configures a GitHub token. This token will be used for authenticating access to submodules during the build process. * refactor: Update module paths for 'games' This commit refactors the project structure by moving the 'games' module. - The 'games' module path in `settings.gradle.kts` is changed from `:modules:private-general-purpose:games` to `:games` and its `projectDir` is set to `modules/private-general-purpose/games`. - The dependency path in `app/build.gradle.kts` for the 'games' module is updated from `project(":modules:private-general-purpose:games")` to `project(":games")`. The submodule references for `gruntsoftware-build-logic` and `modules/private-general-purpose` were also updated. --------- Co-authored-by: Joseph Sanjaya * create private gp submodule * Update settings.gradle.kts * chore: Migrate build logic to version catalog and update submodules This commit migrates the project's build logic to use a centralized version catalog (`grunt`) and updates submodule references. Specific changes include: * **Submodule Updates:** * Updated `gruntsoftware-build-logic` submodule pointer. * Updated `modules/private-general-purpose` submodule pointer. * **Build Configuration (`settings.gradle.kts`):** * Removed the conditional loading of the `games` version catalog. * Added a `grunt` version catalog loaded from `gruntsoftware-build-logic/gradle/libs.versions.toml`. * Changed the included module from `:modules:private-general-purpose:content` to `:modules:private-general-purpose:games`. * Removed conditional inclusion logic for `:modules:private-general-purpose:content`. * **Root `build.gradle.kts`:** * Updated plugin aliases from `libs.plugins.android.*` to `grunt.plugins.android.*`. * **App `build.gradle.kts`:** * Updated plugin alias for `com.android.application` from `libs` to `grunt`. * Updated the `games` module dependency to `implementation(project(":modules:private-general-purpose:games"))` and removed the conditional logic for `findProject(":modules:games:content")`. * Updated various dependencies to use the `grunt` version catalog (e.g., `grunt.androidx.core.ktx`, `grunt.androidx.compose.bom`, `grunt.bundles.androidx.compose`, `grunt.material`). * **Version Catalog (`gradle/libs.versions.toml`):** * Removed versions for `agp` and `androidx-core-ktx`. * Removed versions for `androidx-compose-bom`, `androidx-activity-compose`, and `androidx-fragment-compose`. * Removed `androidx-core` library alias. * Removed various `androidx-compose` library aliases and the `androidx-compose` bundle. * Removed `android-application` and `android-library` plugin aliases. * feat(deps): add kotlin-immutable dependency This commit adds the `kotlinx-collections-immutable` library, version 0.4.0, to the project's dependencies. * refactor(app): Relocate core module imports Updates the import paths for the core presentation module from `ltd.grunt.brainwallet.core.presentation` to `com.grunt.brainwallet.core.presentation`. This refactoring touches multiple UI components and initializers across the `app` module to align with the new package structure. Additionally, this commit corrects a typo in `SeedWordItem.kt`, changing the error color variable from `chilli` to `chili` to match the theme definition. Finally, the submodule pointer for `private-general-purpose` is updated. * build bump * removed cruft * chore(submodules): remove bugged games repository * bump code * Release/v4.8.0 (#147) * 🚀[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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * 🚀[Release v4.7.2] Merge into Main (#128) * 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 * 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 * 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 * 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. * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana Co-authored-by: Joseph Sanjaya * Release/v4.7.2 202506296 (#134) * 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 conn… * bug(crashlytics): Remove InputWordsActivity from AndroidManifest * fix(crashlytics): resolve ReEnterPinActivity crashes and deprecation warnings (#148) * fix: resolve ReEnterPinActivity crashes and deprecation warnings - Add missing VIBRATE permission to prevent SecurityException crashes - Fix API compatibility issues with activity transitions (API 29+ support) - Remove unnecessary SDK version checks for vibration (min SDK is 29) refactor: modernize ReEnterPinActivity navigation handling - Replace deprecated onBackPressed with OnBackPressedDispatcher - Update activity transitions to use modern overrideActivityTransition (API 34+) with fallback - Update SetPinActivity to use new ReEnterPinActivity.createIntent() method - Remove legacy Java ReEnterPinActivity and update AndroidManifest references - Clean up BreadActivity references to removed legacy activity * Refactor: Remove legacy PIN activities and layouts This commit removes the legacy PIN management activities (`SetPinActivity`, `ReEnterPinActivity`, `UpdatePinActivity`) and their associated layouts and tests. The functionality for setting, re-entering, and updating the PIN has been consolidated and moved into a modern, composable architecture. Specific changes include: - Deletion of `SetPinActivity`, `UpdatePinActivity`, and their XML layout `activity_pin_template.xml`. - Deletion of the Kotlin-based `ReEnterPinActivity` and its associated MVI components (Intent, State, SideEffect, ViewModel) and unit tests. - Removal of references to these deleted activities from `AndroidManifest.xml` and other parts of the codebase like `PromptManager` and `SecurityCenterActivity`. - Update of `tools:context` attributes in several XML layouts that were incorrectly pointing to `SetPinActivity`. - `PromptManager` and `SecurityCenterActivity` are updated to navigate to the new `BrainwalletActivity` with an `UnLock` route for PIN-related actions. - Cleaned up related code in `BreadActivity` and `ActivityUTILS`. * Remove resizability and orientation restrictions in our app (#146) * Remove resizability and orientation restrictions in our apps to support large screen devices * Remove resizability and orientation restrictions in bread activity * Lock the unlockscreen composable to potrait * build: Build secp256k1 as a static library and add ABI splits (#149) This commit refactors the native build process and enhances library loading. Key changes: - `CMakeLists.txt` is updated to build `secp256k1` as a separate static library. This modularizes the build and allows for specific optimization flags. - Architecture-specific optimizations (`-O3 -ffast-math`) are now applied to both `core-lib` and `secp256k1` for the `arm64-v8a` ABI. - In `build.gradle.kts`, ABI splitting is enabled to create smaller, architecture-specific APKs. - `BRActivity.java` is updated with improved error handling for native library loading. It now includes more detailed logging and a fallback mechanism to load the library from an explicit path if the standard `System.loadLibrary` call fails. * version bump (#159) Reviewing the code for a update * Revert "build: Build secp256k1 as a static library and add ABI splits (#149)" This reverts commit 2f06f5cbd6369e8112111edfb6078a43ad58d19b. * Techdebt/adjust build logic (#161) * Renaming the build logic repo * rename the location of the build logic * reset the path * updated the build logic and private gp * updated the private gp * Paired with @kcw-grunt, @josikie to verify the android build logic and private repo. --------- Co-authored-by: josikie * Added auto translate (#178) * Add auto-translate workflow for strings.xml This workflow automatically translates missing strings in strings.xml files when changes are pushed to specific branches or manually triggered. It checks for changes, creates a new branch for translations, commits the updates, and opens a pull request if there are any changes. * Added auto translate files per push * Polished files * fixed typo * nit * Add auto-translate workflow for strings.xml This workflow automates the translation of strings.xml files on push to specific branches and allows manual triggering. It checks for changes and creates a pull request if translations are updated. * Create PR summary workflow with GitHub Copilot Add GitHub Actions workflow for PR summary generation using Copilot * Changed the AI completions * Add more information of the README * nit fix * 🦖😱 HUGE!! Bento Integration (#192) * Update Bento with Latest Develop (#144) * create private gp submodule * Update settings.gradle.kts * chore: Migrate build logic to version catalog and update submodules This commit migrates the project's build logic to use a centralized version catalog (`grunt`) and updates submodule references. Specific changes include: * **Submodule Updates:** * Updated `gruntsoftware-build-logic` submodule pointer. * Updated `modules/private-general-purpose` submodule pointer. * **Build Configuration (`settings.gradle.kts`):** * Removed the conditional loading of the `games` version catalog. * Added a `grunt` version catalog loaded from `gruntsoftware-build-logic/gradle/libs.versions.toml`. * Changed the included module from `:modules:private-general-purpose:content` to `:modules:private-general-purpose:games`. * Removed conditional inclusion logic for `:modules:private-general-purpose:content`. * **Root `build.gradle.kts`:** * Updated plugin aliases from `libs.plugins.android.*` to `grunt.plugins.android.*`. * **App `build.gradle.kts`:** * Updated plugin alias for `com.android.application` from `libs` to `grunt`. * Updated the `games` module dependency to `implementation(project(":modules:private-general-purpose:games"))` and removed the conditional logic for `findProject(":modules:games:content")`. * Updated various dependencies to use the `grunt` version catalog (e.g., `grunt.androidx.core.ktx`, `grunt.androidx.compose.bom`, `grunt.bundles.androidx.compose`, `grunt.material`). * **Version Catalog (`gradle/libs.versions.toml`):** * Removed versions for `agp` and `androidx-core-ktx`. * Removed versions for `androidx-compose-bom`, `androidx-activity-compose`, and `androidx-fragment-compose`. * Removed `androidx-core` library alias. * Removed various `androidx-compose` library aliases and the `androidx-compose` bundle. * Removed `android-application` and `android-library` plugin aliases. * feat(deps): add kotlin-immutable dependency This commit adds the `kotlinx-collections-immutable` library, version 0.4.0, to the project's dependencies. * refactor(app): Relocate core module imports Updates the import paths for the core presentation module from `ltd.grunt.brainwallet.core.presentation` to `com.grunt.brainwallet.core.presentation`. This refactoring touches multiple UI components and initializers across the `app` module to align with the new package structure. Additionally, this commit corrects a typo in `SeedWordItem.kt`, changing the error color variable from `chilli` to `chili` to match the theme definition. Finally, the submodule pointer for `private-general-purpose` is updated. --------- Co-authored-by: Kerry Washington * feat(bento): Scaffold Bento module with main screen (#143) This commit introduces the new `bento` Android libs module. It scaffolds the main screen (`BentoMainScreen`) which features a bento-style grid layout, a top action bar, a bottom navigation bar, and a modal navigation drawer with a custom rail. Key additions include: - `BentoActivity` as the main entry point. - Composable components for the main screen, rail, and various widgets. - Initial Gradle setup with necessary dependencies. - Android Manifest, resources, and vector drawables for the UI. - Inclusion of the `:bento` module in `settings.gradle.kts`. * Moderately moved to the old file system (#162) * Task: Added Basic layout functionality (#163) * Adjusted the padding to show the status bar at the top Compiling and added MVVM Classes Adding ComponentActivity instead of AppCompat connecting the Tab Actions Debugging the modals for the tab bar Successfully wired in tab actions * version bump * Task/add gamehub bento section (#164) * Adjusted the padding to show the status bar at the top Compiling and added MVVM Classes Adding ComponentActivity instead of AppCompat connecting the Tab Actions Debugging the modals for the tab bar Successfully wired in tab actions * Added the background and text * WIP: Resetting the bento ratios and the GameHub bento layout * Added ibm plex sans Polished the bottom nav bar * WIP: Layout of the MainScreen is 75% is there but it doesnt work 100% Working in the alts * Further discovery of the Settings data * version bump * version bump Resetting the bento ratios and the GameHub bento layout Added ibm plex sans Polished the bottom nav bar Further discovery of the Settings data * Fix/show unlock after ready restore (#167) * Version bump * Updated the modules and fixed some warnings Set the sdks Updated the submodules prior to the android-build-modules remove old android build logic * Updated the BRKeystore with a new putMasterPubKey method * Added more bulletproofing of the store pubkey Reset the secp256k1 commit: b408c6a This version is entirely sensitive of the lib because the Bitcoin devs decided it was not necessary flag. We still use it * RC: Verified the NEW_WALLET PATH now works The Ready path works. Added a FB if failing * Minor polish to the InputWords layout * Removed the commented out BRKeyStoreTest * Clean issue in remove tests * Added working BRKeyStore tests * Removed example test(s) * version bump * Rename Test stage * Feat/ltc picker bento with working onboarding (#168) * Version bump * Updated the modules and fixed some warnings Set the sdks Updated the submodules prior to the android-build-modules remove old android build logic * Updated the BRKeystore with a new putMasterPubKey method * Added more bulletproofing of the store pubkey Reset the secp256k1 commit: b408c6a This version is entirely sensitive of the lib because the Bitcoin devs decided it was not necessary flag. We still use it * RC: Verified the NEW_WALLET PATH now works The Ready path works. Added a FB if failing * Minor polish to the InputWords layout * Removed the commented out BRKeyStoreTest * Clean issue in remove tests * Added working BRKeyStore tests * Removed example test(s) * version bump * Rename Test stage * Transferred theme elements * Changed to local DesignTheme from old BWTheme * Replaced thet private BrainwalletTheme to a local DesignTheme This is a WIP * Fixed the theme toggle button * WIP: Brought more update UI LTCPicker Wired in the latest date into the LTC Picker added new stringResource Building the LTC Picker Polished the layout of the LTCPicker Bento Added a state test Added a new class enum to match iso to country flags Added label version bump * Polished the unlock screen * Added new tests for the LTCPickerBento * WIP: Debugging the toolbar at the top for settings and theme buttons * Polished the ltc and nav bar * Added Test Coverage flags in the build gradle * ⚖️ Feature/add balance bento clean (#171) * Deleted old files some cruft some to support new design * Added new files for the effort to include Composables, strings and images * Updated resources for strings and images * Updated the Android Studio and Project files * Added more test files * Renamed the BRConstants file to BWConstants * Changed for the LTCPickerBentos from a previously merged PR * Reset the Routes and its naming Reset the Utils for constants Changing the layout Renamed a home to main * Renamed the nav layer Removed unused code Added id to TxItem for the Layout of items Added comments * Updated the design elements Added the new name of the activity * Added an update to the PeerManager Included the LTCStats using the new endpoint for the latest block height Changed the koinModules loading Added a removal of the connection listener Added far more functionality into the BrainwalletActivity against BreadActivity Updated and properly set the core to commit 28d7d31ae057bdde33b1d19e6b7af3ba07710c89 * Added tests to the Balance Bento ViewModel tests Adjusted the model to support DI * Added tests for the Event and State classes of BalanceBento * cleaned the mem settings adjusted gradle per CircleCI statement recommendation reorg the circleci config to expand the cache set the tests run polish memory in CircleCI * Fixing new wallet route Fixed my routing for the new wallet Tested and verified * 💰Feature/transaction detail bento (#173) * 💅🏼 Task/polish buy receive action (#174) * version bump * Added animation of the transactions bentos Added the basic transaction rows and detail added the viewModel and Event Included the bar icons and the switch Wired in the composables Added more string resources Set detail sizes Built in Transaction Detail Connected the isDark from Settings Polishing the Transaction Row and Detail added the QR code WIP: Added constant for the transaction view Added a empty No Transactions Row when there are not transactions WIP fixing the toggle Adding an empty transaction * Reused the BuyReceive Screen For when the user has no txns * Added the release candidate layout for the Balance Bento for syncing Also, polished the sync activity * Added some padding for the scrolling Added a blockage if the user has no transactions * Renamed the preferences Recalculated the values in the Transactions detail Added better layout of the filter toggle button Debugging the amounts and txItem values * added unit tests of Transaction view model * Reusing the BuyDialog within a Modal * Polished the layout of the modal Moved the Receive classes to the bento section Added tests for the RecieveDialogViewModelTests * Added more tests for ReceiveDialogState * 🎛️ Task/re attachment settings screen (#175) * Added animation of the transactions bentos Added the basic transaction rows and detail added the viewModel and Event Included the bar icons and the switch Wired in the composables Added more string resources Set detail sizes Built in Transaction Detail Connected the isDark from Settings Polishing the Transaction Row and Detail added the QR code WIP: Added constant for the transaction view Added a empty No Transactions Row when there are not transactions WIP fixing the toggle Adding an empty transaction * Reused the BuyReceive Screen For when the user has no txns * Added the release candidate layout for the Balance Bento for syncing Also, polished the sync activity * Added some padding for the scrolling Added a blockage if the user has no transactions * Renamed the preferences Recalculated the values in the Transactions detail Added better layout of the filter toggle button Debugging the amounts and txItem values * Reusing the BuyDialog within a Modal * Polished the layout of the modal Moved the Receive classes to the bento section Added tests for the RecieveDialogViewModelTests * Wired into the Most updated version of the SettingsComposable Set some constants Removed references to the legacy version Changed the location of the package * Added more tests of the BWConstants Combined the LTCPicker Tests * Renamed and reorged the file structure Deleted unused files * Debugged the AppModule issue Debugged the fiat / iso setting throughout the app Removal of the History classes Setup the transactionDetail action without route Removed the BRSharedPrefs callbacks Converted to Flow style with more popular and modern style * Migrated more appSetting to StateFlow Applied StateFlow in most placed for Settings Some AppSettings need to be migrated * Added a confirmation indicator * Pass LTC States Added a polish into the transaction per row Added the string localizations Migrated the data source as state flows Pass LTC Stats across many VMs * Refactor to update tests Removed old code * localized the tagline * 🛠️ Task/refactor code bugfixes (#177) * Added a special test for Insta and Linktree version bump WIP Debug the sync state * Renamed the BRWalletManager callback: onBalancedChanged * Refactor resources Removed or modified colors Removed or modified images Removed or modified strings * Added more composables Added more design elements:Gradients Dashed divider * small changes to the Transaction classes * Small update of the Balance Bento Moved the state to MainViewModel rather than a duplicate in BalanceViewModel * Refactors the navbar and updated that toml * Refactored of the MainScreen and related classes * Refactoring tests * version bump * Feat/send classes adding func modal (#181) * Added working Send group Polished the layout and UI for Send Renamed the send prep classes Added the Memo field in confirm * Refactoring the Send Rows Refactored the precision of the amounts for send and balances Updated all relevant types to BigDecimal Flowed some values to the ViewModel * Set formatting of the Confirmation widget Broke the PreSend Composable into smaller composables - PreSendAddressRow - PreSendAmountRow - PreSendMemoRow Polished the rows Added a debug for the memo row Refactored the amount * Added focus listener to recalculate the values prior to send * Added state variable brainwalletIsSyncing to the main WIP Debugging the send Readded then camera Passed the ltc address to the send class Wiring in the old Send Fragment and testing * Removed a legacy activity Adding the Passcode wrapper Wired in the passcode composable to be used in the send function Added a combined boolean to check for send disable fixed the send button enable disable Relaying out the spaces for the SendScreen refactor the send modal spacer Fixed the extra coinflip Successfully sent. need to cleanup calls * version bump * Added a clearance of value on edit version bump Added BigDecimal with rounding mode * Added gh workflow auto-translate * fix typo * Change translation PAT secret in workflow Updated GitHub Actions workflow to use new translation PAT secret. * Remove environment specification from translate job * moved script py * dupe of the script * changed the key * Update environment variable for translation script * Change environment variable from ANTHROPIC_API_KEY to ANTHROPIC_GH_API_KEY * add test workflow * Add workflow to test Anthropic API key * Change base branch for PR from main to bento * Changed the model for the translation * Added a number counter * remove the test workflow * 🥃 🥽🧪 Added tests to increase coverage (#182) * Added working Send group Polished the layout and UI for Send Renamed the send prep classes Added the Memo field in confirm * Refactoring the Send Rows Refactored the precision of the amounts for send and balances Updated all relevant types to BigDecimal Flowed some values to the ViewModel * Set formatting of the Confirmation widget Broke the PreSend Composable into smaller composables - PreSendAddressRow - PreSendAmountRow - PreSendMemoRow Polished the rows Added a debug for the memo row Refactored the amount * Added focus listener to recalculate the values prior to send * Added state variable brainwalletIsSyncing to the main WIP Debugging the send Readded then camera Passed the ltc address to the send class Wiring in the old Send Fragment and testing * Removed a legacy activity Adding the Passcode wrapper Wired in the passcode composable to be used in the send function Added a combined boolean to check for send disable fixed the send button enable disable Relaying out the spaces for the SendScreen refactor the send modal spacer Fixed the extra coinflip Successfully sent. need to cleanup calls * Added a clearance of value on edit version bump Added BigDecimal with rounding mode * Added Module Tests * Added gh workflow auto-translate * Added more Tests: BrainwalletAppTest * Feat/add fav bento design (#189) * Added design for Top Secret and the Tutorials bentos Added preview added strings files and localizations * Removed HomeBento placeholder code * fixed the config commenting * 🍱 Feat/add fav bento design (#191) * Added design for Top Secret and the Tutorials bentos Added preview added strings files and localizations * Removed HomeBento placeholder code * Fixed to unescaped aposthrphes chore(i18n): auto-translate missing strings [skip ci] Languages updated: ar, zh-rTW, zh-rCN, fr, de, fa, pa, pl, in, es, sv, uk, ru, tr, ja, ko, hi, it, pt-rBR Triggered by: 3d594e9c3360eae8d105bf81e7eeb36676d7c23c chore(i18n): auto-translate missing strings [skip ci] Languages updated: ar, zh-rTW, zh-rCN, fr, de, fa, pa, pl, in, es, sv, uk, ru, tr, ja, ko, hi, it, pt-rBR Triggered by: 2443fdef72e17658a481a091abb17ab145b1f495 Reformat the xmls Revert the notation --------- Co-authored-by: github-actions[bot] * 🎠 feat: Add Carousels (#193) * Add containers for carousels Midway adding the components of a carousel * Added the pager screen and the baseline * Added creatives Added the wiring to deploy screens and or actions * Revert "Merge branch 'bento' into feat/add-carousel-in-gamehub" This reverts commit 2b340eb2059708954bd1c851ea1dcd1f7f4dddec, reversing changes made to 6af30b1eae900aa09c6ecdcddece1ecd0c4ebb24. * chore(i18n): auto-translate missing strings [skip ci] Languages updated: ar, zh-rTW, zh-rCN, fr, de, fa, pa, pl, in, es, sv, uk, ru, tr, ja, ko, hi, it, pt-rBR Triggered by: 2b340eb2059708954bd1c851ea1dcd1f7f4dddec * Polished the LTC picker --------- Co-authored-by: github-actions[bot] * Version bump Ran test successfully * added pr summary workflow for GH Actions * Moved to the Claude for the PR Summary * fix typo * fixed the naming * Fixed name across script * add a log statement * add a log statement Moved to the Claude for the PR Summary fix typo fixed the naming Fixed name across script * fixed model typo --------- Co-authored-by: Joseph Sanjaya Co-authored-by: github-actions[bot] * 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 * 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 * 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 * 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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 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 F… * Feat/add thai dutch (#197) * 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 * 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 * 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 * 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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… * update gitignore (#204) * Add send/receive transaction integration tests (#203) * 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 * reformatted the test --------- Co-authored-by: Claude Sonnet 4.6 * Designdebt/polish main screen (#205) * Changed the borders * Change border 1dp white 20percent * Polished the no tx row * Polished the layout values updated the images * version bump * bump * Feat/add gamehub minigame (#206) * 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 (#207) * Moved clipboard test point into event * renamed * moved out of the state update (#208) * Version bump * fix: issue when user tries to send (#210) Added caller when the value is updated bump version WIP * reformatted the test * Added More comprehensive Send Tests to cover better stability Created an android test directory for instrumented test * Add WalletManager; make validateAddress instance 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. * Updated the InstrumentedTest polished the bentos Added more tests for sender * adjust the config * adjust config for running * Further fix * Fixes the bug: BreadActivity.initializeViews 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. * updated README version bump add notify script * bump * chore(i18n): auto-translate missing strings [skip ci] (#213) * 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: ee688c0c539bab3e9686e7659bac2e31561911a5 * update notify --------- Co-authored-by: github-actions[bot] * Feat/add tutorial functionality (#214) * Filled in the tutorials * Added analytics test points; linter 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: a8d1f57a8e0fc07e162b6cecd17a46e55caf12dd * Removed problem issue string * 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: 953ac76c6e3254bdae06288d9bd056c197e06275 * cleaned error strings --------- Co-authored-by: github-actions[bot] * Feat/bitrefill in topsecret (#217) * Built basic layout of the bento Added creatives Added telephony * Polished and refactored issues with the Tuts * Added and reset the web screen Added animations Added some tests * polished the strings removed some stale * add translated tags * Feat/bitrefill in topsecret (#221) * Built basic layout of the bento Added creatives Added telephony * Polished and refactored issues with the Tuts * Added and reset the web screen Added animations Added some tests * polished the strings removed some stale * add translated tags * added polish * ✨ 🛍️ 🛠️ Fix/sendmodelonevent crash (#224) * Added a keyword for Flaky tests Refactored the tests Fixes SendViewModel onEvent Fixes send keypad * 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: c37769d634e22126995e1851b945afa1fd9b66f3 * Add workflow_dispatch trigger to PR summary workflow * Update workflow name to include emoji * Change workflow reference from 'main' to 'develop' * Enable manual dispatch for notify workflow Modified workflow to enable manual dispatch and commented out pull request triggers. --------- Co-authored-by: github-actions[bot] * Fixxed the layout of the LTC fiat picker (#225) Connected the selection to the picker * Refactored the analytics (#226) * Refactored the analytics * change test * 🧼 Techdebt/sync reduce rate fpf (#228) * Fixed and normalized polling from a single source. Added a remote config to modulate the sync and non sync durations update the core module * Refactored the webviews * bump * Techdebt/sync reduce rate fpf (#229) * Fixed and normalized polling from a single source. Added a remote config to modulate the sync and non sync durations update the core module * Refactored the webviews * pulled in the fpf rate and the removed peers * bump * Feat/add remote shop (#230) * Added remote config to shop * Match event name * Added activity indicator * version bump polished the url * add part of test * Techdebt/improve shop (#232) * Working Route with Bitrefill Update remote config defaults Adding and unwrapping the JSON for the cards * Version bump Working version * Seriously refactoring the BreadActivity Remvoed more cruft of BreadActivity Able to debug crash which was calling the cards before they are filled * Parsed remote data of the widget and cards * Close to layouts are well polished * Working the cards with polish * Refactored the tests * Added analytics when user shows invoice in shop (#233) version bump * Techdebt/modules update (#235) * Update bw-gdlib moved to the proper module * Updated the core from PeerManager * Fixed the negative value Added the sound * Fallinmoji closed branch (#241) * release/v4.9.3 (#234) * 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 * 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 * 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 * 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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 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 cal… * version bump Removed bwgdlib cruft * Techdebt/polish interface (#242) * Stored emojis are working! Added pager in emoji sequence How to is done Picker in progress Built the YourEmojis route Moved the InAppReview class Created the InAppReview Service Layout the bullets Completed layout for the How to choose Added better gradients Removed the textfield Disable sheet gesture Added `deprecated` portrait setting in the Android Manifest xml Wired in the Game Hub when user doesnt have the 3 emojis Polished the layout * Cleaned up item layout in 3 emojis Added logic to show the emojis WIP: Figuring out the nav for setting emojis Relayout the Pick Emojis x close * Add label in button * Version bump * Fix/polish clear set emojis (#243) * Added a check to show/ hide the Brainwallet Phrase in Settings * Hooked in the drawerState to set and clear the emojis * Set the clean process Reset the name of the bw-gdlib to match * Changed the pat * polish yml * Use typical GH TOKEN * Refactor yml * chore(i18n): auto-translate missing strings [skip ci] (#245) 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: c45fa054523d62a886635d74470d8c53a517e1d1 Co-authored-by: github-actions[bot] * Unescaped the ' in the translated strings in non-exist * fix(BreadActivity): remove dead bottom-nav/toolbar cruft causing startup NPE (#248) The "Techdebt/improve shop" refactor (d0886db0) 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 * fix(submodules): remove stale modules/bw-gdlib gitlink breaking CI (#249) Commit 1b353ae6 (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 * fix(shop-bento): eliminate flaky ShopBentoViewModelTest + version bump (#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 * 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 * 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 --------- Co-authored-by: kcw-grunt Co-authored-by: Claude * docs: real SECURITY.md + restructured README for external visitors (#251) * 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 * 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 * updated the README.md --------- Co-authored-by: Claude Co-authored-by: kcw-grunt * Bump bw-gdlib submodule to pick up ghost-launcher fix (#252) * 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> * docs: standardize release headers to bold version + PR + divider format (#254) Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> * 🎮 Fallinmoji v1.6.0: Ready, Set, GO! (#257) * update Fallinmoji v1.6.0 bump version * Update .gitignore --------- Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> * Add this skill * test: add unit test coverage for pure utility helpers and gameinterface 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). * docs: add v4.11.0 release notes to README * Activate InAppReviewService and wire up review prompts (#260) * 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. --------- Co-authored-by: Kerry Washington Co-authored-by: andhikayuana Co-authored-by: Joseph Sanjaya Co-authored-by: Josi Kie <54074780+josikie@users.noreply.github.com> Co-authored-by: josikie Co-authored-by: github-actions[bot] Co-authored-by: Claude Sonnet 4.6 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> --- .gitignore | 3 +- README.md | 23 +++ app/build.gradle.kts | 4 +- .../appreview/InAppReviewService.kt | 2 +- .../main/java/com/brainwallet/di/AppModule.kt | 4 + .../brainwallet/gameinterface/GdxGameView.kt | 4 +- .../balancebento/BalanceBentoScreen.kt | 22 ++- .../tutorials/send/TutorialSendPage2.kt | 9 +- .../walkthrough/TutorialWalkthroughPage3.kt | 10 +- .../ui/screens/gamehub/GameHubViewModel.kt | 11 ++ .../ui/screens/send/SendViewModel.kt | 15 +- .../appreview/InAppReviewServiceTest.kt | 157 ++++++++++++++++++ .../brainwallet/tools/crypto/Base58Test.kt | 79 +++++++++ .../tools/util/BRCompressorTest.kt | 58 +++++++ .../brainwallet/tools/util/BRDateUtilTest.kt | 59 +++++++ .../brainwallet/tools/util/BytesUtilTest.kt | 59 +++++++ .../tools/util/TypesConverterTest.kt | 68 ++++++++ .../ui/screens/send/SendViewModelTest.kt | 6 +- .../gameinterface/GameKoinModuleTest.kt | 30 ++++ .../gameinterface/GdxGameViewTest.kt | 144 ++++++++++++++++ bw-gdlib | 2 +- skills-lock.json | 17 ++ 22 files changed, 768 insertions(+), 18 deletions(-) create mode 100644 app/src/test/java/com/brainwallet/appreview/InAppReviewServiceTest.kt create mode 100644 app/src/test/java/com/brainwallet/tools/crypto/Base58Test.kt create mode 100644 app/src/test/java/com/brainwallet/tools/util/BRCompressorTest.kt create mode 100644 app/src/test/java/com/brainwallet/tools/util/BRDateUtilTest.kt create mode 100644 app/src/test/java/com/brainwallet/tools/util/BytesUtilTest.kt create mode 100644 app/src/test/java/com/brainwallet/tools/util/TypesConverterTest.kt create mode 100644 app/src/test/kotlin/com/brainwallet/gameinterface/GameKoinModuleTest.kt create mode 100644 app/src/test/kotlin/com/brainwallet/gameinterface/GdxGameViewTest.kt create mode 100644 skills-lock.json diff --git a/.gitignore b/.gitignore index b3531703..f8a0e8e7 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,5 @@ service-data.json canary-file.json # Claude -.claude/ \ No newline at end of file +.claude/ +CLAUDE.local.md \ No newline at end of file diff --git a/README.md b/README.md index fb5c5225..609be87c 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,29 @@ For the full, up-to-date changelog see [GitHub Releases](https://github.com/grun --- +### **v4.11.0** [PR [#259](https://github.com/gruntsoftware/android/pull/259)] +--- +#### 🎮 Fallinmoji v1.6.0 — Ready, Set, GO! +Tapping **Play** (or **Play Again** from the end screen) now runs a short intro sequence before the round begins instead of dropping straight into gameplay: +- **Ready dialog** — shows the round's 3 target emojis on star icons alongside the bonus-scoring rules for ~4.8s +- **3-2-1-GO! countdown** — a rewired full-screen countdown over a looping 6-frame ray-burst flipbook and center star accent, replacing the old libGDX `ParticleEffect`-driven burst for more reliable screen coverage and consistent timing +- Main menu button artwork polished (Play / How-To buttons) + +#### 🧪 Test Coverage +Added 48 new unit tests across 7 new test classes, closing coverage gaps on previously-untested pure-logic utilities and the `gameinterface` package: +- `Base58Test`, `TypesConverterTest`, `BytesUtilTest`, `BRCompressorTest`, `BRDateUtilTest` — encode/decode round-trips, gzip/bz2 compression round-trips, and relative-time formatting edge cases +- `GameKoinModuleTest` — verifies the `gameModule` Koin DI wiring resolves `GameSlot` to `GdxGameSlot` as a singleton +- `GdxGameViewTest` — covers `GameExitData` JSON parsing (defaults, unknown-key tolerance) and the social-share dispatch logic in `handleGameExit` (Twitter/Instagram screenshot sharing, missing/empty screenshots, malformed JSON, unrecognized networks) + +#### 🔧 Chores +- Added `skills-lock.json` to track installed Claude Code skills (`aso`, `mobile-android-design`) +- `.gitignore`: also exclude `CLAUDE.local.md` +- Version bumped: **v4.10.6 (202506345) → v4.11.0 (202506346)** + +**Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.10.6...v4.11.0 + +--- + ### **v4.10.6** [PR [#253](https://github.com/gruntsoftware/android/pull/253)] --- #### 🐛 Crash Fixes diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f52729ee..510df9cc 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -31,8 +31,8 @@ android { applicationId = "ltd.grunt.brainwallet" minSdk = 29 targetSdk = 35 - versionCode = 202506345 - versionName = "v4.10.6" + versionCode = 202506347 + versionName = "v4.11.0" multiDexEnabled = true base.archivesName.set("${defaultConfig.versionName}(${defaultConfig.versionCode})") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/brainwallet/appreview/InAppReviewService.kt b/app/src/main/java/com/brainwallet/appreview/InAppReviewService.kt index dbfe628f..503742be 100644 --- a/app/src/main/java/com/brainwallet/appreview/InAppReviewService.kt +++ b/app/src/main/java/com/brainwallet/appreview/InAppReviewService.kt @@ -20,7 +20,7 @@ class InAppReviewService( public fun showInAppReviewDialogIfNeeded() { val activity = activityProvider() ?: return if (!BRSharedPrefs.isInAppReviewDone(app) && - BRSharedPrefs.getSendTransactionCount(app) > 2 + BRSharedPrefs.getSendTransactionCount(app) > 1 ) { val manager = ReviewManagerFactory.create(app) val request = manager.requestReviewFlow() diff --git a/app/src/main/java/com/brainwallet/di/AppModule.kt b/app/src/main/java/com/brainwallet/di/AppModule.kt index b06bf48c..d9274ac0 100644 --- a/app/src/main/java/com/brainwallet/di/AppModule.kt +++ b/app/src/main/java/com/brainwallet/di/AppModule.kt @@ -1,8 +1,11 @@ package com.brainwallet.di +import android.app.Activity import android.content.Context import android.content.SharedPreferences +import com.brainwallet.BrainwalletApp import com.brainwallet.BuildConfig +import com.brainwallet.appreview.InAppReviewService import com.brainwallet.data.repository.TxRepository import com.brainwallet.data.source.RemoteApiSource import com.brainwallet.tools.sqlite.CurrencyDataSource @@ -45,6 +48,7 @@ object AppModule { single { provideSharedPreferences(context = androidApplication()) } single { TxRepositoryImpl(get()) } single { SyncThreadManager(get(), get()) } + single { InAppReviewService(androidApplication()) { BrainwalletApp.breadContext as? Activity } } } private fun provideSharedPreferences( diff --git a/app/src/main/java/com/brainwallet/gameinterface/GdxGameView.kt b/app/src/main/java/com/brainwallet/gameinterface/GdxGameView.kt index c3114a98..a29b11bb 100644 --- a/app/src/main/java/com/brainwallet/gameinterface/GdxGameView.kt +++ b/app/src/main/java/com/brainwallet/gameinterface/GdxGameView.kt @@ -35,7 +35,7 @@ import org.koin.compose.viewmodel.koinViewModel import timber.log.Timber @Serializable -private data class GameExitData( +internal data class GameExitData( @SerialName("social_network") val socialNetwork: String = "none", val timestamp: Long = 0L, @SerialName("total_score") val totalScore: Int = 0, @@ -102,7 +102,7 @@ private fun removeFragment(fm: FragmentManager, tag: String) { } } -private fun handleGameExit( +internal fun handleGameExit( jsonString: String, bytes: ByteArray?, gameHubViewModel: GameHubViewModel, diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/balancebento/BalanceBentoScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/balancebento/BalanceBentoScreen.kt index dbc05bb8..8537d17e 100644 --- a/app/src/main/java/com/brainwallet/ui/bentosections/balancebento/BalanceBentoScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/bentosections/balancebento/BalanceBentoScreen.kt @@ -32,6 +32,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -51,6 +52,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.LifecycleEventEffect import androidx.lifecycle.viewmodel.compose.viewModel import com.brainwallet.R +import com.brainwallet.appreview.InAppReviewService import com.brainwallet.presenter.entities.TxItem import com.brainwallet.tools.manager.AnalyticsManager import com.brainwallet.ui.screens.main.MainScreenEvent @@ -61,6 +63,9 @@ import com.brainwallet.ui.theme.IBMPlexSans import com.brainwallet.ui.theme.balanceGameBentoSurface import com.brainwallet.ui.theme.blurWhen import kotlinx.collections.immutable.ImmutableList +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel import java.math.BigDecimal @@ -107,8 +112,10 @@ fun BalanceBentoScreen( onDebugStatusUpdate: () -> Unit = {}, onDebugTxAdded: () -> Unit = {}, onDebugBalanceChanged: () -> Unit = {}, + inAppReviewService: InAppReviewService = koinInject(), ) { val context = LocalContext.current + val coroutineScope = rememberCoroutineScope() val infiniteTransition = rememberInfiniteTransition() var previousBalance by remember { mutableStateOf(BigDecimal.ZERO) } val boingAudioPlayer = remember { MediaPlayer.create(context, R.raw.boingspringmouthharp042013) } @@ -183,6 +190,12 @@ fun BalanceBentoScreen( isSwapped = !isSwapped boingAudioPlayer.start() AnalyticsManager.logCustomEventWithParams("did_toggle_fiat_ltc", null) + if (isSwapped) { + coroutineScope.launch { + delay(800L) + inAppReviewService.showInAppReviewDialogIfNeeded() + } + } } ) { // ──────── MY BALANCE LABEL ──────── @@ -255,9 +268,14 @@ fun BalanceBentoScreen( .clickable( interactionSource = remember { MutableInteractionSource() }, ) { - AnalyticsManager.logCustomEventWithParams("did_toggle_balance_visibility", null) - onEvent(BalanceBentoEvent.OnToggleBalanceVisibility) + AnalyticsManager.logCustomEventWithParams("did_toggle_balance_visibility", null) + if (state.balanceHidden) { + coroutineScope.launch { + delay(800L) + inAppReviewService.showInAppReviewDialogIfNeeded() + } + } } .blurWhen(!mainState.isInternetReachable), painter = iconImage, diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt index bd3bab4d..53052134 100644 --- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt +++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color @@ -21,15 +22,21 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.brainwallet.appreview.InAppReviewService import com.brainwallet.ui.composable.CalloutWithPointers import com.brainwallet.ui.composable.Pointer import com.brainwallet.ui.theme.IBMPlexSans +import org.koin.compose.koinInject @Composable fun TutorialSendPage2( darkMode: Boolean, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + inAppReviewService: InAppReviewService = koinInject() ) { + LaunchedEffect(Unit) { + inAppReviewService.showInAppReviewDialogIfNeeded() + } Box( modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt index 560f04d9..0be51438 100644 --- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt +++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color @@ -20,15 +21,22 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.brainwallet.appreview.InAppReviewService import com.brainwallet.ui.composable.CalloutWithPointers import com.brainwallet.ui.composable.Pointer import com.brainwallet.ui.theme.IBMPlexSans +import org.koin.compose.koinInject @Composable fun TutorialWalkthroughPage3( darkMode: Boolean, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + inAppReviewService: InAppReviewService = koinInject() ) { + LaunchedEffect(Unit) { + inAppReviewService.showInAppReviewDialogIfNeeded() + } + Box( modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubViewModel.kt b/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubViewModel.kt index 2da1e95a..2b2d061b 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubViewModel.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubViewModel.kt @@ -7,11 +7,15 @@ import android.graphics.BitmapFactory import android.os.Bundle import android.os.Environment import androidx.core.content.FileProvider +import androidx.lifecycle.viewModelScope +import com.brainwallet.appreview.InAppReviewService import com.brainwallet.tools.manager.AnalyticsManager import com.brainwallet.ui.BrainwalletViewModel +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive @@ -22,6 +26,7 @@ import java.io.FileOutputStream @KoinViewModel class GameHubViewModel( private val app: Application, + private val inAppReviewService: InAppReviewService, ) : BrainwalletViewModel() { private val _state = MutableStateFlow(GameHubState()) @@ -115,6 +120,12 @@ class GameHubViewModel( } ) } + + AnalyticsManager.logCustomEventWithParams("did_play_game", null) + viewModelScope.launch { + delay(800L) + inAppReviewService.showInAppReviewDialogIfNeeded() + } } } } diff --git a/app/src/main/java/com/brainwallet/ui/screens/send/SendViewModel.kt b/app/src/main/java/com/brainwallet/ui/screens/send/SendViewModel.kt index a3dc3275..f5696037 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/send/SendViewModel.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/send/SendViewModel.kt @@ -3,6 +3,7 @@ package com.brainwallet.ui.screens.send import android.app.Application import androidx.lifecycle.viewModelScope import com.brainwallet.R +import com.brainwallet.appreview.InAppReviewService import com.brainwallet.constants.BWConstants import com.brainwallet.data.repository.SettingRepository import com.brainwallet.data.repository.TxRepository @@ -46,6 +47,7 @@ class SendViewModel( private val txRepository: TxRepository, private val settingRepository: SettingRepository, private val currencyDataGetter: CurrencyDataGetter, + private val inAppReviewService: InAppReviewService, private val isWalletCreated: () -> Boolean = { BRWalletManager.getInstance().isCreated() }, private val validateAddress: (String) -> Boolean = { BRWalletManager.getInstance().validateAddress(it) }, private val getBalance: () -> Long = { BRWalletManager.getInstance().getBalance(app) }, @@ -57,7 +59,6 @@ class SendViewModel( val state: StateFlow = _state.asStateFlow() private val _effect = MutableSharedFlow(extraBufferCapacity = 1) val effect: SharedFlow = _effect.asSharedFlow() - init { viewModelScope.launch { settingRepository.currentSettings.collect { currentSettings -> @@ -281,8 +282,10 @@ class SendViewModel( _effect.emit(SendEffect.DismissSheet) AnalyticsManager.logCustomEvent(BWConstants._20191105_DSL) BRSharedPrefs.incrementSendTransactionCount(app) + delay(800L) + inAppReviewService.showInAppReviewDialogIfNeeded() } - is BWSendResult.Error.InsufficientFunds -> { + is Error.InsufficientFunds -> { _state.update { it.copy( errorResultString = String.format( @@ -293,7 +296,7 @@ class SendViewModel( ) } } - is BWSendResult.Error.AmountTooSmall -> { + is Error.AmountTooSmall -> { _state.update { it.copy( errorResultString = String.format( @@ -304,9 +307,9 @@ class SendViewModel( ) } } - BWSendResult.Error.AlreadySending, - BWSendResult.Error.TimedOut, - is BWSendResult.Error.Unknown -> { + Error.AlreadySending, + Error.TimedOut, + is Error.Unknown -> { Timber.e("Send unknown error: $result") _state.update { it.copy( diff --git a/app/src/test/java/com/brainwallet/appreview/InAppReviewServiceTest.kt b/app/src/test/java/com/brainwallet/appreview/InAppReviewServiceTest.kt new file mode 100644 index 00000000..0f0cd15c --- /dev/null +++ b/app/src/test/java/com/brainwallet/appreview/InAppReviewServiceTest.kt @@ -0,0 +1,157 @@ +package com.brainwallet.appreview + +import android.app.Activity +import android.app.Application +import com.brainwallet.constants.BWConstants +import com.brainwallet.tools.manager.AnalyticsManager +import com.brainwallet.tools.manager.BRSharedPrefs +import com.google.android.gms.tasks.OnCompleteListener +import com.google.android.gms.tasks.Task +import com.google.android.play.core.review.ReviewInfo +import com.google.android.play.core.review.ReviewManager +import com.google.android.play.core.review.ReviewManagerFactory +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.unmockkAll +import io.mockk.verify +import org.junit.After +import org.junit.Before +import org.junit.Test +import java.lang.Void + +class InAppReviewServiceTest { + + private lateinit var app: Application + private lateinit var activity: Activity + private lateinit var manager: ReviewManager + private lateinit var reviewInfo: ReviewInfo + private lateinit var requestTask: Task + private lateinit var launchTask: Task + + private fun service(activityResult: Activity? = activity) = + InAppReviewService(app) { activityResult } + + @Before + fun setUp() { + app = mockk(relaxed = true) + activity = mockk(relaxed = true) + manager = mockk() + reviewInfo = mockk() + requestTask = mockk() + launchTask = mockk() + + mockkStatic(ReviewManagerFactory::class) + every { ReviewManagerFactory.create(app) } returns manager + every { manager.requestReviewFlow() } returns requestTask + every { manager.launchReviewFlow(activity, reviewInfo) } returns launchTask + + // Resolve both Play Core tasks synchronously so the flow under test + // completes deterministically, without needing real Play Store services. + every { requestTask.addOnCompleteListener(any()) } answers { + firstArg>().onComplete(requestTask) + requestTask + } + every { launchTask.addOnCompleteListener(any()) } answers { + firstArg>().onComplete(launchTask) + launchTask + } + + mockkStatic(BRSharedPrefs::class) + mockkStatic(AnalyticsManager::class) + every { AnalyticsManager.logCustomEvent(any()) } returns Unit + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun `given no current activity, when showInAppReviewDialogIfNeeded, then does not request a review`() { + every { BRSharedPrefs.isInAppReviewDone(app) } returns false + every { BRSharedPrefs.getSendTransactionCount(app) } returns 5 + + service(activityResult = null).showInAppReviewDialogIfNeeded() + + verify(exactly = 0) { ReviewManagerFactory.create(any()) } + } + + @Test + fun `given review already done, when showInAppReviewDialogIfNeeded, then does not request a review`() { + every { BRSharedPrefs.isInAppReviewDone(app) } returns true + every { BRSharedPrefs.getSendTransactionCount(app) } returns 10 + + service().showInAppReviewDialogIfNeeded() + + verify(exactly = 0) { ReviewManagerFactory.create(any()) } + } + + @Test + fun `given send count at threshold, when showInAppReviewDialogIfNeeded, then does not request a review`() { + every { BRSharedPrefs.isInAppReviewDone(app) } returns false + every { BRSharedPrefs.getSendTransactionCount(app) } returns 1 + + service().showInAppReviewDialogIfNeeded() + + verify(exactly = 0) { ReviewManagerFactory.create(any()) } + } + + @Test + fun `given send count below threshold, when showInAppReviewDialogIfNeeded, then does not request a review`() { + every { BRSharedPrefs.isInAppReviewDone(app) } returns false + every { BRSharedPrefs.getSendTransactionCount(app) } returns 0 + + service().showInAppReviewDialogIfNeeded() + + verify(exactly = 0) { ReviewManagerFactory.create(any()) } + } + + @Test + fun `given eligible user and successful review flow, when showInAppReviewDialogIfNeeded, then marks review done and logs both analytics events`() { + every { BRSharedPrefs.isInAppReviewDone(app) } returns false + every { BRSharedPrefs.getSendTransactionCount(app) } returns 5 + every { requestTask.isSuccessful() } returns true + every { requestTask.getResult() } returns reviewInfo + every { launchTask.isSuccessful() } returns true + every { BRSharedPrefs.inAppReviewDone(app) } returns Unit + + service().showInAppReviewDialogIfNeeded() + + verify { manager.launchReviewFlow(activity, reviewInfo) } + verify { BRSharedPrefs.inAppReviewDone(app) } + verify { AnalyticsManager.logCustomEvent(BWConstants._20241006_DRR) } + verify { AnalyticsManager.logCustomEvent(BWConstants._20241006_UCR) } + } + + @Test + fun `given request review flow fails, when showInAppReviewDialogIfNeeded, then does not launch review flow or mark done`() { + every { BRSharedPrefs.isInAppReviewDone(app) } returns false + every { BRSharedPrefs.getSendTransactionCount(app) } returns 5 + every { requestTask.isSuccessful() } returns false + every { requestTask.getException() } returns Exception("boom") + + service().showInAppReviewDialogIfNeeded() + + verify(exactly = 0) { manager.launchReviewFlow(any(), any()) } + verify(exactly = 0) { BRSharedPrefs.inAppReviewDone(app) } + verify { AnalyticsManager.logCustomEvent(BWConstants._20241006_DRR) } + verify(exactly = 0) { AnalyticsManager.logCustomEvent(BWConstants._20241006_UCR) } + } + + @Test + fun `given launch review flow fails, when showInAppReviewDialogIfNeeded, then does not mark done or log completion event`() { + every { BRSharedPrefs.isInAppReviewDone(app) } returns false + every { BRSharedPrefs.getSendTransactionCount(app) } returns 5 + every { requestTask.isSuccessful() } returns true + every { requestTask.getResult() } returns reviewInfo + every { launchTask.isSuccessful() } returns false + + service().showInAppReviewDialogIfNeeded() + + verify { manager.launchReviewFlow(activity, reviewInfo) } + verify(exactly = 0) { BRSharedPrefs.inAppReviewDone(app) } + verify { AnalyticsManager.logCustomEvent(BWConstants._20241006_DRR) } + verify(exactly = 0) { AnalyticsManager.logCustomEvent(BWConstants._20241006_UCR) } + } +} diff --git a/app/src/test/java/com/brainwallet/tools/crypto/Base58Test.kt b/app/src/test/java/com/brainwallet/tools/crypto/Base58Test.kt new file mode 100644 index 00000000..a98622eb --- /dev/null +++ b/app/src/test/java/com/brainwallet/tools/crypto/Base58Test.kt @@ -0,0 +1,79 @@ +package com.brainwallet.tools.crypto + +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.assertThrows +import org.junit.Test + +class Base58Test { + + @Test + fun `given empty byte array, when encode, then returns empty string`() { + assertEquals("", Base58.encode(ByteArray(0))) + } + + @Test + fun `given empty string, when decode, then returns empty byte array`() { + assertArrayEquals(ByteArray(0), Base58.decode("")) + } + + @Test + fun `given known byte sequence, when encode, then matches known base58 vector`() { + // "Hello World" in bytes is a well known Base58 test vector. + val input = "Hello World".toByteArray(Charsets.UTF_8) + assertEquals("JxF12TrwUP45BMd", Base58.encode(input)) + } + + @Test + fun `given known base58 string, when decode, then matches known byte vector`() { + val decoded = Base58.decode("JxF12TrwUP45BMd") + assertArrayEquals("Hello World".toByteArray(Charsets.UTF_8), decoded) + } + + @Test + fun `given bytes with leading zeroes, when encode then decode, then round trips exactly`() { + val input = byteArrayOf(0, 0, 0, 1, 2, 3, 4, 5) + val encoded = Base58.encode(input) + + // Leading zero bytes are represented as leading '1' characters. + assertEquals('1', encoded[0]) + assertEquals('1', encoded[1]) + assertEquals('1', encoded[2]) + + assertArrayEquals(input, Base58.decode(encoded)) + } + + @Test + fun `given all zero bytes, when encode then decode, then round trips exactly`() { + val input = ByteArray(5) + val encoded = Base58.encode(input) + + assertEquals("11111", encoded) + assertArrayEquals(input, Base58.decode(encoded)) + } + + @Test + fun `given arbitrary byte array, when encode then decode, then round trips exactly`() { + val input = byteArrayOf( + 0x00, + 0x01.toByte(), + 0xFF.toByte(), + 0x7F, + 0x80.toByte(), + 0x10, + 0x2A + ) + val encoded = Base58.encode(input) + val decoded = Base58.decode(encoded) + + assertArrayEquals(input, decoded) + } + + @Test + fun `given string with invalid base58 character, when decode, then throws RuntimeException`() { + // '0', 'O', 'I', 'l' are excluded from the Base58 alphabet. + assertThrows(RuntimeException::class.java) { + Base58.decode("0OIl") + } + } +} diff --git a/app/src/test/java/com/brainwallet/tools/util/BRCompressorTest.kt b/app/src/test/java/com/brainwallet/tools/util/BRCompressorTest.kt new file mode 100644 index 00000000..061ce8c1 --- /dev/null +++ b/app/src/test/java/com/brainwallet/tools/util/BRCompressorTest.kt @@ -0,0 +1,58 @@ +package com.brainwallet.tools.util + +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +class BRCompressorTest { + + @Test + fun `given data, when gZipCompress then gZipExtract, then round trips exactly`() { + val data = "The quick brown fox jumps over the lazy dog".repeat(20).toByteArray(Charsets.UTF_8) + + val compressed = BRCompressor.gZipCompress(data) + val extracted = BRCompressor.gZipExtract(compressed) + + assertArrayEquals(data, extracted) + } + + @Test + fun `given null data, when gZipCompress, then returns null`() { + assertNull(BRCompressor.gZipCompress(null)) + } + + @Test + fun `given null or empty compressed data, when gZipExtract, then returns null`() { + assertNull(BRCompressor.gZipExtract(null)) + assertNull(BRCompressor.gZipExtract(ByteArray(0))) + } + + @Test + fun `given data, when bz2Compress then bz2Extract, then round trips exactly`() { + val data = "The quick brown fox jumps over the lazy dog".repeat(20).toByteArray(Charsets.UTF_8) + + val compressed = BRCompressor.bz2Compress(data) + val extracted = BRCompressor.bz2Extract(compressed) + + assertArrayEquals(data, extracted) + } + + @Test + fun `given null or empty compressed data, when bz2Extract, then returns null`() { + assertNull(BRCompressor.bz2Extract(null)) + assertNull(BRCompressor.bz2Extract(ByteArray(0))) + } + + @Test + fun `given gzip compressed bytes, when isGZIPStream, then returns true`() { + val compressed = BRCompressor.gZipCompress("payload".toByteArray(Charsets.UTF_8)) + assertTrue(BRCompressor.isGZIPStream(compressed!!)) + } + + @Test + fun `given non gzip bytes, when isGZIPStream, then returns false`() { + assertFalse(BRCompressor.isGZIPStream(byteArrayOf(0x01, 0x02))) + } +} diff --git a/app/src/test/java/com/brainwallet/tools/util/BRDateUtilTest.kt b/app/src/test/java/com/brainwallet/tools/util/BRDateUtilTest.kt new file mode 100644 index 00000000..250acda4 --- /dev/null +++ b/app/src/test/java/com/brainwallet/tools/util/BRDateUtilTest.kt @@ -0,0 +1,59 @@ +package com.brainwallet.tools.util + +import org.junit.Assert.assertEquals +import org.junit.Test +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +class BRDateUtilTest { + + private fun minutesAgo(minutes: Long): Date = Date(System.currentTimeMillis() - minutes * 60 * 1000) + + private fun hoursAgo(hours: Long): Date = Date(System.currentTimeMillis() - hours * 60 * 60 * 1000) + + private fun daysAgo(days: Long): Date = Date(System.currentTimeMillis() - days * 24 * 60 * 60 * 1000) + + @Test + fun `given date under a minute ago, then formats as zero minutes`() { + assertEquals("0 m", BRDateUtil.getCustomSpan(Date())) + } + + @Test + fun `given date several minutes ago, then formats in minutes`() { + assertEquals("15 m", BRDateUtil.getCustomSpan(minutesAgo(15))) + } + + @Test + fun `given date just under an hour ago, then still formats in minutes`() { + assertEquals("59 m", BRDateUtil.getCustomSpan(minutesAgo(59))) + } + + @Test + fun `given date exactly one hour ago, then formats in hours`() { + assertEquals("1 h", BRDateUtil.getCustomSpan(hoursAgo(1))) + } + + @Test + fun `given date just under a day ago, then still formats in hours`() { + assertEquals("23 h", BRDateUtil.getCustomSpan(hoursAgo(23))) + } + + @Test + fun `given date exactly one day ago, then formats in days`() { + assertEquals("1 d", BRDateUtil.getCustomSpan(daysAgo(1))) + } + + @Test + fun `given date just under a week ago, then still formats in days`() { + assertEquals("6 d", BRDateUtil.getCustomSpan(daysAgo(6))) + } + + @Test + fun `given date a week or more ago, then formats as month and day`() { + val date = daysAgo(7) + val expected = SimpleDateFormat("MMM dd", Locale.getDefault()).format(date) + + assertEquals(expected, BRDateUtil.getCustomSpan(date)) + } +} diff --git a/app/src/test/java/com/brainwallet/tools/util/BytesUtilTest.kt b/app/src/test/java/com/brainwallet/tools/util/BytesUtilTest.kt new file mode 100644 index 00000000..1d2cdf79 --- /dev/null +++ b/app/src/test/java/com/brainwallet/tools/util/BytesUtilTest.kt @@ -0,0 +1,59 @@ +package com.brainwallet.tools.util + +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Test +import java.io.ByteArrayInputStream +import java.io.IOException +import java.io.InputStream + +class BytesUtilTest { + + @Test + fun `given empty stream, when readBytesFromStream, then returns empty byte array`() { + val result = BytesUtil.readBytesFromStream(ByteArrayInputStream(ByteArray(0))) + assertArrayEquals(ByteArray(0), result) + } + + @Test + fun `given small stream, when readBytesFromStream, then returns all bytes`() { + val data = "hello world".toByteArray(Charsets.UTF_8) + val result = BytesUtil.readBytesFromStream(ByteArrayInputStream(data)) + assertArrayEquals(data, result) + } + + @Test + fun `given stream larger than internal buffer, when readBytesFromStream, then returns all bytes`() { + // Internal buffer is 1024 bytes, so exercise multiple read iterations. + val data = ByteArray(1024 * 3 + 17) { (it % 256).toByte() } + val result = BytesUtil.readBytesFromStream(ByteArrayInputStream(data)) + assertArrayEquals(data, result) + } + + @Test + fun `given stream that throws IOException, when readBytesFromStream, then returns bytes read so far without throwing`() { + val failingStream = + object : InputStream() { + private var callCount = 0 + + override fun read(): Int = throw UnsupportedOperationException("not used") + + override fun read( + b: ByteArray, + off: Int, + len: Int, + ): Int { + callCount++ + if (callCount == 1) { + b[off] = 42 + return 1 + } + throw IOException("boom") + } + } + + val result = BytesUtil.readBytesFromStream(failingStream) + assertEquals(1, result.size) + assertEquals(42.toByte(), result[0]) + } +} diff --git a/app/src/test/java/com/brainwallet/tools/util/TypesConverterTest.kt b/app/src/test/java/com/brainwallet/tools/util/TypesConverterTest.kt new file mode 100644 index 00000000..a452fdb3 --- /dev/null +++ b/app/src/test/java/com/brainwallet/tools/util/TypesConverterTest.kt @@ -0,0 +1,68 @@ +package com.brainwallet.tools.util + +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Test + +class TypesConverterTest { + + @Test + fun `given positive int, when intToBytes then bytesToInt, then round trips exactly`() { + val value = 123456789 + assertEquals(value, TypesConverter.bytesToInt(TypesConverter.intToBytes(value))) + } + + @Test + fun `given negative int, when intToBytes then bytesToInt, then round trips exactly`() { + val value = -42 + assertEquals(value, TypesConverter.bytesToInt(TypesConverter.intToBytes(value))) + } + + @Test + fun `given zero int, when intToBytes, then returns four zero bytes`() { + assertArrayEquals(byteArrayOf(0, 0, 0, 0), TypesConverter.intToBytes(0)) + } + + @Test + fun `given positive long, when long2byteArray then byteArray2long, then round trips exactly`() { + val value = 9876543210123L + assertEquals(value, TypesConverter.byteArray2long(TypesConverter.long2byteArray(value))) + } + + @Test + fun `given negative long, when long2byteArray then byteArray2long, then round trips exactly`() { + val value = -1L + assertEquals(value, TypesConverter.byteArray2long(TypesConverter.long2byteArray(value))) + } + + @Test + fun `given char array, when toBytes then toChars, then values match as unsigned bytes`() { + val chars = charArrayOf('a', 'B', 'z', '1') + val bytes = TypesConverter.toBytes(chars) + val roundTripped = TypesConverter.toChars(bytes) + + assertArrayEquals(chars, roundTripped) + } + + @Test + fun `given mixed case char array, when lowerCaseCharArray, then all chars are lower case`() { + val chars = charArrayOf('A', 'b', 'C', '1', 'D') + assertArrayEquals(charArrayOf('a', 'b', 'c', '1', 'd'), TypesConverter.lowerCaseCharArray(chars)) + } + + @Test + fun `given char array, when charsToBytes, then matches UTF-8 encoded bytes`() { + val chars = "hello".toCharArray() + assertArrayEquals("hello".toByteArray(Charsets.UTF_8), TypesConverter.charsToBytes(chars)) + } + + @Test + fun `given seed bytes, when getNullTerminatedPhrase, then appends zero byte and zeroes original`() { + val rawSeed = byteArrayOf(1, 2, 3, 4) + val result = TypesConverter.getNullTerminatedPhrase(rawSeed) + + assertArrayEquals(byteArrayOf(1, 2, 3, 4, 0), result) + // The original array must be wiped for security once copied. + assertArrayEquals(byteArrayOf(0, 0, 0, 0), rawSeed) + } +} diff --git a/app/src/test/java/com/brainwallet/ui/screens/send/SendViewModelTest.kt b/app/src/test/java/com/brainwallet/ui/screens/send/SendViewModelTest.kt index eb16f87a..d010ad46 100644 --- a/app/src/test/java/com/brainwallet/ui/screens/send/SendViewModelTest.kt +++ b/app/src/test/java/com/brainwallet/ui/screens/send/SendViewModelTest.kt @@ -1,6 +1,7 @@ package com.brainwallet.ui.screens.send import android.app.Application +import com.brainwallet.appreview.InAppReviewService import com.brainwallet.data.model.AppSetting import com.brainwallet.data.model.CurrencyEntity import com.brainwallet.data.repository.SettingRepository @@ -44,6 +45,7 @@ class SendViewModelTest { private lateinit var txRepository: TxRepository private lateinit var settingRepository: SettingRepository private lateinit var currencyDataGetter: CurrencyDataGetter + private lateinit var inAppReviewService: InAppReviewService private val usdCurrency = CurrencyEntity("USD", "US Dollar", 100f, "$") @@ -67,7 +69,8 @@ class SendViewModelTest { getBalance = getBalance, getCurrentFee = getCurrentFee, getOpsFee = getOpsFee, - currencyDataGetter = currencyDataGetter + currencyDataGetter = currencyDataGetter, + inAppReviewService = inAppReviewService ).also { advanceUntilIdle() } @Before @@ -88,6 +91,7 @@ class SendViewModelTest { currencyDataGetter = mockk { every { getCurrencyByIso("USD") } returns usdCurrency } + inAppReviewService = mockk(relaxed = true) mockkStatic(BRKeyStore::class) every { BRKeyStore.getPinCode(any()) } returns "1234" diff --git a/app/src/test/kotlin/com/brainwallet/gameinterface/GameKoinModuleTest.kt b/app/src/test/kotlin/com/brainwallet/gameinterface/GameKoinModuleTest.kt new file mode 100644 index 00000000..498d1ed2 --- /dev/null +++ b/app/src/test/kotlin/com/brainwallet/gameinterface/GameKoinModuleTest.kt @@ -0,0 +1,30 @@ +package com.brainwallet.gameinterface + +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertSame +import org.junit.Assert.assertTrue +import org.junit.Test +import org.koin.dsl.koinApplication + +class GameKoinModuleTest { + + @Test + fun `gameModule provides a GameSlot instance`() { + val koin = koinApplication { modules(gameModule) }.koin + + val gameSlot = koin.get() + + assertNotNull(gameSlot) + assertTrue(gameSlot is GdxGameSlot) + } + + @Test + fun `gameModule provides GameSlot as a singleton`() { + val koin = koinApplication { modules(gameModule) }.koin + + val first = koin.get() + val second = koin.get() + + assertSame(first, second) + } +} diff --git a/app/src/test/kotlin/com/brainwallet/gameinterface/GdxGameViewTest.kt b/app/src/test/kotlin/com/brainwallet/gameinterface/GdxGameViewTest.kt new file mode 100644 index 00000000..f891594d --- /dev/null +++ b/app/src/test/kotlin/com/brainwallet/gameinterface/GdxGameViewTest.kt @@ -0,0 +1,144 @@ +package com.brainwallet.gameinterface + +import com.brainwallet.ui.screens.gamehub.GameHubEvent +import com.brainwallet.ui.screens.gamehub.GameHubViewModel +import io.mockk.mockk +import io.mockk.slot +import io.mockk.verify +import kotlinx.serialization.json.Json +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Test + +class GdxGameViewTest { + + private val lenientJson = Json { ignoreUnknownKeys = true } + + // ── GameExitData parsing ────────────────────────────────────────────── + + @Test + fun `given full json payload, when decoding GameExitData, then all fields are populated`() { + val json = """ + { + "social_network": "twitter", + "timestamp": 1700000000, + "total_score": 120, + "bonus_amount": 20, + "score_a": 40, + "score_b": 40, + "score_c": 40 + } + """.trimIndent() + + val result = lenientJson.decodeFromString(json) + + assertEquals("twitter", result.socialNetwork) + assertEquals(1700000000L, result.timestamp) + assertEquals(120, result.totalScore) + assertEquals(20, result.bonusAmount) + assertEquals(40, result.scoreA) + assertEquals(40, result.scoreB) + assertEquals(40, result.scoreC) + } + + @Test + fun `given json missing fields, when decoding GameExitData, then defaults are used`() { + val result = lenientJson.decodeFromString("{}") + + assertEquals("none", result.socialNetwork) + assertEquals(0L, result.timestamp) + assertEquals(0, result.totalScore) + assertEquals(0, result.bonusAmount) + } + + @Test + fun `given json with unknown keys, when decoding GameExitData, then unknown keys are ignored`() { + val json = """{"social_network":"instagram","some_future_field":"unused"}""" + + val result = lenientJson.decodeFromString(json) + + assertEquals("instagram", result.socialNetwork) + } + + // ── handleGameExit dispatch logic ───────────────────────────────────── + + @Test + fun `given twitter exit with screenshot, when handleGameExit, then dispatches OnGameExited with the screenshot`() { + val gameHubViewModel = mockk(relaxed = true) + val screenshot = byteArrayOf(1, 2, 3, 4) + val json = """{"social_network":"twitter","total_score":100}""" + + handleGameExit(json, screenshot, gameHubViewModel) + + val slot = slot() + verify(exactly = 1) { gameHubViewModel.onEvent(capture(slot)) } + + val captured = slot.captured as GameHubEvent.OnGameExited + assertEquals(json, captured.jsonPayload) + assertArrayEquals(screenshot, captured.byteArray) + } + + @Test + fun `given instagram exit with screenshot, when handleGameExit, then dispatches OnGameExited with the screenshot`() { + val gameHubViewModel = mockk(relaxed = true) + val screenshot = byteArrayOf(5, 6, 7) + val json = """{"social_network":"instagram"}""" + + handleGameExit(json, screenshot, gameHubViewModel) + + val slot = slot() + verify(exactly = 1) { gameHubViewModel.onEvent(capture(slot)) } + + val captured = slot.captured as GameHubEvent.OnGameExited + assertArrayEquals(screenshot, captured.byteArray) + } + + @Test + fun `given twitter exit with null screenshot, when handleGameExit, then does not dispatch an event`() { + val gameHubViewModel = mockk(relaxed = true) + val json = """{"social_network":"twitter"}""" + + handleGameExit(json, null, gameHubViewModel) + + verify(exactly = 0) { gameHubViewModel.onEvent(any()) } + } + + @Test + fun `given twitter exit with empty screenshot, when handleGameExit, then does not dispatch an event`() { + val gameHubViewModel = mockk(relaxed = true) + val json = """{"social_network":"twitter"}""" + + handleGameExit(json, ByteArray(0), gameHubViewModel) + + verify(exactly = 0) { gameHubViewModel.onEvent(any()) } + } + + @Test + fun `given exit with no social network, when handleGameExit, then does not dispatch an event`() { + val gameHubViewModel = mockk(relaxed = true) + val json = """{"total_score":50}""" + + handleGameExit(json, byteArrayOf(1), gameHubViewModel) + + verify(exactly = 0) { gameHubViewModel.onEvent(any()) } + } + + @Test + fun `given exit with unrecognised social network, when handleGameExit, then does not dispatch an event`() { + val gameHubViewModel = mockk(relaxed = true) + val json = """{"social_network":"facebook"}""" + + handleGameExit(json, byteArrayOf(1), gameHubViewModel) + + verify(exactly = 0) { gameHubViewModel.onEvent(any()) } + } + + @Test + fun `given malformed json, when handleGameExit, then does not throw and does not dispatch an event`() { + val gameHubViewModel = mockk(relaxed = true) + + handleGameExit("not valid json", byteArrayOf(1), gameHubViewModel) + + verify(exactly = 0) { gameHubViewModel.onEvent(any()) } + } +} diff --git a/bw-gdlib b/bw-gdlib index 5c2faab0..db543da2 160000 --- a/bw-gdlib +++ b/bw-gdlib @@ -1 +1 @@ -Subproject commit 5c2faab03cd27183ecbc1a2268fac7006e712340 +Subproject commit db543da26e36ce1955fa7c596fe8b85099afe629 diff --git a/skills-lock.json b/skills-lock.json new file mode 100644 index 00000000..a9fcfaa7 --- /dev/null +++ b/skills-lock.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "skills": { + "aso": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "skillPath": "skills/aso/SKILL.md", + "computedHash": "f84a1fb5cb1a8a7f7171bd60ae6850f24a82fa6af94bd5f12e5b3e9227480a34" + }, + "mobile-android-design": { + "source": "wshobson/agents", + "sourceType": "github", + "skillPath": "plugins/ui-design/skills/mobile-android-design/SKILL.md", + "computedHash": "bcb274bcc4e0ad076b5947f90e5a247f370ed4da1274b2b7347dc293ee396309" + } + } +} From 2dfb6b6bb503c87caf25d2ce525aaeb415f013ac Mon Sep 17 00:00:00 2001 From: grunt-claude-bot Date: Sat, 8 Aug 2026 13:15:25 +0100 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=9A=80=20[Release=20v4.12.0]=20(#270)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 * 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 * 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 * 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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) --------- Co-authored-by: Kerry Washington Co-authored-by: andhikayuana Co-authored-by: Joseph Sanjaya * fix(#226): android test failure on RecoverWalletScreenGrabsTest (#130) Move SCREENGRAB_PAPERKEY build config to debug build type The `SCREENGRAB_PAPERKEY` build configuration field, used for screengrab tests, was previously defined in both the `debug` and `screengrab` build types. This commit moves the definition solely to the `debug` build type, as the `screengrab` build type inherits from `debug` and thus already has access to this field. Additionally, unused imports were removed from `BrainwalletScreengrabApp.kt`. * fix(#223): fix issue on test environment SLF4J + agent warnings in test env (#129) - Added `slf4j-android` as a test dependency to provide a proper SLF4J binding and avoid "StaticLoggerBinder" warnings. - Configured JVM args for Gradle test tasks to enable dynamic agent loading, suppressing Byte Buddy agent warnings during test runs. * feat(#225): Send sync duration in Firebase Analytics as a custom event and in Settings row (#131) * feat(#225): Send sync duration in Firebase Analytics as a custom event and in Settings row This commit introduces analytics tracking for the sync process. It includes: - `TimeProvider`: A utility class for getting the current time, allowing for easier testing. - `AnalyticsSource`: An interface for logging analytics events. - `FirebaseAnalyticsSource`: An implementation of `AnalyticsSource` that uses Firebase Analytics. - `SyncAnalyticsRepository`: A repository to manage and persist sync-related analytics data, and log events. - `startSync()`: Records the start time of a sync. - `stopSync()`: Records the stop time of a sync and accumulates the duration if the sync is paused/resumed. - `completeSync()`: Persists the total sync duration, end timestamp, and a unique ID. It then logs a "user_did_complete_sync" event with these details and the current block height. - `getLastSyncMetadata()`: Retrieves the metadata of the last completed sync. - Unit tests for the new classes. - Integration of `SyncAnalyticsRepository` into `SyncManager` to call the respective methods at the start, stop, and completion of the sync process. - `FakeSharedPreferences`: A testing utility for mocking SharedPreferences. * chore(#225): Move SyncMetadata formatting to Formatter class This commit introduces a `Formatter` class within `SyncAnalyticsRepository.SyncMetadata` to handle the formatting of sync metadata. The `getFormatted()` method has been removed from `SyncAnalyticsRepository.SyncMetadata` and its logic is now encapsulated in the `SyncMetadata.Formatter.format()` method. This change improves the separation of concerns and makes the formatting logic more testable. The `HomeSettingDrawerSheet` has been updated to use the new `Formatter` class. Unit tests have been added to `SyncAnalyticsRepositoryTest` to verify the correctness of the `SyncMetadata.Formatter`. * feat(#234): Implement language-specific Firebase messaging topics (#132) This commit introduces the ability to subscribe and unsubscribe from Firebase messaging topics based on the user's selected language. Key changes: - Added `MessagingTopicDataSource` to fetch topic configurations from a JSON file. - Added `MessagingTopicRepository` to manage topic data. - Added `MessagingTopicUseCase` to handle subscription logic. - Added `LanguageSwitcherUseCase` to orchestrate language switching and topic subscription updates. - Integrated topic subscription updates into `SettingsViewModel` and `ChangeLanguageBottomSheet`. - Added a `topics.json` asset file containing the topic definitions. - Included unit tests for the new data source, repository, and use cases. - Initialized messaging topics on app startup in `BrainwalletApp`. * bump code * chore(#234): normalize Indonesian language code to "id" (#133) The Indonesian language code "in" is normalized to "id" in `MessagingTopicDataSource` to align with the ISO 639-1 standard used by the backend. This ensures consistency in topic generation for Indonesian language users. Tests have been added to verify this normalization for both "in" and "in_ID" inputs. * Feat: Detekt and Test Plugins, (Including Create Detekt Baseline) (#136) * feat: integrate build logic submodule Integrates the `gruntsoftware-build-logic` Git submodule into the project. This change includes: - Adding the submodule to `.gitmodules`. - Including the build logic in `settings.gradle.kts`. - Applying build logic plugins (`test` and `detekt`) in `app/build.gradle.kts`. * chore(detekt): apply baseline rules * chore: Remove ktlint from project This commit removes the ktlint configuration and associated tasks from the `app/build.gradle.kts` file. It also removes the `pinterest-ktlint` dependency from the `gradle/libs.versions.toml` file. * Chore/renamed gp module (#140) * Fixed the Git Submodule references * updated gitmodules config * create private gp submodule * Update settings.gradle.kts * chore: Migrate build logic to version catalog and update submodules This commit migrates the project's build logic to use a centralized version catalog (`grunt`) and updates submodule references. Specific changes include: * **Submodule Updates:** * Updated `gruntsoftware-build-logic` submodule pointer. * Updated `modules/private-general-purpose` submodule pointer. * **Build Configuration (`settings.gradle.kts`):** * Removed the conditional loading of the `games` version catalog. * Added a `grunt` version catalog loaded from `gruntsoftware-build-logic/gradle/libs.versions.toml`. * Changed the included module from `:modules:private-general-purpose:content` to `:modules:private-general-purpose:games`. * Removed conditional inclusion logic for `:modules:private-general-purpose:content`. * **Root `build.gradle.kts`:** * Updated plugin aliases from `libs.plugins.android.*` to `grunt.plugins.android.*`. * **App `build.gradle.kts`:** * Updated plugin alias for `com.android.application` from `libs` to `grunt`. * Updated the `games` module dependency to `implementation(project(":modules:private-general-purpose:games"))` and removed the conditional logic for `findProject(":modules:games:content")`. * Updated various dependencies to use the `grunt` version catalog (e.g., `grunt.androidx.core.ktx`, `grunt.androidx.compose.bom`, `grunt.bundles.androidx.compose`, `grunt.material`). * **Version Catalog (`gradle/libs.versions.toml`):** * Removed versions for `agp` and `androidx-core-ktx`. * Removed versions for `androidx-compose-bom`, `androidx-activity-compose`, and `androidx-fragment-compose`. * Removed `androidx-core` library alias. * Removed various `androidx-compose` library aliases and the `androidx-compose` bundle. * Removed `android-application` and `android-library` plugin aliases. * ci: Configure GitHub token for submodules in CircleCI This commit updates the CircleCI configuration to include a step that configures a GitHub token. This token will be used for authenticating access to submodules during the build process. * refactor: Update module paths for 'games' This commit refactors the project structure by moving the 'games' module. - The 'games' module path in `settings.gradle.kts` is changed from `:modules:private-general-purpose:games` to `:games` and its `projectDir` is set to `modules/private-general-purpose/games`. - The dependency path in `app/build.gradle.kts` for the 'games' module is updated from `project(":modules:private-general-purpose:games")` to `project(":games")`. The submodule references for `gruntsoftware-build-logic` and `modules/private-general-purpose` were also updated. --------- Co-authored-by: Joseph Sanjaya * create private gp submodule * Update settings.gradle.kts * chore: Migrate build logic to version catalog and update submodules This commit migrates the project's build logic to use a centralized version catalog (`grunt`) and updates submodule references. Specific changes include: * **Submodule Updates:** * Updated `gruntsoftware-build-logic` submodule pointer. * Updated `modules/private-general-purpose` submodule pointer. * **Build Configuration (`settings.gradle.kts`):** * Removed the conditional loading of the `games` version catalog. * Added a `grunt` version catalog loaded from `gruntsoftware-build-logic/gradle/libs.versions.toml`. * Changed the included module from `:modules:private-general-purpose:content` to `:modules:private-general-purpose:games`. * Removed conditional inclusion logic for `:modules:private-general-purpose:content`. * **Root `build.gradle.kts`:** * Updated plugin aliases from `libs.plugins.android.*` to `grunt.plugins.android.*`. * **App `build.gradle.kts`:** * Updated plugin alias for `com.android.application` from `libs` to `grunt`. * Updated the `games` module dependency to `implementation(project(":modules:private-general-purpose:games"))` and removed the conditional logic for `findProject(":modules:games:content")`. * Updated various dependencies to use the `grunt` version catalog (e.g., `grunt.androidx.core.ktx`, `grunt.androidx.compose.bom`, `grunt.bundles.androidx.compose`, `grunt.material`). * **Version Catalog (`gradle/libs.versions.toml`):** * Removed versions for `agp` and `androidx-core-ktx`. * Removed versions for `androidx-compose-bom`, `androidx-activity-compose`, and `androidx-fragment-compose`. * Removed `androidx-core` library alias. * Removed various `androidx-compose` library aliases and the `androidx-compose` bundle. * Removed `android-application` and `android-library` plugin aliases. * feat(deps): add kotlin-immutable dependency This commit adds the `kotlinx-collections-immutable` library, version 0.4.0, to the project's dependencies. * refactor(app): Relocate core module imports Updates the import paths for the core presentation module from `ltd.grunt.brainwallet.core.presentation` to `com.grunt.brainwallet.core.presentation`. This refactoring touches multiple UI components and initializers across the `app` module to align with the new package structure. Additionally, this commit corrects a typo in `SeedWordItem.kt`, changing the error color variable from `chilli` to `chili` to match the theme definition. Finally, the submodule pointer for `private-general-purpose` is updated. * build bump * removed cruft * chore(submodules): remove bugged games repository * bump code * Release/v4.8.0 (#147) * 🚀[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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * 🚀[Release v4.7.2] Merge into Main (#128) * 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 * 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 * 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 * 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. * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana Co-authored-by: Joseph Sanjaya * Release/v4.7.2 202506296 (#134) * 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 conn… * bug(crashlytics): Remove InputWordsActivity from AndroidManifest * fix(crashlytics): resolve ReEnterPinActivity crashes and deprecation warnings (#148) * fix: resolve ReEnterPinActivity crashes and deprecation warnings - Add missing VIBRATE permission to prevent SecurityException crashes - Fix API compatibility issues with activity transitions (API 29+ support) - Remove unnecessary SDK version checks for vibration (min SDK is 29) refactor: modernize ReEnterPinActivity navigation handling - Replace deprecated onBackPressed with OnBackPressedDispatcher - Update activity transitions to use modern overrideActivityTransition (API 34+) with fallback - Update SetPinActivity to use new ReEnterPinActivity.createIntent() method - Remove legacy Java ReEnterPinActivity and update AndroidManifest references - Clean up BreadActivity references to removed legacy activity * Refactor: Remove legacy PIN activities and layouts This commit removes the legacy PIN management activities (`SetPinActivity`, `ReEnterPinActivity`, `UpdatePinActivity`) and their associated layouts and tests. The functionality for setting, re-entering, and updating the PIN has been consolidated and moved into a modern, composable architecture. Specific changes include: - Deletion of `SetPinActivity`, `UpdatePinActivity`, and their XML layout `activity_pin_template.xml`. - Deletion of the Kotlin-based `ReEnterPinActivity` and its associated MVI components (Intent, State, SideEffect, ViewModel) and unit tests. - Removal of references to these deleted activities from `AndroidManifest.xml` and other parts of the codebase like `PromptManager` and `SecurityCenterActivity`. - Update of `tools:context` attributes in several XML layouts that were incorrectly pointing to `SetPinActivity`. - `PromptManager` and `SecurityCenterActivity` are updated to navigate to the new `BrainwalletActivity` with an `UnLock` route for PIN-related actions. - Cleaned up related code in `BreadActivity` and `ActivityUTILS`. * Remove resizability and orientation restrictions in our app (#146) * Remove resizability and orientation restrictions in our apps to support large screen devices * Remove resizability and orientation restrictions in bread activity * Lock the unlockscreen composable to potrait * build: Build secp256k1 as a static library and add ABI splits (#149) This commit refactors the native build process and enhances library loading. Key changes: - `CMakeLists.txt` is updated to build `secp256k1` as a separate static library. This modularizes the build and allows for specific optimization flags. - Architecture-specific optimizations (`-O3 -ffast-math`) are now applied to both `core-lib` and `secp256k1` for the `arm64-v8a` ABI. - In `build.gradle.kts`, ABI splitting is enabled to create smaller, architecture-specific APKs. - `BRActivity.java` is updated with improved error handling for native library loading. It now includes more detailed logging and a fallback mechanism to load the library from an explicit path if the standard `System.loadLibrary` call fails. * version bump (#159) Reviewing the code for a update * Revert "build: Build secp256k1 as a static library and add ABI splits (#149)" This reverts commit 2f06f5cbd6369e8112111edfb6078a43ad58d19b. * Techdebt/adjust build logic (#161) * Renaming the build logic repo * rename the location of the build logic * reset the path * updated the build logic and private gp * updated the private gp * Paired with @kcw-grunt, @josikie to verify the android build logic and private repo. --------- Co-authored-by: josikie * Added auto translate (#178) * Add auto-translate workflow for strings.xml This workflow automatically translates missing strings in strings.xml files when changes are pushed to specific branches or manually triggered. It checks for changes, creates a new branch for translations, commits the updates, and opens a pull request if there are any changes. * Added auto translate files per push * Polished files * fixed typo * nit * Add auto-translate workflow for strings.xml This workflow automates the translation of strings.xml files on push to specific branches and allows manual triggering. It checks for changes and creates a pull request if translations are updated. * Create PR summary workflow with GitHub Copilot Add GitHub Actions workflow for PR summary generation using Copilot * Changed the AI completions * Add more information of the README * nit fix * 🦖😱 HUGE!! Bento Integration (#192) * Update Bento with Latest Develop (#144) * create private gp submodule * Update settings.gradle.kts * chore: Migrate build logic to version catalog and update submodules This commit migrates the project's build logic to use a centralized version catalog (`grunt`) and updates submodule references. Specific changes include: * **Submodule Updates:** * Updated `gruntsoftware-build-logic` submodule pointer. * Updated `modules/private-general-purpose` submodule pointer. * **Build Configuration (`settings.gradle.kts`):** * Removed the conditional loading of the `games` version catalog. * Added a `grunt` version catalog loaded from `gruntsoftware-build-logic/gradle/libs.versions.toml`. * Changed the included module from `:modules:private-general-purpose:content` to `:modules:private-general-purpose:games`. * Removed conditional inclusion logic for `:modules:private-general-purpose:content`. * **Root `build.gradle.kts`:** * Updated plugin aliases from `libs.plugins.android.*` to `grunt.plugins.android.*`. * **App `build.gradle.kts`:** * Updated plugin alias for `com.android.application` from `libs` to `grunt`. * Updated the `games` module dependency to `implementation(project(":modules:private-general-purpose:games"))` and removed the conditional logic for `findProject(":modules:games:content")`. * Updated various dependencies to use the `grunt` version catalog (e.g., `grunt.androidx.core.ktx`, `grunt.androidx.compose.bom`, `grunt.bundles.androidx.compose`, `grunt.material`). * **Version Catalog (`gradle/libs.versions.toml`):** * Removed versions for `agp` and `androidx-core-ktx`. * Removed versions for `androidx-compose-bom`, `androidx-activity-compose`, and `androidx-fragment-compose`. * Removed `androidx-core` library alias. * Removed various `androidx-compose` library aliases and the `androidx-compose` bundle. * Removed `android-application` and `android-library` plugin aliases. * feat(deps): add kotlin-immutable dependency This commit adds the `kotlinx-collections-immutable` library, version 0.4.0, to the project's dependencies. * refactor(app): Relocate core module imports Updates the import paths for the core presentation module from `ltd.grunt.brainwallet.core.presentation` to `com.grunt.brainwallet.core.presentation`. This refactoring touches multiple UI components and initializers across the `app` module to align with the new package structure. Additionally, this commit corrects a typo in `SeedWordItem.kt`, changing the error color variable from `chilli` to `chili` to match the theme definition. Finally, the submodule pointer for `private-general-purpose` is updated. --------- Co-authored-by: Kerry Washington * feat(bento): Scaffold Bento module with main screen (#143) This commit introduces the new `bento` Android libs module. It scaffolds the main screen (`BentoMainScreen`) which features a bento-style grid layout, a top action bar, a bottom navigation bar, and a modal navigation drawer with a custom rail. Key additions include: - `BentoActivity` as the main entry point. - Composable components for the main screen, rail, and various widgets. - Initial Gradle setup with necessary dependencies. - Android Manifest, resources, and vector drawables for the UI. - Inclusion of the `:bento` module in `settings.gradle.kts`. * Moderately moved to the old file system (#162) * Task: Added Basic layout functionality (#163) * Adjusted the padding to show the status bar at the top Compiling and added MVVM Classes Adding ComponentActivity instead of AppCompat connecting the Tab Actions Debugging the modals for the tab bar Successfully wired in tab actions * version bump * Task/add gamehub bento section (#164) * Adjusted the padding to show the status bar at the top Compiling and added MVVM Classes Adding ComponentActivity instead of AppCompat connecting the Tab Actions Debugging the modals for the tab bar Successfully wired in tab actions * Added the background and text * WIP: Resetting the bento ratios and the GameHub bento layout * Added ibm plex sans Polished the bottom nav bar * WIP: Layout of the MainScreen is 75% is there but it doesnt work 100% Working in the alts * Further discovery of the Settings data * version bump * version bump Resetting the bento ratios and the GameHub bento layout Added ibm plex sans Polished the bottom nav bar Further discovery of the Settings data * Fix/show unlock after ready restore (#167) * Version bump * Updated the modules and fixed some warnings Set the sdks Updated the submodules prior to the android-build-modules remove old android build logic * Updated the BRKeystore with a new putMasterPubKey method * Added more bulletproofing of the store pubkey Reset the secp256k1 commit: b408c6a This version is entirely sensitive of the lib because the Bitcoin devs decided it was not necessary flag. We still use it * RC: Verified the NEW_WALLET PATH now works The Ready path works. Added a FB if failing * Minor polish to the InputWords layout * Removed the commented out BRKeyStoreTest * Clean issue in remove tests * Added working BRKeyStore tests * Removed example test(s) * version bump * Rename Test stage * Feat/ltc picker bento with working onboarding (#168) * Version bump * Updated the modules and fixed some warnings Set the sdks Updated the submodules prior to the android-build-modules remove old android build logic * Updated the BRKeystore with a new putMasterPubKey method * Added more bulletproofing of the store pubkey Reset the secp256k1 commit: b408c6a This version is entirely sensitive of the lib because the Bitcoin devs decided it was not necessary flag. We still use it * RC: Verified the NEW_WALLET PATH now works The Ready path works. Added a FB if failing * Minor polish to the InputWords layout * Removed the commented out BRKeyStoreTest * Clean issue in remove tests * Added working BRKeyStore tests * Removed example test(s) * version bump * Rename Test stage * Transferred theme elements * Changed to local DesignTheme from old BWTheme * Replaced thet private BrainwalletTheme to a local DesignTheme This is a WIP * Fixed the theme toggle button * WIP: Brought more update UI LTCPicker Wired in the latest date into the LTC Picker added new stringResource Building the LTC Picker Polished the layout of the LTCPicker Bento Added a state test Added a new class enum to match iso to country flags Added label version bump * Polished the unlock screen * Added new tests for the LTCPickerBento * WIP: Debugging the toolbar at the top for settings and theme buttons * Polished the ltc and nav bar * Added Test Coverage flags in the build gradle * ⚖️ Feature/add balance bento clean (#171) * Deleted old files some cruft some to support new design * Added new files for the effort to include Composables, strings and images * Updated resources for strings and images * Updated the Android Studio and Project files * Added more test files * Renamed the BRConstants file to BWConstants * Changed for the LTCPickerBentos from a previously merged PR * Reset the Routes and its naming Reset the Utils for constants Changing the layout Renamed a home to main * Renamed the nav layer Removed unused code Added id to TxItem for the Layout of items Added comments * Updated the design elements Added the new name of the activity * Added an update to the PeerManager Included the LTCStats using the new endpoint for the latest block height Changed the koinModules loading Added a removal of the connection listener Added far more functionality into the BrainwalletActivity against BreadActivity Updated and properly set the core to commit 28d7d31ae057bdde33b1d19e6b7af3ba07710c89 * Added tests to the Balance Bento ViewModel tests Adjusted the model to support DI * Added tests for the Event and State classes of BalanceBento * cleaned the mem settings adjusted gradle per CircleCI statement recommendation reorg the circleci config to expand the cache set the tests run polish memory in CircleCI * Fixing new wallet route Fixed my routing for the new wallet Tested and verified * 💰Feature/transaction detail bento (#173) * 💅🏼 Task/polish buy receive action (#174) * version bump * Added animation of the transactions bentos Added the basic transaction rows and detail added the viewModel and Event Included the bar icons and the switch Wired in the composables Added more string resources Set detail sizes Built in Transaction Detail Connected the isDark from Settings Polishing the Transaction Row and Detail added the QR code WIP: Added constant for the transaction view Added a empty No Transactions Row when there are not transactions WIP fixing the toggle Adding an empty transaction * Reused the BuyReceive Screen For when the user has no txns * Added the release candidate layout for the Balance Bento for syncing Also, polished the sync activity * Added some padding for the scrolling Added a blockage if the user has no transactions * Renamed the preferences Recalculated the values in the Transactions detail Added better layout of the filter toggle button Debugging the amounts and txItem values * added unit tests of Transaction view model * Reusing the BuyDialog within a Modal * Polished the layout of the modal Moved the Receive classes to the bento section Added tests for the RecieveDialogViewModelTests * Added more tests for ReceiveDialogState * 🎛️ Task/re attachment settings screen (#175) * Added animation of the transactions bentos Added the basic transaction rows and detail added the viewModel and Event Included the bar icons and the switch Wired in the composables Added more string resources Set detail sizes Built in Transaction Detail Connected the isDark from Settings Polishing the Transaction Row and Detail added the QR code WIP: Added constant for the transaction view Added a empty No Transactions Row when there are not transactions WIP fixing the toggle Adding an empty transaction * Reused the BuyReceive Screen For when the user has no txns * Added the release candidate layout for the Balance Bento for syncing Also, polished the sync activity * Added some padding for the scrolling Added a blockage if the user has no transactions * Renamed the preferences Recalculated the values in the Transactions detail Added better layout of the filter toggle button Debugging the amounts and txItem values * Reusing the BuyDialog within a Modal * Polished the layout of the modal Moved the Receive classes to the bento section Added tests for the RecieveDialogViewModelTests * Wired into the Most updated version of the SettingsComposable Set some constants Removed references to the legacy version Changed the location of the package * Added more tests of the BWConstants Combined the LTCPicker Tests * Renamed and reorged the file structure Deleted unused files * Debugged the AppModule issue Debugged the fiat / iso setting throughout the app Removal of the History classes Setup the transactionDetail action without route Removed the BRSharedPrefs callbacks Converted to Flow style with more popular and modern style * Migrated more appSetting to StateFlow Applied StateFlow in most placed for Settings Some AppSettings need to be migrated * Added a confirmation indicator * Pass LTC States Added a polish into the transaction per row Added the string localizations Migrated the data source as state flows Pass LTC Stats across many VMs * Refactor to update tests Removed old code * localized the tagline * 🛠️ Task/refactor code bugfixes (#177) * Added a special test for Insta and Linktree version bump WIP Debug the sync state * Renamed the BRWalletManager callback: onBalancedChanged * Refactor resources Removed or modified colors Removed or modified images Removed or modified strings * Added more composables Added more design elements:Gradients Dashed divider * small changes to the Transaction classes * Small update of the Balance Bento Moved the state to MainViewModel rather than a duplicate in BalanceViewModel * Refactors the navbar and updated that toml * Refactored of the MainScreen and related classes * Refactoring tests * version bump * Feat/send classes adding func modal (#181) * Added working Send group Polished the layout and UI for Send Renamed the send prep classes Added the Memo field in confirm * Refactoring the Send Rows Refactored the precision of the amounts for send and balances Updated all relevant types to BigDecimal Flowed some values to the ViewModel * Set formatting of the Confirmation widget Broke the PreSend Composable into smaller composables - PreSendAddressRow - PreSendAmountRow - PreSendMemoRow Polished the rows Added a debug for the memo row Refactored the amount * Added focus listener to recalculate the values prior to send * Added state variable brainwalletIsSyncing to the main WIP Debugging the send Readded then camera Passed the ltc address to the send class Wiring in the old Send Fragment and testing * Removed a legacy activity Adding the Passcode wrapper Wired in the passcode composable to be used in the send function Added a combined boolean to check for send disable fixed the send button enable disable Relaying out the spaces for the SendScreen refactor the send modal spacer Fixed the extra coinflip Successfully sent. need to cleanup calls * version bump * Added a clearance of value on edit version bump Added BigDecimal with rounding mode * Added gh workflow auto-translate * fix typo * Change translation PAT secret in workflow Updated GitHub Actions workflow to use new translation PAT secret. * Remove environment specification from translate job * moved script py * dupe of the script * changed the key * Update environment variable for translation script * Change environment variable from ANTHROPIC_API_KEY to ANTHROPIC_GH_API_KEY * add test workflow * Add workflow to test Anthropic API key * Change base branch for PR from main to bento * Changed the model for the translation * Added a number counter * remove the test workflow * 🥃 🥽🧪 Added tests to increase coverage (#182) * Added working Send group Polished the layout and UI for Send Renamed the send prep classes Added the Memo field in confirm * Refactoring the Send Rows Refactored the precision of the amounts for send and balances Updated all relevant types to BigDecimal Flowed some values to the ViewModel * Set formatting of the Confirmation widget Broke the PreSend Composable into smaller composables - PreSendAddressRow - PreSendAmountRow - PreSendMemoRow Polished the rows Added a debug for the memo row Refactored the amount * Added focus listener to recalculate the values prior to send * Added state variable brainwalletIsSyncing to the main WIP Debugging the send Readded then camera Passed the ltc address to the send class Wiring in the old Send Fragment and testing * Removed a legacy activity Adding the Passcode wrapper Wired in the passcode composable to be used in the send function Added a combined boolean to check for send disable fixed the send button enable disable Relaying out the spaces for the SendScreen refactor the send modal spacer Fixed the extra coinflip Successfully sent. need to cleanup calls * Added a clearance of value on edit version bump Added BigDecimal with rounding mode * Added Module Tests * Added gh workflow auto-translate * Added more Tests: BrainwalletAppTest * Feat/add fav bento design (#189) * Added design for Top Secret and the Tutorials bentos Added preview added strings files and localizations * Removed HomeBento placeholder code * fixed the config commenting * 🍱 Feat/add fav bento design (#191) * Added design for Top Secret and the Tutorials bentos Added preview added strings files and localizations * Removed HomeBento placeholder code * Fixed to unescaped aposthrphes chore(i18n): auto-translate missing strings [skip ci] Languages updated: ar, zh-rTW, zh-rCN, fr, de, fa, pa, pl, in, es, sv, uk, ru, tr, ja, ko, hi, it, pt-rBR Triggered by: 3d594e9c3360eae8d105bf81e7eeb36676d7c23c chore(i18n): auto-translate missing strings [skip ci] Languages updated: ar, zh-rTW, zh-rCN, fr, de, fa, pa, pl, in, es, sv, uk, ru, tr, ja, ko, hi, it, pt-rBR Triggered by: 2443fdef72e17658a481a091abb17ab145b1f495 Reformat the xmls Revert the notation --------- Co-authored-by: github-actions[bot] * 🎠 feat: Add Carousels (#193) * Add containers for carousels Midway adding the components of a carousel * Added the pager screen and the baseline * Added creatives Added the wiring to deploy screens and or actions * Revert "Merge branch 'bento' into feat/add-carousel-in-gamehub" This reverts commit 2b340eb2059708954bd1c851ea1dcd1f7f4dddec, reversing changes made to 6af30b1eae900aa09c6ecdcddece1ecd0c4ebb24. * chore(i18n): auto-translate missing strings [skip ci] Languages updated: ar, zh-rTW, zh-rCN, fr, de, fa, pa, pl, in, es, sv, uk, ru, tr, ja, ko, hi, it, pt-rBR Triggered by: 2b340eb2059708954bd1c851ea1dcd1f7f4dddec * Polished the LTC picker --------- Co-authored-by: github-actions[bot] * Version bump Ran test successfully * added pr summary workflow for GH Actions * Moved to the Claude for the PR Summary * fix typo * fixed the naming * Fixed name across script * add a log statement * add a log statement Moved to the Claude for the PR Summary fix typo fixed the naming Fixed name across script * fixed model typo --------- Co-authored-by: Joseph Sanjaya Co-authored-by: github-actions[bot] * 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 * 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 * 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 * 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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 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 F… * Feat/add thai dutch (#197) * 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 * 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 * 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 * 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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… * update gitignore (#204) * Add send/receive transaction integration tests (#203) * 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 * reformatted the test --------- Co-authored-by: Claude Sonnet 4.6 * Designdebt/polish main screen (#205) * Changed the borders * Change border 1dp white 20percent * Polished the no tx row * Polished the layout values updated the images * version bump * bump * Feat/add gamehub minigame (#206) * 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 (#207) * Moved clipboard test point into event * renamed * moved out of the state update (#208) * Version bump * fix: issue when user tries to send (#210) Added caller when the value is updated bump version WIP * reformatted the test * Added More comprehensive Send Tests to cover better stability Created an android test directory for instrumented test * Add WalletManager; make validateAddress instance 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. * Updated the InstrumentedTest polished the bentos Added more tests for sender * adjust the config * adjust config for running * Further fix * Fixes the bug: BreadActivity.initializeViews 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. * updated README version bump add notify script * bump * chore(i18n): auto-translate missing strings [skip ci] (#213) * 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: ee688c0c539bab3e9686e7659bac2e31561911a5 * update notify --------- Co-authored-by: github-actions[bot] * Feat/add tutorial functionality (#214) * Filled in the tutorials * Added analytics test points; linter 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: a8d1f57a8e0fc07e162b6cecd17a46e55caf12dd * Removed problem issue string * 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: 953ac76c6e3254bdae06288d9bd056c197e06275 * cleaned error strings --------- Co-authored-by: github-actions[bot] * Feat/bitrefill in topsecret (#217) * Built basic layout of the bento Added creatives Added telephony * Polished and refactored issues with the Tuts * Added and reset the web screen Added animations Added some tests * polished the strings removed some stale * add translated tags * Feat/bitrefill in topsecret (#221) * Built basic layout of the bento Added creatives Added telephony * Polished and refactored issues with the Tuts * Added and reset the web screen Added animations Added some tests * polished the strings removed some stale * add translated tags * added polish * ✨ 🛍️ 🛠️ Fix/sendmodelonevent crash (#224) * Added a keyword for Flaky tests Refactored the tests Fixes SendViewModel onEvent Fixes send keypad * 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: c37769d634e22126995e1851b945afa1fd9b66f3 * Add workflow_dispatch trigger to PR summary workflow * Update workflow name to include emoji * Change workflow reference from 'main' to 'develop' * Enable manual dispatch for notify workflow Modified workflow to enable manual dispatch and commented out pull request triggers. --------- Co-authored-by: github-actions[bot] * Fixxed the layout of the LTC fiat picker (#225) Connected the selection to the picker * Refactored the analytics (#226) * Refactored the analytics * change test * 🧼 Techdebt/sync reduce rate fpf (#228) * Fixed and normalized polling from a single source. Added a remote config to modulate the sync and non sync durations update the core module * Refactored the webviews * bump * Techdebt/sync reduce rate fpf (#229) * Fixed and normalized polling from a single source. Added a remote config to modulate the sync and non sync durations update the core module * Refactored the webviews * pulled in the fpf rate and the removed peers * bump * Feat/add remote shop (#230) * Added remote config to shop * Match event name * Added activity indicator * version bump polished the url * add part of test * Techdebt/improve shop (#232) * Working Route with Bitrefill Update remote config defaults Adding and unwrapping the JSON for the cards * Version bump Working version * Seriously refactoring the BreadActivity Remvoed more cruft of BreadActivity Able to debug crash which was calling the cards before they are filled * Parsed remote data of the widget and cards * Close to layouts are well polished * Working the cards with polish * Refactored the tests * Added analytics when user shows invoice in shop (#233) version bump * Techdebt/modules update (#235) * Update bw-gdlib moved to the proper module * Updated the core from PeerManager * Fixed the negative value Added the sound * Fallinmoji closed branch (#241) * release/v4.9.3 (#234) * 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 * 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 * 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 * 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 --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 🚀[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 * 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 * build bump * Updated README * code bump * chore: open bread activity first then open moonpay widget (#88) * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Update build.gradle.kts --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * version bump * code bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * Add agent string obfuscation (#103) * updated metadata (#105) * chore: remove screen lock detection (#106) * build bump --------- Co-authored-by: andhikayuana * 🚀[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 * 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 * 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 * 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 * 🚀[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 * 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 * 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 * 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 * Updated games module to v1.1.0 * Updated the games submodule * Renamed and tested with user skips --------- Co-authored-by: andhikayuana * 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 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 cal… * version bump Removed bwgdlib cruft * Techdebt/polish interface (#242) * Stored emojis are working! Added pager in emoji sequence How to is done Picker in progress Built the YourEmojis route Moved the InAppReview class Created the InAppReview Service Layout the bullets Completed layout for the How to choose Added better gradients Removed the textfield Disable sheet gesture Added `deprecated` portrait setting in the Android Manifest xml Wired in the Game Hub when user doesnt have the 3 emojis Polished the layout * Cleaned up item layout in 3 emojis Added logic to show the emojis WIP: Figuring out the nav for setting emojis Relayout the Pick Emojis x close * Add label in button * Version bump * Fix/polish clear set emojis (#243) * Added a check to show/ hide the Brainwallet Phrase in Settings * Hooked in the drawerState to set and clear the emojis * Set the clean process Reset the name of the bw-gdlib to match * Changed the pat * polish yml * Use typical GH TOKEN * Refactor yml * chore(i18n): auto-translate missing strings [skip ci] (#245) 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: c45fa054523d62a886635d74470d8c53a517e1d1 Co-authored-by: github-actions[bot] * Unescaped the ' in the translated strings in non-exist * fix(BreadActivity): remove dead bottom-nav/toolbar cruft causing startup NPE (#248) The "Techdebt/improve shop" refactor (d0886db0) 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 * fix(submodules): remove stale modules/bw-gdlib gitlink breaking CI (#249) Commit 1b353ae6 (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 * fix(shop-bento): eliminate flaky ShopBentoViewModelTest + version bump (#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 * 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 * 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 --------- Co-authored-by: kcw-grunt Co-authored-by: Claude * docs: real SECURITY.md + restructured README for external visitors (#251) * 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 * 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 * updated the README.md --------- Co-authored-by: Claude Co-authored-by: kcw-grunt * Bump bw-gdlib submodule to pick up ghost-launcher fix (#252) * 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> * docs: standardize release headers to bold version + PR + divider format (#254) Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> * 🎮 Fallinmoji v1.6.0: Ready, Set, GO! (#257) * update Fallinmoji v1.6.0 bump version * Update .gitignore --------- Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> * Add this skill * ci: add shields.io tests-passed badge backed by a gist endpoint (#262) Adds a step to the CircleCI unit-test job that aggregates JUnit XML results and PATCHes a public gist with a shields.io endpoint-schema JSON payload, then wires that gist's raw URL into the README as a new badge. Only runs on develop, and no-ops if GIST_TOKEN/GIST_ID aren't configured as CircleCI project env vars. * Squashed commit of the following: commit f701d2d8ee0a91e16046c7fa129bf46a9caa5c38 Author: grunt-claude-bot Date: Fri Jul 31 08:55:58 2026 +0100 Activate InAppReviewService and wire up review prompts (#260) * 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. commit 1a71dadf41fad15fe4b4c096ed06f6bd2fc6dad1 Author: grunt-claude-bot Date: Thu Jul 30 16:42:24 2026 +0100 docs: add v4.11.0 release notes to README commit faac6619c7395fe0daf5219f48675882d0705ffe Merge: 07224b95 3f2db9d0 Author: Kerry Washington Date: Thu Jul 30 16:14:18 2026 +0100 Merge branch 'main' into release/v4.11.0 commit 07224b9516a4dfe709343656bab492080e6ad3dd Author: grunt-claude-bot Date: Thu Jul 30 16:10:21 2026 +0100 test: add unit test coverage for pure utility helpers and gameinterface 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). commit 3f2db9d04b455f13741a07074d8436092b90b5f2 Author: grunt-claude-bot Date: Wed Jul 29 14:17:53 2026 +0100 docs: standardize release headers to bold version + PR + divider format (#254) (#256) Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> * Fix in-app review prompt not firing when player skips social share (#263) Decouple the review-prompt scheduling from the social-share flow so it runs on every game exit, not just when the player taps Twitter/Instagram share. Adds GameHubEvent.OnGameFinished, dispatched unconditionally from GdxGameView's onExit callback, and bumps the post-exit delay before checking showInAppReviewDialogIfNeeded() from 800ms to 3s. * Add and fix MoonPay ipAddress param in ReceiveDialog buy flow (#264) * Pass user IP address to MoonPay signed-url request in ReceiveDialog Fetches the device's public IP via ipify and includes it as the ipAddress param when requesting the MoonPay signed buy URL, per MoonPay's recommendation for KYC/risk checks. * Fix empty ipAddress in MoonPay signed-url requests The Buy button in ReceiveDialog read a userIPAddress fetched asynchronously on screen load, racing the ipify lookup and often reaching MoonPay's signed-url request before it resolved. Move the ip lookup into fetchMoonpaySignedUrl itself so it's always fetched fresh and awaited right before use, removing the racy state field and its lookup from ReceiveDialogViewModel/State/Dialog. Add tests covering fetchMoonpaySignedUrl's ip inclusion/fallback and LtcRepositoryImpl.fetchUserIpAddress's success/failure paths. * Fix RSA public key parsing in getEncryptedAgentString (#265) The key in service-data.json's agent-base64-pubkey is a base64-encoded OpenSSH "ssh-rsa " line, not base64-encoded PEM. The previous PEM-header-stripping logic stripped whitespace before re-decoding, merging the "ssh-rsa" prefix and email comment into the base64 payload and corrupting it, which surfaced as ERROR-CANNOT-KEYBYTES-DO-CONVERSION on every call. Parse the OpenSSH line properly instead: split out the key blob field, then decode the RFC 4253 wire format to get the RSA modulus/exponent and build an RSAPublicKeySpec (the previous X509EncodedKeySpec approach would have failed regardless, since OpenSSH's wire format isn't X.509 DER). Add UtilsAgentStringTest covering the real provisioned key, a full generated-keypair encrypt/decrypt round trip through the new parsing path, and malformed-input error cases. * bump beta build Clean up excess/misleading analytics events (#266) * Remove excess/duplicate analytics events Removes app_launched, home_open, and did_skip_top_up events. The did_skip_top_up event was being fired twice, once each from TopUpScreen and YourSeedProveItScreen. Also cleans up now-unused imports left behind in BreadActivity.java and an unused RSAPublicKeySpec import in UtilsAgentStringTest. Co-Authored-By: grunt-claude-bot Co-Authored-By: kcw-grunt * Remove empty DatabaseTests class The class body was empty aside from dead commented-out code left over from a previous Java test suite that was never reactivated. Co-Authored-By: grunt-claude-bot Co-Authored-By: kcw-grunt * Stop firing did_request_rating/user_completed_rating analytics events The Play Core in-app review API gives no guarantee that requesting a review actually shows the dialog to the user, so logging these as Firebase events overstated what happened. Replace the calls with local Timber debug traces at each showInAppReviewDialogIfNeeded() call site, and drop the now-unused BWConstants entries. Also cleans up InAppReviewServiceTest, which still referenced the removed constant and mocked AnalyticsManager for calls that no longer happen. Co-Authored-By: grunt-claude-bot Co-Authored-By: kcw-grunt * Add informational audit test for AnalyticsManager.log* call sites Scans app/src/main at test-run time and prints every call site (file:line, method, event name), grouped by event name and by method, so the analytics inventory stays visible and self-updating instead of living only in an external doc. Purely diagnostic — never fails on content, only if the scan itself finds nothing. Co-Authored-By: grunt-claude-bot Co-Authored-By: kcw-grunt --------- Co-Authored-By: kcw-grunt Co-Authored-By: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> * chore: bump targetSdk to 36 and update bw-gdlib (#267) * Updated the bw-gdlib * bump --------- Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> * Update Fallinmoji (How To Play) and bento corner radius fix (#268) * updated game * Update TutorialSendBentoScreen.kt --------- Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> * 🐛 Fix native SIGSEGV crash + report integrity warnings to Crashlytics (#269) * Update modules * Wire BRPeerManagerSetIntegrityWarningCallback into Firebase Crashlytics Registers core's new optional integrity-warning callback (see gruntsoftware/core PR #17/#18) so the previously-silent defensive fallback for a NULL manager->lastBlock in BRPeerManager.c is now monitored instead of going unnoticed. - PeerManager.c: new static integrityWarning() JNI callback, following the same getEnv()/CallStaticVoidMethod pattern as txStatusUpdate() etc., registered via BRPeerManagerSetIntegrityWarningCallback() right after BRPeerManagerSetCallbacks() in create(). - BRPeerManager.java: new onIntegrityWarning(String) static method, called from native. Reports via FirebaseCrashlytics.getInstance().recordException(...), matching the existing defensive-fallback-reporting precedent in BRKeyStore.java, so this shows up as a monitored non-fatal issue in the Crashlytics console rather than silently. Co-Authored-By: grunt-claude-bot Co-Authored-By: kcw-grunt --------- Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> Co-authored-by: kcw-grunt * Cut release/v4.12.0: bump version to v4.12.0 (202506350) Co-Authored-By: grunt-claude-bot Co-Authored-By: kcw-grunt * update game to v1.6.2 * Add unit tests for BRPeerManager.onIntegrityWarning Covers the new Java-side half of the native integrity-warning path: recording a RuntimeException to Crashlytics with the native warning text, once per distinct call site, and not throwing on a null warning. Co-Authored-By: grunt-claude-bot Co-Authored-By: kcw-grunt * docs: add v4.12.0 release notes to README Co-Authored-By: grunt-claude-bot Co-Authored-By: kcw-grunt --------- Co-authored-by: Kerry Washington Co-authored-by: andhikayuana Co-authored-by: Joseph Sanjaya Co-authored-by: Josi Kie <54074780+josikie@users.noreply.github.com> Co-authored-by: josikie Co-authored-by: github-actions[bot] Co-authored-by: Claude Sonnet 4.6 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> --- .circleci/config.yml | 48 +++++ README.md | 30 ++- app/build.gradle.kts | 6 +- .../java/com/brainwallet/BrainwalletApp.kt | 1 - .../appreview/InAppReviewService.kt | 4 - .../com/brainwallet/constants/BWConstants.kt | 6 +- .../data/repository/LtcRepository.kt | 2 + .../data/repository/LtcRepositoryImpl.kt | 23 +++ .../brainwallet/gameinterface/GdxGameView.kt | 1 + .../presenter/activities/BreadActivity.java | 3 - .../com/brainwallet/tools/util/Utils.java | 62 ++++-- .../balancebento/BalanceBentoScreen.kt | 3 + .../buyreceivebento/receive/ReceiveDialog.kt | 17 +- .../tutorials/TutorialSendBentoScreen.kt | 2 +- .../tutorials/send/TutorialSendPage2.kt | 2 + .../walkthrough/TutorialWalkthroughPage3.kt | 2 + .../ui/screens/buyreceive/BuyReceiveScreen.kt | 3 +- .../ui/screens/gamehub/GameHubEvent.kt | 1 + .../ui/screens/gamehub/GameHubViewModel.kt | 9 + .../ui/screens/send/SendViewModel.kt | 19 +- .../ui/screens/topup/TopUpScreen.kt | 3 - .../yourseedproveit/YourSeedProveItScreen.kt | 3 - .../com/brainwallet/wallet/BRPeerManager.java | 8 + app/src/main/jni/core | 2 +- app/src/main/jni/transition/PeerManager.c | 19 ++ .../appreview/InAppReviewServiceTest.kt | 14 +- .../data/repository/LtcRepositoryImplTest.kt | 193 ++++++++++++++++++ .../tools/database/DatabaseTests.kt | 84 -------- .../tools/util/UtilsAgentStringTest.kt | 145 +++++++++++++ .../brainwallet/wallet/BRPeerManagerTest.kt | 79 +++++++ .../brainwallet/consants/BWConstantsTest.kt | 10 - .../tools/constants/BWConstantTests.kt | 5 - .../tools/manager/AnalyticsEventAuditTest.kt | 120 +++++++++++ .../buyreceive/ReceiveDialogViewModelTest.kt | 43 ++++ bw-gdlib | 2 +- 35 files changed, 783 insertions(+), 191 deletions(-) create mode 100644 app/src/test/java/com/brainwallet/data/repository/LtcRepositoryImplTest.kt delete mode 100644 app/src/test/java/com/brainwallet/tools/database/DatabaseTests.kt create mode 100644 app/src/test/java/com/brainwallet/tools/util/UtilsAgentStringTest.kt create mode 100644 app/src/test/java/com/brainwallet/wallet/BRPeerManagerTest.kt create mode 100644 app/src/test/kotlin/com/brainwallet/tools/manager/AnalyticsEventAuditTest.kt diff --git a/.circleci/config.yml b/.circleci/config.yml index ae0d3da8..125ace10 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -100,6 +100,54 @@ jobs: path: ~/test-results - store_artifacts: path: ~/test-results/junit + - run: + name: "Update tests-passed badge (shields.io gist endpoint)" + # Only the primary branch's run should own the badge state - a feature + # branch with fewer/broken tests shouldn't flap the README badge. + # Requires GIST_TOKEN (a PAT with only the `gist` scope) and GIST_ID + # to be set as CircleCI project env vars. + when: always + command: | + if [ "$CIRCLE_BRANCH" != "develop" ]; then + echo "Not on develop, skipping badge update." + exit 0 + fi + if [ -z "$GIST_TOKEN" ] || [ -z "$GIST_ID" ]; then + echo "GIST_TOKEN/GIST_ID not set, skipping badge update." + exit 0 + fi + + total=0 + failures=0 + skipped=0 + for f in ~/test-results/junit/*.xml; do + [ -f "$f" ] || continue + t=$(grep -o 'tests="[0-9]*"' "$f" | head -1 | grep -o '[0-9]*') + fl=$(grep -o 'failures="[0-9]*"' "$f" | head -1 | grep -o '[0-9]*') + sk=$(grep -o 'skipped="[0-9]*"' "$f" | head -1 | grep -o '[0-9]*') + total=$((total + ${t:-0})) + failures=$((failures + ${fl:-0})) + skipped=$((skipped + ${sk:-0})) + done + passed=$((total - failures - skipped)) + + if [ "$failures" -gt 0 ]; then + message="${passed} passed, ${failures} failed" + color="red" + else + message="${passed} passed" + color="brightgreen" + fi + + payload=$(printf '{"files":{"tests-badge.json":{"content":"{\\"schemaVersion\\":1,\\"label\\":\\"tests\\",\\"message\\":\\"%s\\",\\"color\\":\\"%s\\"}"}}}' "$message" "$color") + + curl -s -X PATCH \ + -H "Authorization: token ${GIST_TOKEN}" \ + -H "Accept: application/vnd.github+json" \ + "https://api.github.com/gists/${GIST_ID}" \ + -d "$payload" > /dev/null + + echo "Badge updated: ${message}" screengrab: executor: diff --git a/README.md b/README.md index 609be87c..4980363f 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ### CircleCI status [![Release](https://img.shields.io/github/v/release/gruntsoftware/android?style=plastic)](https://github.com/gruntsoftware/android/releases) [![CircleCI](https://dl.circleci.com/status-badge/img/gh/gruntsoftware/android/tree/main.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/gruntsoftware/android/tree/main) +[![Tests](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/grunt-claude-bot/ae4830cb1b5da4611598d20a517fd933/raw/tests-badge.json)](https://dl.circleci.com/status-badge/redirect/gh/gruntsoftware/android/tree/develop) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) ## Play Store @@ -42,7 +43,7 @@ ### Prerequisites - Android Studio (current stable) with SDK 36 installed, NDK `25.1.8937393`, CMake `3.22.1` -- `minSdk 29`, `targetSdk 35` +- `minSdk 29`, `targetSdk 36` ## Architecture @@ -73,6 +74,33 @@ For the full, up-to-date changelog see [GitHub Releases](https://github.com/grun --- +### **v4.12.0** [PR [#270](https://github.com/gruntsoftware/android/pull/270)] +--- +#### ✨ In-App Review Activated +Google Play's in-app review prompt is now actually wired up after sitting dormant — `InAppReviewService` is registered in Koin and `showInAppReviewDialogIfNeeded()` is called from five placements: after a successful send, the game hub exit flow, the balance-visibility toggle, and two tutorial pages (#260). A follow-up fix decouples the prompt from the social-share flow so it fires on every game exit, not just when the player taps Twitter/Instagram share (#263). + +#### 🐛 Bug Fixes +- **Native `SIGSEGV` crash in `BRPeerManager`** — several accessors (`BRPeerManagerEstimatedBlockHeight`, `LastBlockHeight`, `LastBlockTimestamp`, `SyncProgress`) dereferenced `lastBlock` without a null check, crashing the process if a checkpoint block was ever missing from the persisted block set. `core`'s `BRPeerManager.c` now guards every access and reports the recovery back to the app via a new `BRPeerManagerSetIntegrityWarningCallback`, surfaced through `BRPeerManager.onIntegrityWarning()` to Crashlytics instead of crashing (#269). +- **RSA public key parsing in `getEncryptedAgentString`** — the provisioned key is an OpenSSH `ssh-rsa ` line, not base64-encoded PEM; the old PEM-stripping logic corrupted the payload by merging the `ssh-rsa` prefix and comment into it, failing on every call. Now parses the OpenSSH wire format (RFC 4253) directly (#265). +- **MoonPay signed-url `ipAddress` race** — the Buy button in `ReceiveDialog` could reach MoonPay's signed-url request before the async ipify lookup resolved, sending an empty `ipAddress`. The lookup now happens fresh inside `fetchMoonpaySignedUrl` itself, awaited right before use (#264). + +#### 🎮 Fallinmoji v1.6.2 +"How To Play" screen update and a bento corner-radius fix, plus a bw-gdlib bump to pick it up (#268). + +#### 📊 Analytics Cleanup +Removed excess/duplicate events (`app_launched`, `home_open`, a double-firing `did_skip_top_up`) and stopped logging `did_request_rating`/`user_completed_rating` as Firebase events — the Play Core API gives no guarantee a review request actually shows the dialog, so these overstated what happened. Replaced with local `Timber.d` traces (#266). + +#### 🧪 Test Coverage +Added coverage for `InAppReviewService` (gating + Play Core success/failure branches), `UtilsAgentString`'s new OpenSSH parsing path, MoonPay ip-fetch success/failure, and `BRPeerManager.onIntegrityWarning`'s Crashlytics reporting. + +#### 🔧 Chores +- Bumped `targetSdk` to 36 (#267) +- Version bumped: **v4.11.0 (202506346) → v4.12.0 (202506350)** + +**Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.11.0...v4.12.0 + +--- + ### **v4.11.0** [PR [#259](https://github.com/gruntsoftware/android/pull/259)] --- #### 🎮 Fallinmoji v1.6.0 — Ready, Set, GO! diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 510df9cc..90243649 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -30,9 +30,9 @@ android { defaultConfig { applicationId = "ltd.grunt.brainwallet" minSdk = 29 - targetSdk = 35 - versionCode = 202506347 - versionName = "v4.11.0" + targetSdk = 36 + versionCode = 202506350 + versionName = "v4.12.0" multiDexEnabled = true base.archivesName.set("${defaultConfig.versionName}(${defaultConfig.versionCode})") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/brainwallet/BrainwalletApp.kt b/app/src/main/java/com/brainwallet/BrainwalletApp.kt index 36cba83f..7f2f224e 100644 --- a/app/src/main/java/com/brainwallet/BrainwalletApp.kt +++ b/app/src/main/java/com/brainwallet/BrainwalletApp.kt @@ -37,7 +37,6 @@ open class BrainwalletApp : Application() { FirebaseCrashlytics.getInstance().setCustomKey("build_type", "debug") FirebaseCrashlytics.getInstance().setUserId("debug_bw_devices") } - AnalyticsManager.logCustomEvent(BWConstants._20191105_AL) if (BuildConfig.DEBUG) Timber.plant(DebugTree()) diff --git a/app/src/main/java/com/brainwallet/appreview/InAppReviewService.kt b/app/src/main/java/com/brainwallet/appreview/InAppReviewService.kt index 503742be..39d195fa 100644 --- a/app/src/main/java/com/brainwallet/appreview/InAppReviewService.kt +++ b/app/src/main/java/com/brainwallet/appreview/InAppReviewService.kt @@ -2,8 +2,6 @@ package com.brainwallet.appreview import android.app.Activity import android.app.Application -import com.brainwallet.constants.BWConstants -import com.brainwallet.tools.manager.AnalyticsManager import com.brainwallet.tools.manager.BRSharedPrefs import com.google.android.gms.tasks.OnCompleteListener import com.google.android.gms.tasks.Task @@ -26,7 +24,6 @@ class InAppReviewService( val request = manager.requestReviewFlow() request.addOnCompleteListener( OnCompleteListener { task: Task? -> - AnalyticsManager.logCustomEvent(BWConstants._20241006_DRR) if (task!!.isSuccessful()) { val reviewInfo = task.getResult() val flow = manager.launchReviewFlow(activity, reviewInfo) @@ -41,7 +38,6 @@ class InAppReviewService( ) if (task1.isSuccessful()) { BRSharedPrefs.inAppReviewDone(app) - AnalyticsManager.logCustomEvent(BWConstants._20241006_UCR) } } ) diff --git a/app/src/main/java/com/brainwallet/constants/BWConstants.kt b/app/src/main/java/com/brainwallet/constants/BWConstants.kt index fe413c28..10181919 100644 --- a/app/src/main/java/com/brainwallet/constants/BWConstants.kt +++ b/app/src/main/java/com/brainwallet/constants/BWConstants.kt @@ -116,11 +116,11 @@ object BWConstants { * API Hosts */ const val BW_API_PROD_HOST: String = "https://api.grunt.ltd" + const val IPIFY_API_HOST: String = "https://api.ipify.org?format=text" const val BLOCKCHAIR_EXPLORER_BASE_URL: String = "https://blockchair.com/litecoin/transaction/" const val BLOCKCYPHER_EXPLORER_BASE_URL: String = "https://live.blockcypher.com/ltc/" - const val _20191105_AL: String = "app_launched" const val _20191105_VSC: String = "visit_send_controller" const val _20202116_VRC: String = "visit_receive_controller" const val _20191105_DSL: String = "did_send_ltc" @@ -133,11 +133,7 @@ object BWConstants { const val _20201118_DTGS: String = "did_tap_get_support" const val _20200217_DU: String = "did_unlock" - const val _20250303_DSTU: String = "did_skip_top_up" const val _20250517_WCINFO: String = "wallet_callback_info" - const val _20241006_DRR: String = "did_request_rating" - const val _20241006_UCR: String = "user_completed_rating" - const val _HOME_OPEN: String = "home_open" /** * Analytics keys diff --git a/app/src/main/java/com/brainwallet/data/repository/LtcRepository.kt b/app/src/main/java/com/brainwallet/data/repository/LtcRepository.kt index ddab8a08..75c26c87 100644 --- a/app/src/main/java/com/brainwallet/data/repository/LtcRepository.kt +++ b/app/src/main/java/com/brainwallet/data/repository/LtcRepository.kt @@ -25,6 +25,8 @@ interface LtcRepository { suspend fun fetchMoonpaySignedUrl(params: Map): String + suspend fun fetchUserIpAddress(): String + companion object { const val PREF_KEY_NETWORK_FEE_PER_KB = "network_fee_per_kb" const val PREF_KEY_NETWORK_FEE_PER_KB_CACHED_AT = "${PREF_KEY_NETWORK_FEE_PER_KB}_cached_at" diff --git a/app/src/main/java/com/brainwallet/data/repository/LtcRepositoryImpl.kt b/app/src/main/java/com/brainwallet/data/repository/LtcRepositoryImpl.kt index 7628af17..84670ce8 100644 --- a/app/src/main/java/com/brainwallet/data/repository/LtcRepositoryImpl.kt +++ b/app/src/main/java/com/brainwallet/data/repository/LtcRepositoryImpl.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.SharedPreferences import androidx.core.net.toUri import com.brainwallet.BuildConfig +import com.brainwallet.constants.BWConstants import com.brainwallet.data.model.CurrencyEntity import com.brainwallet.data.model.Fee import com.brainwallet.data.model.LtcStats @@ -33,8 +34,11 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import okhttp3.OkHttpClient +import okhttp3.Request import org.koin.core.annotation.Single import timber.log.Timber @@ -47,6 +51,7 @@ class LtcRepositoryImpl( private val peerManagerSource: PeerManagerSource, private val repositoryScope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.IO), private val sharedPreferences: SharedPreferences, + private val okHttpClient: OkHttpClient, ) : LtcRepository { // private val _rates = MutableStateFlow>( @@ -170,6 +175,7 @@ class LtcRepositoryImpl( "externalTransactionId" to externalTransactionID, "currencyCode" to "ltc", "themeId" to "main-v1.0.0", + "ipAddress" to fetchUserIpAddress(), ) return remoteApiSource.getMoonpaySignedUrl(finalParams) .signedUrl.toUri() @@ -182,4 +188,21 @@ class LtcRepositoryImpl( .build() .toString() } + + override suspend fun fetchUserIpAddress(): String = withContext(Dispatchers.IO) { + runCatching { + val request = Request.Builder() + .url(BWConstants.IPIFY_API_HOST) + .build() + okHttpClient.newCall(request).execute().use { response -> + if (response.isSuccessful) { + response.body?.string()?.trim().orEmpty() + } else { + "" + } + } + }.onFailure { + Timber.e(it, "fetchUserIpAddress failed") + }.getOrDefault("") + } } diff --git a/app/src/main/java/com/brainwallet/gameinterface/GdxGameView.kt b/app/src/main/java/com/brainwallet/gameinterface/GdxGameView.kt index a29b11bb..3746a2b0 100644 --- a/app/src/main/java/com/brainwallet/gameinterface/GdxGameView.kt +++ b/app/src/main/java/com/brainwallet/gameinterface/GdxGameView.kt @@ -77,6 +77,7 @@ fun GdxGameView( this.onExit = { jsonString, bytes -> removeFragment(fm, tag) viewModel.onEvent(MainScreenEvent.OnToggleGameHub) + gameHubViewModel.onEvent(GameHubEvent.OnGameFinished) handleGameExit(jsonString, bytes, gameHubViewModel) currentOnExit(jsonString, bytes) } diff --git a/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java b/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java index ae947471..af3cef39 100644 --- a/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java +++ b/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java @@ -38,7 +38,6 @@ import com.brainwallet.presenter.customviews.BRNotificationBar; import com.brainwallet.presenter.history.HistoryFragment; import com.brainwallet.tools.animation.TextSizeTransition; -import com.brainwallet.tools.manager.AnalyticsManager; import com.brainwallet.tools.manager.BRSharedPrefs; import com.brainwallet.tools.manager.InternetManager; import com.brainwallet.tools.manager.sync.SyncManager; @@ -46,7 +45,6 @@ import com.brainwallet.tools.security.PostAuth; import com.brainwallet.tools.sqlite.TransactionDataSource; import com.brainwallet.tools.threads.BRExecutor; -import com.brainwallet.constants.BWConstants; import com.brainwallet.tools.util.BRCurrency; import com.brainwallet.tools.util.BRExchange; import com.brainwallet.tools.util.ExtensionKt; @@ -98,7 +96,6 @@ public static BreadActivity getApp() { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bread); - AnalyticsManager.logCustomEvent(BWConstants._HOME_OPEN); app = this; getWindowManager().getDefaultDisplay().getSize(screenParametersPoint); diff --git a/app/src/main/java/com/brainwallet/tools/util/Utils.java b/app/src/main/java/com/brainwallet/tools/util/Utils.java index 0a1f180c..8ccf19e0 100644 --- a/app/src/main/java/com/brainwallet/tools/util/Utils.java +++ b/app/src/main/java/com/brainwallet/tools/util/Utils.java @@ -21,7 +21,9 @@ import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; +import java.security.spec.RSAPublicKeySpec; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.Base64; import javax.crypto.BadPaddingException; @@ -198,24 +200,12 @@ public static String getEncryptedAgentString(Context app) { try { - // Convert base64 public key string to PublicKey object - byte[] keyBytes; + // Convert the base64-encoded OpenSSH "ssh-rsa " public key + // string into an RSAPublicKeySpec + RSAPublicKeySpec keySpec; try { String pubkey = Utils.fetchServiceItem(app, ServiceItems.AGENTPUBKEY).toString(); - keyBytes = Base64.getDecoder().decode(pubkey); - - // Decode the base64 to get the PEM string - byte[] pemBytes = Base64.getDecoder().decode(pubkey); - String pemString = new String(pemBytes, "UTF-8"); - - // Extract just the key data (remove PEM headers and whitespace) - String keyData = pemString - .replace("-----BEGIN PUBLIC KEY-----", "") - .replace("-----END PUBLIC KEY-----", "") - .replaceAll("\\s+", ""); - - // Decode the clean base64 key data - keyBytes = Base64.getDecoder().decode(keyData); + keySpec = parseOpenSshRsaPublicKey(pubkey); } catch (IllegalArgumentException e) { Timber.d("Invalid base64 public key format: %s", e.toString()); return "ERROR-CANNOT-KEYBYTES-DO-CONVERSION"; @@ -232,7 +222,7 @@ public static String getEncryptedAgentString(Context app) { // Generate PublicKey object PublicKey publicKey; try { - publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(keyBytes)); + publicKey = keyFactory.generatePublic(keySpec); } catch (InvalidKeySpecException e) { Timber.d("Invalid public key specification: %s", e.toString()); return "ERROR-CANNOT-INVALID-PUBLIC-KEY-SPEC"; @@ -275,6 +265,42 @@ public static String getEncryptedAgentString(Context app) { } } + // Parses a base64-encoded OpenSSH "ssh-rsa " public key line + // (as provisioned in service-data.json's agent-base64-pubkey) into an RSAPublicKeySpec. + // Package-private so it can be unit-tested directly without needing a Context. + static RSAPublicKeySpec parseOpenSshRsaPublicKey(String base64EncodedOpenSshLine) { + String opensshLine = new String(Base64.getDecoder().decode(base64EncodedOpenSshLine), StandardCharsets.UTF_8); + + // OpenSSH format: "ssh-rsa [comment]" + String[] parts = opensshLine.trim().split("\\s+"); + if (parts.length < 2) { + throw new IllegalArgumentException("Unexpected OpenSSH public key format"); + } + byte[] keyBlob = Base64.getDecoder().decode(parts[1]); + return parseSshRsaPublicKeyBlob(keyBlob); + } + + // Parses an RFC 4253 "ssh-rsa" wire-format key blob (as found in an OpenSSH + // public key line's second field) into the modulus/exponent RSA needs. + static RSAPublicKeySpec parseSshRsaPublicKeyBlob(byte[] keyBlob) { + ByteBuffer buffer = ByteBuffer.wrap(keyBlob); + String keyType = new String(readSshField(buffer), StandardCharsets.UTF_8); + if (!"ssh-rsa".equals(keyType)) { + throw new IllegalArgumentException("Unsupported SSH key type: " + keyType); + } + BigInteger exponent = new BigInteger(readSshField(buffer)); + BigInteger modulus = new BigInteger(readSshField(buffer)); + return new RSAPublicKeySpec(modulus, exponent); + } + + // Each SSH wire-format field is a 4-byte big-endian length followed by that many bytes. + private static byte[] readSshField(ByteBuffer buffer) { + int length = buffer.getInt(); + byte[] data = new byte[length]; + buffer.get(data); + return data; + } + public static String reverseHex(String hex) { if (hex == null) return null; StringBuilder result = new StringBuilder(); diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/balancebento/BalanceBentoScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/balancebento/BalanceBentoScreen.kt index 8537d17e..4bdaae77 100644 --- a/app/src/main/java/com/brainwallet/ui/bentosections/balancebento/BalanceBentoScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/bentosections/balancebento/BalanceBentoScreen.kt @@ -67,6 +67,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel +import timber.log.Timber import java.math.BigDecimal @Composable @@ -194,6 +195,7 @@ fun BalanceBentoScreen( coroutineScope.launch { delay(800L) inAppReviewService.showInAppReviewDialogIfNeeded() + Timber.d("did_request_rating") } } } @@ -274,6 +276,7 @@ fun BalanceBentoScreen( coroutineScope.launch { delay(800L) inAppReviewService.showInAppReviewDialogIfNeeded() + Timber.d("did_request_rating") } } } diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/buyreceivebento/receive/ReceiveDialog.kt b/app/src/main/java/com/brainwallet/ui/bentosections/buyreceivebento/receive/ReceiveDialog.kt index 60b5441a..a13b188d 100644 --- a/app/src/main/java/com/brainwallet/ui/bentosections/buyreceivebento/receive/ReceiveDialog.kt +++ b/app/src/main/java/com/brainwallet/ui/bentosections/buyreceivebento/receive/ReceiveDialog.kt @@ -210,19 +210,6 @@ private fun ReceiveDialog( } ) - // moonpay widget - // todo: revisit this later -// AnimatedVisibility(visible = state.moonpayWidgetVisible()) { -// state.moonpayBuySignedUrl?.let { signedUrl -> -// MoonpayBuyWidget( -// modifier = Modifier.height(500.dp), -// signedUrl = signedUrl -// ) -// } -// } - - // buy / receive -// AnimatedVisibility(visible = state.moonpayWidgetVisible().not()) { Column { Row( modifier = Modifier.fillMaxWidth(), @@ -418,14 +405,12 @@ private fun ReceiveDialog( modifier = Modifier.fillMaxWidth(), enabled = loadingState.visible.not(), onClick = { - // todo: revisit this later - // viewModel.onEvent(ReceiveDialogEvent.OnMoonpayButtonClick) onMoonPayLaunch( mapOf( "baseCurrencyCode" to state.selectedFiatCurrency.code, "baseCurrencyAmount" to state.fiatAmount.toString(), "language" to appSetting.languageCode, - "walletAddress" to state.address, + "walletAddress" to state.address ) ) }, diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialSendBentoScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialSendBentoScreen.kt index f2312f2d..48d6f05b 100644 --- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialSendBentoScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialSendBentoScreen.kt @@ -48,7 +48,7 @@ fun TutorialSendBentoScreen( Card( modifier = modifier.fillMaxSize(), - shape = RoundedCornerShape(18.dp), + shape = RoundedCornerShape(bentoCornerRadius), colors = CardDefaults.cardColors(containerColor = Color.Transparent), onClick = onClick ) { diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt index 53052134..a21ce135 100644 --- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt +++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt @@ -27,6 +27,7 @@ import com.brainwallet.ui.composable.CalloutWithPointers import com.brainwallet.ui.composable.Pointer import com.brainwallet.ui.theme.IBMPlexSans import org.koin.compose.koinInject +import timber.log.Timber @Composable fun TutorialSendPage2( @@ -36,6 +37,7 @@ fun TutorialSendPage2( ) { LaunchedEffect(Unit) { inAppReviewService.showInAppReviewDialogIfNeeded() + Timber.d("did_request_rating") } Box( modifier = Modifier diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt index 0be51438..41349294 100644 --- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt +++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt @@ -26,6 +26,7 @@ import com.brainwallet.ui.composable.CalloutWithPointers import com.brainwallet.ui.composable.Pointer import com.brainwallet.ui.theme.IBMPlexSans import org.koin.compose.koinInject +import timber.log.Timber @Composable fun TutorialWalkthroughPage3( @@ -35,6 +36,7 @@ fun TutorialWalkthroughPage3( ) { LaunchedEffect(Unit) { inAppReviewService.showInAppReviewDialogIfNeeded() + Timber.d("did_request_rating") } Box( diff --git a/app/src/main/java/com/brainwallet/ui/screens/buyreceive/BuyReceiveScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/buyreceive/BuyReceiveScreen.kt index c70f2547..f303dd05 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/buyreceive/BuyReceiveScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/buyreceive/BuyReceiveScreen.kt @@ -150,8 +150,7 @@ fun BuyReceiveScreen( "baseCurrencyAmount" to state.fiatAmount.toString(), "language" to appSetting.languageCode, "walletAddress" to state.address - ), - + ) ) } ) { diff --git a/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubEvent.kt b/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubEvent.kt index 246d2754..3fe80cd2 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubEvent.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubEvent.kt @@ -5,4 +5,5 @@ import android.content.Context sealed class GameHubEvent { data class OnLoad(val context: Context) : GameHubEvent() data class OnGameExited(val jsonPayload: String, val byteArray: ByteArray) : GameHubEvent() + data object OnGameFinished : GameHubEvent() } diff --git a/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubViewModel.kt b/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubViewModel.kt index 2b2d061b..e6e7f20a 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubViewModel.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/gamehub/GameHubViewModel.kt @@ -20,6 +20,7 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import org.koin.android.annotation.KoinViewModel +import timber.log.Timber import java.io.File import java.io.FileOutputStream @@ -36,6 +37,14 @@ class GameHubViewModel( when (event) { is GameHubEvent.OnLoad -> { } + is GameHubEvent.OnGameFinished -> { + AnalyticsManager.logCustomEventWithParams("did_play_game", null) + viewModelScope.launch { + delay(3_000L) + inAppReviewService.showInAppReviewDialogIfNeeded() + Timber.d("did_request_rating") + } + } is GameHubEvent.OnGameExited -> { val unixTimestamp = System.currentTimeMillis() / 1000 val bitmap = BitmapFactory.decodeByteArray(event.byteArray, 0, event.byteArray.size) diff --git a/app/src/main/java/com/brainwallet/ui/screens/send/SendViewModel.kt b/app/src/main/java/com/brainwallet/ui/screens/send/SendViewModel.kt index f5696037..dee8a4d3 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/send/SendViewModel.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/send/SendViewModel.kt @@ -284,6 +284,7 @@ class SendViewModel( BRSharedPrefs.incrementSendTransactionCount(app) delay(800L) inAppReviewService.showInAppReviewDialogIfNeeded() + Timber.d("did_request_rating") } is Error.InsufficientFunds -> { _state.update { @@ -371,21 +372,3 @@ class SendViewModel( data object DismissSheet : SendEffect() } } - -// if (allFilled) { -// BRSender.getInstance().sendTransaction( -// context, -// TransactionItem( -// sendAddress, -// Utils.fetchServiceItem(context, ServiceItems.WALLETOPS), -// null, -// litoshiAmount.toLong(), -// getOpsFee(litoshiAmount.toLong()), -// null, -// false, -// comment -// ), -// ) -// AnalyticsManager.logCustomEvent(BWConstants._20191105_DSL) -// BRSharedPrefs.incrementSendTransactionCount(context) -// } diff --git a/app/src/main/java/com/brainwallet/ui/screens/topup/TopUpScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/topup/TopUpScreen.kt index 4e50d64d..bd56b0e2 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/topup/TopUpScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/topup/TopUpScreen.kt @@ -31,11 +31,9 @@ import com.brainwallet.R import com.brainwallet.navigation.OnNavigate import com.brainwallet.navigation.Route import com.brainwallet.navigation.UiEffect -import com.brainwallet.tools.manager.AnalyticsManager import com.brainwallet.ui.composable.BorderedLargeButton import com.brainwallet.ui.composable.BrainwalletScaffold import com.brainwallet.ui.composable.BrainwalletTopAppBar -import com.brainwallet.constants.BWConstants import com.brainwallet.ui.screens.yourseedproveit.YourSeedProveItViewModel import org.koin.compose.viewmodel.koinViewModel @@ -117,7 +115,6 @@ fun TopUpScreen( } BorderedLargeButton( onClick = { - AnalyticsManager.logCustomEvent(BWConstants._20250303_DSTU) onNavigate.invoke( UiEffect.Navigate( destinationRoute = Route.Main, diff --git a/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItScreen.kt index 14168cbb..0761ebd0 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItScreen.kt @@ -52,13 +52,11 @@ import androidx.compose.ui.unit.dp import com.brainwallet.R import com.brainwallet.navigation.OnNavigate import com.brainwallet.navigation.UiEffect -import com.brainwallet.tools.manager.AnalyticsManager import com.brainwallet.ui.composable.BrainwalletScaffold import com.brainwallet.ui.composable.BrainwalletTopAppBar import com.brainwallet.ui.composable.LargeButton import com.brainwallet.ui.composable.SeedWordItem import com.brainwallet.ui.composable.SeedWordsLayout -import com.brainwallet.constants.BWConstants import com.brainwallet.navigation.Route import org.koin.compose.koinInject @@ -89,7 +87,6 @@ fun YourSeedProveItScreen( if (state.orderCorrected) { coinAudioPlayer.start() viewModel.onEvent(YourSeedProveItEvent.OnCompletedPaperKey) - AnalyticsManager.logCustomEvent(BWConstants._20250303_DSTU) } } diff --git a/app/src/main/java/com/brainwallet/wallet/BRPeerManager.java b/app/src/main/java/com/brainwallet/wallet/BRPeerManager.java index b561b816..5b361d47 100644 --- a/app/src/main/java/com/brainwallet/wallet/BRPeerManager.java +++ b/app/src/main/java/com/brainwallet/wallet/BRPeerManager.java @@ -16,6 +16,7 @@ import com.brainwallet.tools.sqlite.PeerDataSource; import com.brainwallet.tools.threads.BRExecutor; import com.brainwallet.tools.util.TrustedNode; +import com.google.firebase.crashlytics.FirebaseCrashlytics; import org.koin.java.KoinJavaComponent; @@ -109,6 +110,13 @@ public void run() { }); } @Suppress(names = "unused") // called via BRPeerManager callback + public static void onIntegrityWarning(String warning) { + Timber.e("timber: native integrity warning: %s", warning); + FirebaseCrashlytics.getInstance().recordException( + new RuntimeException("BRPeerManager native integrity warning: " + warning) + ); + } + @Suppress(names = "unused") // called via BRPeerManager callback public static void saveBlocks(final BlockEntity[] blockEntities, final boolean replace) { Timber.d("timber: saveBlocks: %s", blockEntities.length); diff --git a/app/src/main/jni/core b/app/src/main/jni/core index 4c903166..50ac71d6 160000 --- a/app/src/main/jni/core +++ b/app/src/main/jni/core @@ -1 +1 @@ -Subproject commit 4c90316690ce613482649ccd8b07583749a72266 +Subproject commit 50ac71d6ee39420d6ffc225576e6f7e65b4bcf3c diff --git a/app/src/main/jni/transition/PeerManager.c b/app/src/main/jni/transition/PeerManager.c index 8d249725..0d6638e5 100644 --- a/app/src/main/jni/transition/PeerManager.c +++ b/app/src/main/jni/transition/PeerManager.c @@ -122,6 +122,24 @@ static void txStatusUpdate(void *info) { (*env)->CallStaticVoidMethod(env, _peerManagerClass, mid); } +// called by core when it detects and recovers from unexpected internal state (e.g. a missing checkpoint +// block) instead of crashing. warning is a short, static, human-readable C string with no dynamic/sensitive +// content. See BRPeerManagerSetIntegrityWarningCallback() in core/BRPeerManager.h. +static void integrityWarning(void *info, const char *warning) { + __android_log_print(ANDROID_LOG_ERROR, "Message from C: ", "integrityWarning: %s", warning); + if (!_peerManager) return; + + JNIEnv *env = getEnv(); + jmethodID mid; + + if (!env) return; + + jstring jWarning = (*env)->NewStringUTF(env, warning); + mid = (*env)->GetStaticMethodID(env, _peerManagerClass, "onIntegrityWarning", "(Ljava/lang/String;)V"); + (*env)->CallStaticVoidMethod(env, _peerManagerClass, mid, jWarning); + (*env)->DeleteLocalRef(env, jWarning); +} + static void saveBlocks(void *info, int replace, BRMerkleBlock *blocks[], size_t count) { __android_log_print(ANDROID_LOG_DEBUG, "Message from C: ", "saveBlocks"); if (!_peerManager) return; @@ -386,6 +404,7 @@ Java_com_brainwallet_wallet_BRPeerManager_create(JNIEnv *env, jobject thiz, BRPeerManagerSetCallbacks(_peerManager, NULL, syncStarted, syncStopped, txStatusUpdate, saveBlocks, savePeers, networkIsReachable, threadCleanup); + BRPeerManagerSetIntegrityWarningCallback(_peerManager, integrityWarning); } if (_peerManager == NULL) { diff --git a/app/src/test/java/com/brainwallet/appreview/InAppReviewServiceTest.kt b/app/src/test/java/com/brainwallet/appreview/InAppReviewServiceTest.kt index 0f0cd15c..2b91f1ad 100644 --- a/app/src/test/java/com/brainwallet/appreview/InAppReviewServiceTest.kt +++ b/app/src/test/java/com/brainwallet/appreview/InAppReviewServiceTest.kt @@ -2,8 +2,6 @@ package com.brainwallet.appreview import android.app.Activity import android.app.Application -import com.brainwallet.constants.BWConstants -import com.brainwallet.tools.manager.AnalyticsManager import com.brainwallet.tools.manager.BRSharedPrefs import com.google.android.gms.tasks.OnCompleteListener import com.google.android.gms.tasks.Task @@ -58,8 +56,6 @@ class InAppReviewServiceTest { } mockkStatic(BRSharedPrefs::class) - mockkStatic(AnalyticsManager::class) - every { AnalyticsManager.logCustomEvent(any()) } returns Unit } @After @@ -108,7 +104,7 @@ class InAppReviewServiceTest { } @Test - fun `given eligible user and successful review flow, when showInAppReviewDialogIfNeeded, then marks review done and logs both analytics events`() { + fun `given eligible user and successful review flow, when showInAppReviewDialogIfNeeded, then marks review done`() { every { BRSharedPrefs.isInAppReviewDone(app) } returns false every { BRSharedPrefs.getSendTransactionCount(app) } returns 5 every { requestTask.isSuccessful() } returns true @@ -120,8 +116,6 @@ class InAppReviewServiceTest { verify { manager.launchReviewFlow(activity, reviewInfo) } verify { BRSharedPrefs.inAppReviewDone(app) } - verify { AnalyticsManager.logCustomEvent(BWConstants._20241006_DRR) } - verify { AnalyticsManager.logCustomEvent(BWConstants._20241006_UCR) } } @Test @@ -135,12 +129,10 @@ class InAppReviewServiceTest { verify(exactly = 0) { manager.launchReviewFlow(any(), any()) } verify(exactly = 0) { BRSharedPrefs.inAppReviewDone(app) } - verify { AnalyticsManager.logCustomEvent(BWConstants._20241006_DRR) } - verify(exactly = 0) { AnalyticsManager.logCustomEvent(BWConstants._20241006_UCR) } } @Test - fun `given launch review flow fails, when showInAppReviewDialogIfNeeded, then does not mark done or log completion event`() { + fun `given launch review flow fails, when showInAppReviewDialogIfNeeded, then does not mark done`() { every { BRSharedPrefs.isInAppReviewDone(app) } returns false every { BRSharedPrefs.getSendTransactionCount(app) } returns 5 every { requestTask.isSuccessful() } returns true @@ -151,7 +143,5 @@ class InAppReviewServiceTest { verify { manager.launchReviewFlow(activity, reviewInfo) } verify(exactly = 0) { BRSharedPrefs.inAppReviewDone(app) } - verify { AnalyticsManager.logCustomEvent(BWConstants._20241006_DRR) } - verify(exactly = 0) { AnalyticsManager.logCustomEvent(BWConstants._20241006_UCR) } } } diff --git a/app/src/test/java/com/brainwallet/data/repository/LtcRepositoryImplTest.kt b/app/src/test/java/com/brainwallet/data/repository/LtcRepositoryImplTest.kt new file mode 100644 index 00000000..93e24c6a --- /dev/null +++ b/app/src/test/java/com/brainwallet/data/repository/LtcRepositoryImplTest.kt @@ -0,0 +1,193 @@ +package com.brainwallet.data.repository + +import android.content.Context +import android.content.SharedPreferences +import android.net.Uri +import com.brainwallet.data.source.PeerManagerSource +import com.brainwallet.data.source.RemoteApiSource +import com.brainwallet.data.source.RemoteConfigSource +import com.brainwallet.data.source.response.GetMoonpaySignUrlResponse +import com.brainwallet.tools.sqlite.CurrencyDataSource +import com.brainwallet.tools.util.Utils +import io.mockk.coEvery +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.slot +import io.mockk.unmockkAll +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.runBlocking +import okhttp3.Call +import okhttp3.OkHttpClient +import okhttp3.Response +import okhttp3.ResponseBody +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import java.io.IOException + +class LtcRepositoryImplTest { + + private lateinit var context: Context + private lateinit var remoteApiSource: RemoteApiSource + private lateinit var remoteConfigSource: RemoteConfigSource + private lateinit var currencyDataSource: CurrencyDataSource + private lateinit var peerManagerSource: PeerManagerSource + private lateinit var sharedPreferences: SharedPreferences + private lateinit var okHttpClient: OkHttpClient + private lateinit var repository: LtcRepositoryImpl + + @Before + fun setUp() { + context = mockk(relaxed = true) + remoteApiSource = mockk(relaxed = true) + remoteConfigSource = mockk(relaxed = true) + currencyDataSource = mockk(relaxed = true) + peerManagerSource = mockk(relaxed = true) + sharedPreferences = mockk(relaxed = true) + okHttpClient = mockk() + + every { currencyDataSource.getAllCurrencies(any()) } returns emptyList() + + mockkStatic(Utils::class) + every { Utils.getEncryptedAgentString(any()) } returns "fake-agent-string" + + repository = LtcRepositoryImpl( + context = context, + remoteApiSource = remoteApiSource, + remoteConfigSource = remoteConfigSource, + currencyDataSource = currencyDataSource, + peerManagerSource = peerManagerSource, + // cancelled scope: the sync-loop launched in init{} must not run during these tests + repositoryScope = CoroutineScope(Job().apply { cancel() }), + sharedPreferences = sharedPreferences, + okHttpClient = okHttpClient, + ) + } + + @After + fun tearDown() { + unmockkAll() + } + + private fun stubResponse(isSuccessful: Boolean, body: String?) { + val call = mockk() + val response = mockk(relaxed = true) + every { okHttpClient.newCall(any()) } returns call + every { call.execute() } returns response + every { response.isSuccessful } returns isSuccessful + if (body != null) { + val responseBody = mockk() + every { responseBody.string() } returns body + every { response.body } returns responseBody + } else { + every { response.body } returns null + } + } + + // ── fetchUserIpAddress ──────────────────────────────────────────────── + + @Test + fun `fetchUserIpAddress returns trimmed ip on success`() = runBlocking { + stubResponse(isSuccessful = true, body = "203.0.113.5\n") + + val result = repository.fetchUserIpAddress() + + assertEquals("203.0.113.5", result) + } + + @Test + fun `fetchUserIpAddress returns empty string when response unsuccessful`() = runBlocking { + stubResponse(isSuccessful = false, body = "error") + + val result = repository.fetchUserIpAddress() + + assertEquals("", result) + } + + @Test + fun `fetchUserIpAddress returns empty string when body is null`() = runBlocking { + stubResponse(isSuccessful = true, body = null) + + val result = repository.fetchUserIpAddress() + + assertEquals("", result) + } + + @Test + fun `fetchUserIpAddress returns empty string when call throws`() = runBlocking { + val call = mockk() + every { okHttpClient.newCall(any()) } returns call + every { call.execute() } throws IOException("network down") + + val result = repository.fetchUserIpAddress() + + assertEquals("", result) + } + + // ── fetchMoonpaySignedUrl ──────────────────────────────────────────────── + + // fetchMoonpaySignedUrl pipes the backend's signedUrl through android.net.Uri + // (via the toUri()/buildUpon() KTX chain), which isn't mockable on the plain + // android.jar stub used by JVM unit tests — stub it out so the tests can focus + // on the params passed upstream, which is the thing under test here. + private fun stubUriConstruction(returnedUrlString: String) { + mockkStatic(Uri::class) + val mockUri = mockk(relaxed = true) + val mockBuilder = mockk(relaxed = true) + every { Uri.parse(any()) } returns mockUri + every { mockUri.buildUpon() } returns mockBuilder + every { mockBuilder.build() } returns mockUri + every { mockUri.toString() } returns returnedUrlString + } + + @Test + fun `fetchMoonpaySignedUrl includes a freshly fetched ipAddress in the request params`() = runBlocking { + stubUriConstruction("https://buy.moonpay.com/signed") + stubResponse(isSuccessful = true, body = "198.51.100.7") + + val paramsSlot = slot>() + coEvery { + remoteApiSource.getMoonpaySignedUrl(capture(paramsSlot)) + } returns GetMoonpaySignUrlResponse(signedUrl = "https://buy.moonpay.com/signed") + + repository.fetchMoonpaySignedUrl(mapOf("walletAddress" to "LTC_FAKE_ADDRESS")) + + assertEquals("198.51.100.7", paramsSlot.captured["ipAddress"]) + } + + @Test + fun `fetchMoonpaySignedUrl still succeeds with empty ipAddress when ip lookup fails`() = runBlocking { + stubUriConstruction("https://buy.moonpay.com/signed") + val call = mockk() + every { okHttpClient.newCall(any()) } returns call + every { call.execute() } throws IOException("network down") + + val paramsSlot = slot>() + coEvery { + remoteApiSource.getMoonpaySignedUrl(capture(paramsSlot)) + } returns GetMoonpaySignUrlResponse(signedUrl = "https://buy.moonpay.com/signed") + + val result = repository.fetchMoonpaySignedUrl(mapOf("walletAddress" to "LTC_FAKE_ADDRESS")) + + assertEquals("", paramsSlot.captured["ipAddress"]) + assertEquals("https://buy.moonpay.com/signed", result) + } + + @Test + fun `fetchMoonpaySignedUrl does not let a caller-supplied ipAddress override the fresh lookup`() = runBlocking { + stubUriConstruction("https://buy.moonpay.com/signed") + stubResponse(isSuccessful = true, body = "198.51.100.7") + + val paramsSlot = slot>() + coEvery { + remoteApiSource.getMoonpaySignedUrl(capture(paramsSlot)) + } returns GetMoonpaySignUrlResponse(signedUrl = "https://buy.moonpay.com/signed") + + repository.fetchMoonpaySignedUrl(mapOf("walletAddress" to "LTC_FAKE_ADDRESS", "ipAddress" to "stale-value")) + + assertEquals("198.51.100.7", paramsSlot.captured["ipAddress"]) + } +} diff --git a/app/src/test/java/com/brainwallet/tools/database/DatabaseTests.kt b/app/src/test/java/com/brainwallet/tools/database/DatabaseTests.kt deleted file mode 100644 index b787fae3..00000000 --- a/app/src/test/java/com/brainwallet/tools/database/DatabaseTests.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.brainwallet.tools.database - -class DatabaseTests -// TODO: Reopen in Kotlin mocckk -// TODO: BRSQLiteHelper.BRAINWALLET_FIAT_CODES Test -// package com.brainwallet.analytics; -// import androidx.test.ext.junit.runners.AndroidJUnit4; -// import android.util.Log; -// import androidx.test.ext.junit.rules.ActivityScenarioRule; -// -// import com.breadwallet.presenter.activities.intro.IntroActivity; -// import com.breadwallet.tools.util.BRConstants; -// -// import org.junit.After; -// import org.junit.Assert; -// import org.junit.Before; -// import org.junit.Rule; -// import org.junit.Test; -// import org.junit.runner.RunWith; -// -// import java.net.URI; -// -// @Deprecated -// @RunWith(AndroidJUnit4.class) -// public class ConstantsTests { -// public static final String TAG = ConstantsTests.class.getName(); -// @Rule -// public ActivityScenarioRule mActivityRule = new ActivityScenarioRule<>(IntroActivity.class); -// @Before -// public void setUp() { -// Log.e(TAG, "setUp: "); -// } -// -// @After -// public void tearDown() { -// } -// @Test -// public void testLitecoinSymbolConstants() { -// Assert.assertSame(BWConstants.litecoinLowercase,"ł"); -// Assert.assertSame(BWConstants.litecoinUppercase,"Ł"); -// } -// @Test -// public void testAppExternalURLConstants() { -// Assert.assertSame(BWConstants.TWITTER_LINK,"https://twitter.com/Brainwallet_App"); -// Assert.assertSame(BWConstants.INSTAGRAM_LINK,"https://www.instagram.com/brainwalletapp"); -// Assert.assertSame(BWConstants.WEB_LINK,"https://brainwallet.co"); -// Assert.assertSame(BWConstants.TOS_LINK,"https://brainwallet.co/privacy"); -// Assert.assertSame(BWConstants.CUSTOMER_SUPPORT_LINK,"https://support.brainwallet.co/hc/en-us/requests/new"); -// Assert.assertSame(BWConstants.BITREFILL_AFFILIATE_LINK,"https://www.bitrefill.com/"); -// } -// @Test -// public void testFirebaseAnalyticsConstants() { -// Assert.assertSame(BWConstants._20191105_AL,"app_launched"); -// Assert.assertSame(BWConstants._20191105_VSC,"visit_send_controller"); -// Assert.assertSame(BWConstants._20202116_VRC,"visit_receive_controller"); -// Assert.assertSame(BWConstants._20191105_DSL,"did_send_ltc"); -// Assert.assertSame(BWConstants._20191105_DTBT,"did_tap_buy_tab"); -// Assert.assertSame(BWConstants._20200111_RNI,"rate_not_initialized"); -// Assert.assertSame(BWConstants._20200111_FNI,"feeperkb_not_initialized"); -// Assert.assertSame(BWConstants._20200111_TNI,"transaction_not_initialized"); -// Assert.assertSame(BWConstants._20200111_WNI,"wallet_not_initialized"); -// Assert.assertSame(BWConstants._20200111_PNI,"phrase_not_initialized"); -// Assert.assertSame(BWConstants._20200111_UTST,"unable_to_sign_transaction"); -// Assert.assertSame(BWConstants._20200112_ERR,"error"); -// Assert.assertSame(BWConstants._20200112_DSR,"did_start_resync"); -// Assert.assertSame(BWConstants._20200125_DSRR,"did_show_review_request"); -// Assert.assertSame(BWConstants._20201118_DTGS,"did_tap_get_support"); -// Assert.assertSame(BWConstants._20200217_DUWP,"did_unlock_with_pin"); -// Assert.assertSame(BWConstants._20200217_DUWB,"did_unlock_with_biometrics"); -// Assert.assertSame(BWConstants._20201121_SIL,"started_IFPS_lookup"); -// Assert.assertSame(BWConstants._20201121_DRIA,"did_resolve_IPFS_address"); -// Assert.assertSame(BWConstants._20201121_FRIA,"failed_resolve_IPFS_address"); -// Assert.assertSame(BWConstants._20200207_DTHB,"did_tap_header_balance"); -// Assert.assertSame(BWConstants._20210427_HCIEEH,"heartbeat_check_if_event_even_happens"); -// Assert.assertSame(BWConstants._20220822_UTOU,"user_tapped_on_ud"); -// Assert.assertSame(BWConstants._20230131_NENR,"no_error_nominal_response"); -// Assert.assertSame(BWConstants._20230407_DCS,"did_complete_sync"); -// Assert.assertSame(BWConstants._20240123_RAGI,"registered_android_general_interest"); -// Assert.assertSame(BWConstants._20231225_UAP,"user_accepted_push"); -// Assert.assertSame(BWConstants._20240101_US,"user_signup"); -// Assert.assertSame(BWConstants._20241006_DRR,"did_request_rating"); -// Assert.assertSame(BWConstants._20241006_UCR,"user_completed_rating"); -// } -// } diff --git a/app/src/test/java/com/brainwallet/tools/util/UtilsAgentStringTest.kt b/app/src/test/java/com/brainwallet/tools/util/UtilsAgentStringTest.kt new file mode 100644 index 00000000..cb897c10 --- /dev/null +++ b/app/src/test/java/com/brainwallet/tools/util/UtilsAgentStringTest.kt @@ -0,0 +1,145 @@ +package com.brainwallet.tools.util + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertThrows +import org.junit.Test +import java.math.BigInteger +import java.nio.ByteBuffer +import java.nio.charset.StandardCharsets +import java.security.KeyFactory +import java.security.KeyPairGenerator +import java.security.interfaces.RSAPrivateKey +import java.security.interfaces.RSAPublicKey +import java.util.Base64 +import javax.crypto.Cipher + +/** + * Covers the fix for Utils.getEncryptedAgentString()'s public key parsing. + * + * The key provisioned in service-data.json's `agent-base64-pubkey` is a base64-encoded + * OpenSSH "ssh-rsa " line, not base64-encoded PEM. The previous + * implementation stripped whitespace before re-decoding, which merged the "ssh-rsa" prefix + * and the trailing email comment into the base64 payload and made it undecodable + * (surfacing as "ERROR-CANNOT-KEYBYTES-DO-CONVERSION"). + */ +class UtilsAgentStringTest { + + // The actual (public, non-secret) key currently provisioned in + // app/src/main/assets/service-data.json's "agent-base64-pubkey" field. + // Decodes to: "ssh-rsa AAAAB3NzaC1yc2E... kerry@grunt.ltd" + private val realProvisionedAgentPubkey = + "c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFEUUpnWmRqbDh6QWk4QWNObUJQd28y" + + "ZEZDR3pHcWdIK0RPeEpEb09ZRmN6b0pSK3FoR2xPcUoxT1o5UmtEUWVyTHZrMG05czd2RkFuYzlpWDJm" + + "akpReWIzTFlwZ0R5RE85ZjVFcHl3MWRuMkpoMFhJRTF6ZXRVMHdZMDlpNmZWVjhMUFFpa05UUGZyMSt1" + + "b3c2R1NsbGJOYWpidmR5TGkwdVorc2ZkZmJFazlkM2RCTGR4STlMb1hoanE3ZmZuZGx5MmlTcUNxUEND" + + "ZU9BY3poSUY0OGlSdEJsRjNtNzdFQzVnSDVuVHdzbW1hd1REV0VPSUZiNzZOQmJKR3RUUWpZOStxeDRV" + + "dnJ3dmdZcXpzMW9PalNhMFd6QWtSWVV2MzUzSG1la3lSU3doeEMybm14QVZGRU5uSERaWE1oREllVHp4" + + "VWZ3ejllSXd0SDhHeENaMEUyb0oga2VycnlAZ3J1bnQubHRk" + + @Test + fun `parseOpenSshRsaPublicKey decodes the real provisioned agent pubkey`() { + val keySpec = Utils.parseOpenSshRsaPublicKey(realProvisionedAgentPubkey) + + assertEquals(BigInteger.valueOf(65537), keySpec.publicExponent) + assertEquals(2048, keySpec.modulus.bitLength()) + } + + @Test + fun `parseOpenSshRsaPublicKey produces a key KeyFactory can build`() { + val keySpec = Utils.parseOpenSshRsaPublicKey(realProvisionedAgentPubkey) + + val publicKey = KeyFactory.getInstance("RSA").generatePublic(keySpec) + + assertEquals("RSA", publicKey.algorithm) + } + + @Test + fun `full round trip - generated keypair encrypts and decrypts through the new parsing path`() { + val keyPair = KeyPairGenerator.getInstance("RSA").apply { initialize(2048) }.genKeyPair() + val rsaPublicKey = keyPair.public as RSAPublicKey + val agentPubkeyLine = buildOpenSshRsaLine(rsaPublicKey.publicExponent, rsaPublicKey.modulus) + val base64EncodedAgentPubkey = Base64.getEncoder().encodeToString( + agentPubkeyLine.toByteArray(StandardCharsets.UTF_8) + ) + + val keySpec = Utils.parseOpenSshRsaPublicKey(base64EncodedAgentPubkey) + val publicKey = KeyFactory.getInstance("RSA").generatePublic(keySpec) + + val encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") + encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey) + val plaintext = "brainwallet-android,1.0,manufacturer-device-model,some-uuid" + val encrypted = encryptCipher.doFinal(plaintext.toByteArray()) + + val decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") + decryptCipher.init(Cipher.DECRYPT_MODE, keyPair.private as RSAPrivateKey) + val decrypted = String(decryptCipher.doFinal(encrypted)) + + assertEquals(plaintext, decrypted) + } + + @Test + fun `parseSshRsaPublicKeyBlob rejects a non-RSA SSH key type`() { + val blob = buildSshWireFormat( + keyType = "ssh-ed25519", + fields = listOf(ByteArray(32)) + ) + + assertThrows(IllegalArgumentException::class.java) { + Utils.parseSshRsaPublicKeyBlob(blob) + } + } + + @Test + fun `parseOpenSshRsaPublicKey throws when the OpenSSH line has no key blob field`() { + val lineWithoutKeyBlob = "ssh-rsa" + val base64Encoded = Base64.getEncoder().encodeToString( + lineWithoutKeyBlob.toByteArray(StandardCharsets.UTF_8) + ) + + assertThrows(IllegalArgumentException::class.java) { + Utils.parseOpenSshRsaPublicKey(base64Encoded) + } + } + + @Test + fun `parseOpenSshRsaPublicKey throws on garbage input instead of silently misparsing`() { + val notBase64AtAll = "%%%not-base64%%%" + + assertThrows(IllegalArgumentException::class.java) { + Utils.parseOpenSshRsaPublicKey(notBase64AtAll) + } + } + + @Test + fun `regression - the old PEM-header-stripping bug is not reproduced by the fix`() { + // This is exactly the shape of value that broke the previous implementation: + // an OpenSSH line whose fields, once whitespace is stripped, are no longer valid + // base64 (the "ssh-rsa" prefix and "kerry@grunt.ltd" comment corrupt the payload). + // The fix must not fall into that trap: it correctly isolates the key blob field + // instead of concatenating the whole line. + val keySpec = Utils.parseOpenSshRsaPublicKey(realProvisionedAgentPubkey) + assertEquals(BigInteger.valueOf(65537), keySpec.publicExponent) + } + + private fun buildOpenSshRsaLine(exponent: BigInteger, modulus: BigInteger): String { + val blob = buildSshWireFormat( + keyType = "ssh-rsa", + fields = listOf(exponent.toByteArray(), modulus.toByteArray()) + ) + val blobBase64 = Base64.getEncoder().encodeToString(blob) + return "ssh-rsa $blobBase64 test@brainwallet" + } + + private fun buildSshWireFormat(keyType: String, fields: List): ByteArray { + val typeBytes = keyType.toByteArray(StandardCharsets.UTF_8) + val totalSize = 4 + typeBytes.size + fields.sumOf { 4 + it.size } + val buffer = ByteBuffer.allocate(totalSize) + buffer.putInt(typeBytes.size) + buffer.put(typeBytes) + for (field in fields) { + buffer.putInt(field.size) + buffer.put(field) + } + return buffer.array() + } +} diff --git a/app/src/test/java/com/brainwallet/wallet/BRPeerManagerTest.kt b/app/src/test/java/com/brainwallet/wallet/BRPeerManagerTest.kt new file mode 100644 index 00000000..200b7249 --- /dev/null +++ b/app/src/test/java/com/brainwallet/wallet/BRPeerManagerTest.kt @@ -0,0 +1,79 @@ +package com.brainwallet.wallet + +import com.google.firebase.crashlytics.FirebaseCrashlytics +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.slot +import io.mockk.unmockkStatic +import io.mockk.verify +import org.junit.After +import org.junit.Before +import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +/** + * Covers [BRPeerManager.onIntegrityWarning], the Java-side half of the native integrity-warning + * path added alongside the NULL-`lastBlock` guards in core's `BRPeerManager.c` + * (`BRPeerManagerSetIntegrityWarningCallback`). The native guard itself lives in the `core` + * submodule and isn't covered by this JVM suite. + */ +class BRPeerManagerTest { + + private val mockCrashlytics: FirebaseCrashlytics = mockk(relaxed = true) + + @Before + fun setUp() { + mockkStatic(FirebaseCrashlytics::class) + every { FirebaseCrashlytics.getInstance() } returns mockCrashlytics + } + + @After + fun tearDown() { + unmockkStatic(FirebaseCrashlytics::class) + } + + @Test + fun `onIntegrityWarning reports a RuntimeException to Crashlytics`() { + BRPeerManager.onIntegrityWarning("BRPeerManagerLastBlockHeight: lastBlock is NULL") + + val captured = slot() + verify(exactly = 1) { mockCrashlytics.recordException(capture(captured)) } + assertTrue(captured.captured is RuntimeException) + } + + @Test + fun `onIntegrityWarning includes the native warning text verbatim in the recorded exception message`() { + val warning = "BRPeerManagerRescan: checkpoint block missing from block set, lastBlock left unchanged" + + BRPeerManager.onIntegrityWarning(warning) + + val captured = slot() + verify { mockCrashlytics.recordException(capture(captured)) } + assertEquals("BRPeerManager native integrity warning: $warning", captured.captured.message) + } + + @Test + fun `onIntegrityWarning records once per call for each distinct native warning site`() { + // Mirrors the four call sites added in core's BRPeerManager.c + listOf( + "BRPeerManagerRescan: checkpoint block missing from block set, lastBlock left unchanged", + "BRPeerManagerEstimatedBlockHeight: lastBlock is NULL", + "BRPeerManagerLastBlockHeight: lastBlock is NULL", + "BRPeerManagerLastBlockTimestamp: lastBlock is NULL", + ).forEach { BRPeerManager.onIntegrityWarning(it) } + + verify(exactly = 4) { mockCrashlytics.recordException(any()) } + } + + @Test + fun `onIntegrityWarning does not throw when warning is null`() { + // Defensive: the native side always passes a short static string, but the JNI bridge + // (PeerManager.c's integrityWarning()) technically permits a null jstring — this must + // never crash the calling native thread. + BRPeerManager.onIntegrityWarning(null) + + verify(exactly = 1) { mockCrashlytics.recordException(any()) } + } +} diff --git a/app/src/test/kotlin/com/brainwallet/consants/BWConstantsTest.kt b/app/src/test/kotlin/com/brainwallet/consants/BWConstantsTest.kt index 8353f12d..ed5f5075 100644 --- a/app/src/test/kotlin/com/brainwallet/consants/BWConstantsTest.kt +++ b/app/src/test/kotlin/com/brainwallet/consants/BWConstantsTest.kt @@ -289,7 +289,6 @@ class BWConstantsTest { @Test fun `all analytics event keys are non-empty`() { listOf( - BWConstants._20191105_AL, BWConstants._20191105_VSC, BWConstants._20202116_VRC, BWConstants._20191105_DSL, @@ -301,11 +300,7 @@ class BWConstantsTest { BWConstants._20200112_DSR, BWConstants._20201118_DTGS, BWConstants._20200217_DU, - BWConstants._20250303_DSTU, BWConstants._20250517_WCINFO, - BWConstants._20241006_DRR, - BWConstants._20241006_UCR, - BWConstants._HOME_OPEN, ).forEach { key -> assertTrue("Analytics key should not be empty", key.isNotEmpty()) } @@ -314,7 +309,6 @@ class BWConstantsTest { @Test fun `all analytics event keys are distinct`() { val keys = listOf( - BWConstants._20191105_AL, BWConstants._20191105_VSC, BWConstants._20202116_VRC, BWConstants._20191105_DSL, @@ -326,11 +320,7 @@ class BWConstantsTest { BWConstants._20200112_DSR, BWConstants._20201118_DTGS, BWConstants._20200217_DU, - BWConstants._20250303_DSTU, BWConstants._20250517_WCINFO, - BWConstants._20241006_DRR, - BWConstants._20241006_UCR, - BWConstants._HOME_OPEN, ) assertEquals(keys.size, keys.toSet().size) } diff --git a/app/src/test/kotlin/com/brainwallet/tools/constants/BWConstantTests.kt b/app/src/test/kotlin/com/brainwallet/tools/constants/BWConstantTests.kt index 6bdadc45..e3d9e59d 100644 --- a/app/src/test/kotlin/com/brainwallet/tools/constants/BWConstantTests.kt +++ b/app/src/test/kotlin/com/brainwallet/tools/constants/BWConstantTests.kt @@ -157,7 +157,6 @@ class BWConstantsTests { @Test fun `validate active Firebase analytics event constants`() { - assertSame(BWConstants._20191105_AL, "app_launched") assertSame(BWConstants._20191105_VSC, "visit_send_controller") assertSame(BWConstants._20202116_VRC, "visit_receive_controller") assertSame(BWConstants._20191105_DSL, "did_send_ltc") @@ -173,10 +172,6 @@ class BWConstantsTests { @Test fun `validate recent Firebase analytics event constants`() { - assertSame(BWConstants._20241006_DRR, "did_request_rating") - assertSame(BWConstants._20241006_UCR, "user_completed_rating") - assertSame(BWConstants._HOME_OPEN, "home_open") - assertSame(BWConstants._20250303_DSTU, "did_skip_top_up") assertSame(BWConstants._20250517_WCINFO, "wallet_callback_info") } diff --git a/app/src/test/kotlin/com/brainwallet/tools/manager/AnalyticsEventAuditTest.kt b/app/src/test/kotlin/com/brainwallet/tools/manager/AnalyticsEventAuditTest.kt new file mode 100644 index 00000000..a8b9b8e0 --- /dev/null +++ b/app/src/test/kotlin/com/brainwallet/tools/manager/AnalyticsEventAuditTest.kt @@ -0,0 +1,120 @@ +package com.brainwallet.tools.manager + +import org.junit.Test +import java.io.File + +/** + * Informational test that scans app/src/main for every `AnalyticsManager.log*` call site + * (logCustomEvent / logCustomEventWithParams / logCustomAdHocEvent) and reports: + * - The total number of call sites + * - Each placement (file:line, method, event name/expression) + * - A count of call sites grouped by resolved event name + * - A count of call sites grouped by method + * + * This test NEVER fails on the audit contents — it is purely diagnostic, so adding, removing, + * or renaming an analytics event elsewhere in the app does not break CI. It only fails if the + * scan itself can't run (e.g. the source tree moved and no call sites were found at all), which + * would mean the audit is broken, not that analytics events changed. + * + * Usage: + * ./gradlew :app:testDebugUnitTest --tests "*.AnalyticsEventAuditTest" + */ +class AnalyticsEventAuditTest { + + companion object { + private val SRC_MAIN_JAVA_DIR: File by lazy { + val candidates = listOf( + File("src/main/java"), + File("app/src/main/java"), + ) + candidates.firstOrNull { it.isDirectory } + ?: error( + "Cannot locate app/src/main/java. " + + "Searched: ${candidates.map { it.absolutePath }}" + ) + } + + private val CALL_SITE_PATTERN = Regex( + """AnalyticsManager\.(logCustomEvent|logCustomEventWithParams|logCustomAdHocEvent)\s*\(\s*([^,)]+)""" + ) + } + + private data class EventPlacement( + val displayPath: String, + val line: Int, + val method: String, + val eventExpression: String, + ) + + @Test + fun `print AnalyticsManager log call site audit`() { + val placements = scanForCallSites() + check(placements.isNotEmpty()) { + "No AnalyticsManager.log* call sites found under ${SRC_MAIN_JAVA_DIR.absolutePath} " + + "— the audit scan is likely broken (source layout changed?), not that analytics calls vanished." + } + + println(buildReport(placements)) + } + + private fun scanForCallSites(): List { + val placements = mutableListOf() + + SRC_MAIN_JAVA_DIR.walkTopDown() + .filter { it.isFile && (it.extension == "kt" || it.extension == "java") } + .forEach { file -> + val displayPath = "app/src/main/java/" + + file.relativeTo(SRC_MAIN_JAVA_DIR).path.replace(File.separatorChar, '/') + + file.readLines().forEachIndexed { index, rawLine -> + val trimmed = rawLine.trimStart() + if (trimmed.startsWith("//") || trimmed.startsWith("*")) return@forEachIndexed + + val match = CALL_SITE_PATTERN.find(rawLine) ?: return@forEachIndexed + val (method, eventExpression) = match.destructured + placements += EventPlacement( + displayPath = displayPath, + line = index + 1, + method = method, + eventExpression = eventExpression.trim(), + ) + } + } + + return placements + } + + private fun buildReport(placements: List): String = buildString { + val divider = "=".repeat(100) + + appendLine(divider) + appendLine("AnalyticsManager.log* call-site audit — ${placements.size} total placements") + appendLine(divider) + placements + .sortedWith(compareBy({ it.displayPath }, { it.line })) + .forEach { + appendLine("${it.displayPath}:${it.line} [${it.method}] ${it.eventExpression}") + } + + appendLine() + appendLine("-- By event name/expression " + "-".repeat(70)) + placements.groupBy { it.eventExpression } + .toSortedMap() + .forEach { (event, sites) -> + appendLine(" ${sites.size.toString().padStart(2)}x $event") + sites.forEach { appendLine(" ${it.displayPath}:${it.line}") } + } + + appendLine() + appendLine("-- By method " + "-".repeat(85)) + placements.groupBy { it.method } + .toSortedMap() + .forEach { (method, sites) -> + appendLine(" ${sites.size.toString().padStart(2)}x $method") + } + + appendLine() + appendLine("Distinct event names/expressions: ${placements.map { it.eventExpression }.distinct().size}") + appendLine(divider) + } +} diff --git a/app/src/test/kotlin/com/brainwallet/ui/bentosections/buyreceive/ReceiveDialogViewModelTest.kt b/app/src/test/kotlin/com/brainwallet/ui/bentosections/buyreceive/ReceiveDialogViewModelTest.kt index aaeeff5d..c03891dc 100644 --- a/app/src/test/kotlin/com/brainwallet/ui/bentosections/buyreceive/ReceiveDialogViewModelTest.kt +++ b/app/src/test/kotlin/com/brainwallet/ui/bentosections/buyreceive/ReceiveDialogViewModelTest.kt @@ -13,9 +13,11 @@ import com.brainwallet.ui.bentosections.buyreceivebento.receive.ReceiveDialogVie import com.brainwallet.ui.bentosections.buyreceivebento.receive.ReceiveDialogEvent import com.brainwallet.ui.bentosections.buyreceivebento.receive.getQuickFiatAmountOptions import io.mockk.coEvery +import io.mockk.coVerify import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic +import io.mockk.slot import io.mockk.unmockkAll import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -43,6 +45,7 @@ class ReceiveDialogViewModelTest { private lateinit var viewModel: ReceiveDialogViewModel private val settingsFlow = MutableStateFlow(AppSetting()) + private val currentSettingsFlow = MutableStateFlow(AppSetting()) private val fakeCurrencyEntity = CurrencyEntity(code = "USD", name = "US Dollar", rate = 1.0f, symbol = "USD") private val fakeFiatCurrencies = listOf(fakeCurrencyEntity) @@ -68,9 +71,11 @@ class ReceiveDialogViewModelTest { every { BRSharedPrefs.getReceiveAddress(any()) } returns "LTC_FAKE_ADDRESS" every { QRUtils.generateQR(any(), any()) } returns null every { settingRepository.settings } returns settingsFlow + every { settingRepository.currentSettings } returns currentSettingsFlow coEvery { ltcRepository.fetchLimits(any()) } returns mockk(relaxed = true) coEvery { ltcRepository.fetchBuyQuote(any()) } returns mockk(relaxed = true) + coEvery { ltcRepository.fetchMoonpaySignedUrl(any()) } returns "https://buy.moonpay.com/signed" viewModel = ReceiveDialogViewModel( settingRepository = settingRepository, @@ -176,6 +181,44 @@ class ReceiveDialogViewModelTest { assertEquals(0, viewModel.state.value.selectedQuickFiatAmountOptionIndex) } + // ── OnMoonpayButtonClick ─────────────────────────────────────────────── + + @Test + fun `OnMoonpayButtonClick sets moonpayBuySignedUrl from ltcRepository`() = runTest { + viewModel.onEvent(ReceiveDialogEvent.OnLoad(context)) + advanceUntilIdle() + + viewModel.onEvent(ReceiveDialogEvent.OnMoonpayButtonClick) + advanceUntilIdle() + + assertEquals("https://buy.moonpay.com/signed", viewModel.state.value.moonpayBuySignedUrl) + } + + @Test + fun `OnMoonpayButtonClick includes walletAddress from state`() = runTest { + val paramsSlot = slot>() + coEvery { ltcRepository.fetchMoonpaySignedUrl(capture(paramsSlot)) } returns "https://buy.moonpay.com/signed" + + viewModel.onEvent(ReceiveDialogEvent.OnLoad(context)) + advanceUntilIdle() + + viewModel.onEvent(ReceiveDialogEvent.OnMoonpayButtonClick) + advanceUntilIdle() + + assertEquals("LTC_FAKE_ADDRESS", paramsSlot.captured["walletAddress"]) + } + + @Test + fun `OnMoonpayButtonClick calls fetchMoonpaySignedUrl exactly once`() = runTest { + viewModel.onEvent(ReceiveDialogEvent.OnLoad(context)) + advanceUntilIdle() + + viewModel.onEvent(ReceiveDialogEvent.OnMoonpayButtonClick) + advanceUntilIdle() + + coVerify(exactly = 1) { ltcRepository.fetchMoonpaySignedUrl(any()) } + } + // ── OnSignedUrlClear ─────────────────────────────────────────────────── @Test diff --git a/bw-gdlib b/bw-gdlib index db543da2..12649408 160000 --- a/bw-gdlib +++ b/bw-gdlib @@ -1 +1 @@ -Subproject commit db543da26e36ce1955fa7c596fe8b85099afe629 +Subproject commit 126494081fd334bc83c7dd2a09ba8df7df7c6ba4