From 0c3b06d3c1dd595fcdde1cb42720643a404c8062 Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Sun, 31 May 2026 12:29:23 +0100 Subject: [PATCH] feat Add gradient-only card design and icon style picker (#3054) * feat Add gradient-only card design and icon style picker * refactor: Migrate card icon style to index-based storage * feat: Add new card icons/styles for icon panel * feat: add generic cake card icon * Update coin icons and add opacity * Remove vector icon files * Remove vector icon files * add xmr-og.webp * feat: add animated switcher to icon style panel * Enhance icson style preview fix special gradient bug on plain style card * Fix card styles ignoring special gradient text color combination * Improve icon mgmt for card design handling, other fixes also based on review too * fix: Add bounds check to icon style index * fix: monero classic icon not displaying --------- Co-authored-by: tuxsudo --- assets/images/xmr-og.webp | Bin 0 -> 2696 bytes cw_core/lib/balance_card_style_settings.dart | 32 +- cw_core/lib/card_design.dart | 175 ++++++- cw_core/lib/db/sqlite.dart | 149 +++--- lib/new-ui/pages/account_customizer.dart | 8 +- lib/new-ui/pages/card_customizer.dart | 459 +++++++++++------- .../card_customizer/card_customizer_bloc.dart | 93 +++- .../card_customizer_event.dart | 6 + .../card_customizer_state.dart | 71 ++- .../coins_page/cards/balance_card.dart | 35 +- lib/src/widgets/cake_image_widget.dart | 1 + ...ero_account_edit_or_create_view_model.dart | 8 +- pubspec_base.yaml | 5 + res/pictures/balance_card_icons/bnb.svg | 4 +- .../balance_card_icons/cake-card-icon.svg | 13 + .../card_icons/chain_icons/arbitrum.svg | 69 +++ .../card_icons/chain_icons/base_icon.svg | 35 ++ .../card_icons/chain_icons/bitcoin-cash.svg | 46 ++ .../card_icons/chain_icons/bitcoin.svg | 50 ++ res/pictures/card_icons/chain_icons/bnb.svg | 39 ++ .../card_icons/chain_icons/decred.svg | 69 +++ .../card_icons/chain_icons/dogecoin.svg | 50 ++ .../card_icons/chain_icons/ethereum.svg | 74 +++ .../card_icons/chain_icons/lightning.svg | 47 ++ .../card_icons/chain_icons/litecoin.svg | 40 ++ .../card_icons/chain_icons/monero.svg | 56 +++ res/pictures/card_icons/chain_icons/nano.svg | 45 ++ .../card_icons/chain_icons/polygon.svg | 45 ++ .../card_icons/chain_icons/solana.svg | 63 +++ res/pictures/card_icons/chain_icons/tron.svg | 45 ++ res/pictures/card_icons/chain_icons/zano.svg | 76 +++ res/pictures/card_icons/chain_icons/zcash.svg | 71 +++ res/pictures/card_icons/og_icons/arb-og.svg | 10 + res/pictures/card_icons/og_icons/base-og.svg | 4 + res/pictures/card_icons/og_icons/bch-og.svg | 11 + res/pictures/card_icons/og_icons/bnb-og.svg | 11 + res/pictures/card_icons/og_icons/btc-og.svg | 4 + res/pictures/card_icons/og_icons/dcr-og.svg | 7 + res/pictures/card_icons/og_icons/doge-og.svg | 132 +++++ res/pictures/card_icons/og_icons/eth-og.svg | 8 + res/pictures/card_icons/og_icons/ln-og.svg | 16 + res/pictures/card_icons/og_icons/ltc-og.svg | 11 + res/pictures/card_icons/og_icons/pol-og.svg | 11 + res/pictures/card_icons/og_icons/sol-og.svg | 20 + res/pictures/card_icons/og_icons/tron-og.svg | 13 + res/pictures/card_icons/og_icons/xmr-og.svg | 5 + res/pictures/card_icons/og_icons/xno-og.svg | 12 + res/pictures/card_icons/og_icons/zano-og.svg | 42 ++ res/pictures/card_icons/og_icons/zec-og.svg | 4 + .../card_icons/outline_icons/BTC-outline.svg | 4 + .../card_icons/outline_icons/arb-outline.svg | 3 + .../card_icons/outline_icons/base-outline.svg | 10 + .../card_icons/outline_icons/bch-outline.svg | 3 + .../card_icons/outline_icons/bnb-outline.svg | 3 + .../card_icons/outline_icons/dcr-outline.svg | 3 + .../card_icons/outline_icons/doge-outline.svg | 3 + .../card_icons/outline_icons/eth-outline.svg | 3 + .../card_icons/outline_icons/ln-outline.svg | 3 + .../card_icons/outline_icons/ltc-outline.svg | 3 + .../card_icons/outline_icons/pol-outline.svg | 3 + .../card_icons/outline_icons/sol-outline.svg | 4 + .../card_icons/outline_icons/trx-outline.svg | 3 + .../card_icons/outline_icons/xmr-outline.svg | 3 + .../card_icons/outline_icons/xno-outline.svg | 3 + .../card_icons/outline_icons/zano-outline.svg | 3 + .../card_icons/outline_icons/zec-outline.svg | 10 + .../card_icons/symbol_icons/arb-symbol.svg | 3 + .../card_icons/symbol_icons/base-symbol.svg | 3 + .../card_icons/symbol_icons/bch-symbol.svg | 3 + .../card_icons/symbol_icons/bnb-symbol.svg | 3 + .../card_icons/symbol_icons/btc-symbol.svg | 3 + .../card_icons/symbol_icons/dcr-symbol.svg | 3 + .../card_icons/symbol_icons/doge-symbol.svg | 3 + .../card_icons/symbol_icons/eth-symbol.svg | 3 + .../card_icons/symbol_icons/ln-symbol.svg | 3 + .../card_icons/symbol_icons/ltc-symbol.svg | 3 + .../card_icons/symbol_icons/pol-symbol.svg | 3 + .../card_icons/symbol_icons/sol-symbol.svg | 5 + .../card_icons/symbol_icons/trx-symbol.svg | 3 + .../card_icons/symbol_icons/xmr-symbol.svg | 3 + .../card_icons/symbol_icons/xno-symbol.svg | 3 + .../card_icons/symbol_icons/zano-symbol.svg | 3 + .../card_icons/symbol_icons/zec-symbol.svg | 3 + res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 1 + res/values/strings_fa.arb | 1 + res/values/strings_fr.arb | 1 + res/values/strings_gn.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_hy.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 1 + res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 1 + res/values/strings_pt.arb | 1 + res/values/strings_pt_BR.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_vi.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + res/values/strings_zh_tw.arb | 1 + 115 files changed, 2124 insertions(+), 328 deletions(-) create mode 100644 assets/images/xmr-og.webp create mode 100644 res/pictures/balance_card_icons/cake-card-icon.svg create mode 100644 res/pictures/card_icons/chain_icons/arbitrum.svg create mode 100644 res/pictures/card_icons/chain_icons/base_icon.svg create mode 100644 res/pictures/card_icons/chain_icons/bitcoin-cash.svg create mode 100644 res/pictures/card_icons/chain_icons/bitcoin.svg create mode 100644 res/pictures/card_icons/chain_icons/bnb.svg create mode 100644 res/pictures/card_icons/chain_icons/decred.svg create mode 100644 res/pictures/card_icons/chain_icons/dogecoin.svg create mode 100644 res/pictures/card_icons/chain_icons/ethereum.svg create mode 100644 res/pictures/card_icons/chain_icons/lightning.svg create mode 100644 res/pictures/card_icons/chain_icons/litecoin.svg create mode 100644 res/pictures/card_icons/chain_icons/monero.svg create mode 100644 res/pictures/card_icons/chain_icons/nano.svg create mode 100644 res/pictures/card_icons/chain_icons/polygon.svg create mode 100644 res/pictures/card_icons/chain_icons/solana.svg create mode 100644 res/pictures/card_icons/chain_icons/tron.svg create mode 100644 res/pictures/card_icons/chain_icons/zano.svg create mode 100644 res/pictures/card_icons/chain_icons/zcash.svg create mode 100644 res/pictures/card_icons/og_icons/arb-og.svg create mode 100644 res/pictures/card_icons/og_icons/base-og.svg create mode 100644 res/pictures/card_icons/og_icons/bch-og.svg create mode 100644 res/pictures/card_icons/og_icons/bnb-og.svg create mode 100644 res/pictures/card_icons/og_icons/btc-og.svg create mode 100644 res/pictures/card_icons/og_icons/dcr-og.svg create mode 100644 res/pictures/card_icons/og_icons/doge-og.svg create mode 100644 res/pictures/card_icons/og_icons/eth-og.svg create mode 100644 res/pictures/card_icons/og_icons/ln-og.svg create mode 100644 res/pictures/card_icons/og_icons/ltc-og.svg create mode 100644 res/pictures/card_icons/og_icons/pol-og.svg create mode 100644 res/pictures/card_icons/og_icons/sol-og.svg create mode 100644 res/pictures/card_icons/og_icons/tron-og.svg create mode 100644 res/pictures/card_icons/og_icons/xmr-og.svg create mode 100644 res/pictures/card_icons/og_icons/xno-og.svg create mode 100644 res/pictures/card_icons/og_icons/zano-og.svg create mode 100644 res/pictures/card_icons/og_icons/zec-og.svg create mode 100644 res/pictures/card_icons/outline_icons/BTC-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/arb-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/base-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/bch-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/bnb-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/dcr-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/doge-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/eth-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/ln-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/ltc-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/pol-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/sol-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/trx-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/xmr-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/xno-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/zano-outline.svg create mode 100644 res/pictures/card_icons/outline_icons/zec-outline.svg create mode 100644 res/pictures/card_icons/symbol_icons/arb-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/base-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/bch-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/bnb-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/btc-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/dcr-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/doge-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/eth-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/ln-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/ltc-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/pol-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/sol-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/trx-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/xmr-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/xno-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/zano-symbol.svg create mode 100644 res/pictures/card_icons/symbol_icons/zec-symbol.svg diff --git a/assets/images/xmr-og.webp b/assets/images/xmr-og.webp new file mode 100644 index 0000000000000000000000000000000000000000..94eda52111ab414864b7815f45e820bed45652d9 GIT binary patch literal 2696 zcmV;33U~EVNk&G13IG6CMM6+kP&iC<3IG5v`9MAp_v0Y8ZB^Ole60ZeYe4{ahkK9` zjw4BOlMPPnCuwE-PpM%p}tm7Ss z;@St!_;~ag{CIl3DBgL$YgsDaBl!m*6(oWDZrg(@0`Wg>QYPMs=v0};Pq}&wIe_60? zR|&JvIpGpR>{A11`@gG8Fa7YATkm}Cp8NXukH?Pd9I#2pJ{PNlLsN?O;tGj&)73f9;DSA&K*o~oCgvOMul5@ zMtPu8KKi_ykN4-{)AA(HYEZA8HvZmk1$!l;9nKm)t(%}ggW5@RXTGXXPwk{iO;N7h zQYq7y%C+;VC#VN}#{t}KIKqdovBlSeVhz5inIAMkxkhWXlzGsvQt45Hph=0vK?*yk z$3c}I4>o$fb#5=yJ8&#if$m*$o;59XPWgj}g4#K3rgXuYN$u~&qt7aNHb<#x`G;v; zEV^J+!8q)3o)?$d=R zm1_knMwgu}6U5TnCqtD8&qwcoh zhG8f4ClGR(SP=REz7VX~Gx>z_F$Q(Wz>a;(t|#bY$+fKXZ9(6EKhgt_svL2Oe7TT<+zK$=hi7f)R_)n5g`~1t}$@9WQq_KVsvQ) zWtj*@iiaWhu}lziLQ$3mF$O>Q3iPi(k)S96Q-yP-r9!`ZzRuI4m^71RMzK$PNP7WxxUm#5!tAu#;9W zK0U#hI)aqO7Y7<(12S zW?{$3B!L4xu#aSC0xv0o2YO(R-4Svk8e$%et;u`44N?{jGohUaXd`0M^eDJqV39Ft zO~KPO79q>U?ArX| zZ%pmn=A-{ZnIp|P7o|L}$hrfkB_j|ZYjoTL&;)5e<{FR|k7=`$N(cLIb7+8CIy^g( zhivaySu&2oqU@PiE?i9eL|`A33IycZp?^$+s82r(3t7{DL7v4y@Rq3QxMxMv2pE^% zQ0!R9T=}ewuJ6hqVR+5gR5eW_Vr&?xZ=pfP$WT&zj|L&9re_yUzWW^}UKKE`#?yiB zUhn2K$dp29Kf>~fg}7!x#<)j0clt5DK*DRnwu=lUW%NIg9ao%(M+twlJ_Ctj|kg+J>o?ptQsIf4M0QP9Xr8n<#8ef1j_C>{wVb+^jOb zMUu!)WMjFAfx6&Z8-H`C6lrWM6*;iq1?{)|I-Bo*_d~*fr6n>ZZOY7V2v+HL zv*ob0M9sca8GRF24tejSM*+n_zLQfR@APOOWoQh+cngd{fq%EO!j zh*1%sC;BgY#GC<)QPHq-e@tP;0LX|C0RIQ83I5`PKT?(x05c{pBk9RB-;Akz z@)Hn!+zy;AYl3Ea0@0_^dEW#hJAk$c1)xu?zBi`pf;>o@2a2$6iW$699;oqom5p~~ zF=yxH3+7<39ZLQ0KbbJ4fiv77ZZ!rnZ~BZ9bwhTP4=E_J|OoBJ(=tr z09|H#l*3`haI_Jf@t;c+ zBDTnwna+%}3$ooZwy3Qk*vd`3Fhj^qD}?Y?cmrhH%4kc>^fZcY7E(JeTk={9(Sm?F zM%j%iIz+(U)_g<3Ru?zow>BF`HlmN)YzW!1um!U)-%@RQE^Ve~(N6Eyv-6rlx@fDZ zzq+T7KSV%NWaw!^D^veMCs?P zNA%hO{u1}_UYBX#{;JWLT?;b)9rq;EHFp1uP-bs=r7wbY^-bBAGq*e%u12(e<-GR_ zAb*c3^6gV?q5!j{SDp($#tX?9M6{Z4;$q{UQA&qm>v-9>Bf1rYoPOs186>4^AvNYZ znfy~sfnxHpQ)l>Zl-1RxFJ`BGzAeok#Vr+okWY+P0@Eq4CWW{g8Qi+~D#7nL663G+ zU+UWmHdD?5EcxoxNHCj0N(newQb<{dZH~B1*YQuS}&IzZ( zKDe>{*T}5jIBkkBirgAI%zqq5cFml1{eLry3RDFb-R23uj6?G7sJF6*`SWQvQIkf) zoldwgx*SDanr$5QZ0?)#HLCZ}j9#Bk84jaXU9GkAlW|n6mB1S--%&m;!nLShv%{sv z+tT517M-B0ke67_$`QqZ0b6C2LyFZ>cjd#^*kW}S-K0@XzLY%qY3BQb|i=XTa` z%8sxZMK|ia4rD!l&ggOB;Vid3)|*juudY;u`2CJhRR7v_wni5VvA=MkI2_HQ>vd(d zDbQozI$FhDf9T5jWL^Zsv6uh$kMXXTG`lidO*U;&Tz`Ew%xpF*=9f2@R_9}7f2$(@ Cs3TGU literal 0 HcmV?d00001 diff --git a/cw_core/lib/balance_card_style_settings.dart b/cw_core/lib/balance_card_style_settings.dart index 6412f0d77..feed5b233 100644 --- a/cw_core/lib/balance_card_style_settings.dart +++ b/cw_core/lib/balance_card_style_settings.dart @@ -8,6 +8,8 @@ class BalanceCardStyleSettings { final int gradientIndex; final bool useSpecialDesign; final String backgroundImagePath; + final int iconStyleIndex; + final bool isGradientOnly; final int cardOrder; BalanceCardStyleSettings( @@ -16,6 +18,8 @@ class BalanceCardStyleSettings { required this.gradientIndex, required this.useSpecialDesign, required this.backgroundImagePath, + this.iconStyleIndex = 0, + this.isGradientOnly = false, required this.cardOrder}); static const tableName = "BalanceCardStyleSettings"; @@ -27,6 +31,8 @@ class BalanceCardStyleSettings { "gradientIndex": gradientIndex, "useSpecialDesign": useSpecialDesign ? 1 : 0, "backgroundImagePath": backgroundImagePath, + "iconStyleIndex": iconStyleIndex, + "isGradientOnly": isGradientOnly ? 1 : 0, "cardOrder": cardOrder, }; return ret; @@ -39,19 +45,35 @@ class BalanceCardStyleSettings { gradientIndex: json["gradientIndex"] as int, useSpecialDesign: json["useSpecialDesign"] == 1, backgroundImagePath: json["backgroundImagePath"] as String? ?? "", + iconStyleIndex: json["iconStyleIndex"] as int? ?? 0, + isGradientOnly: json["isGradientOnly"] == 1, cardOrder: json["cardOrder"] as int? ?? -1, ); } - static BalanceCardStyleSettings fromCardDesign( - int walletInfoId, int accountIndex, int cardOrder, CardDesign design) { + static BalanceCardStyleSettings fromCardDesign({ + required int walletInfoId, + required int accountIndex, + required int cardOrder, + required CardDesign design, + int iconStyleIndex = 0, + int? gradientIndexOverride, + }) { + final int gradientIndex = gradientIndexOverride ?? + CardDesign.allGradients.indexOf(design.gradient); return BalanceCardStyleSettings( walletInfoId: walletInfoId, accountIndex: accountIndex, - gradientIndex: CardDesign.allGradients.indexOf(design.gradient), - useSpecialDesign: design.backgroundType == CardDesignBackgroundTypes.svgFull, + gradientIndex: gradientIndex, + useSpecialDesign: + design.backgroundType == CardDesignBackgroundTypes.svgFull, backgroundImagePath: - design.backgroundType == CardDesignBackgroundTypes.image ? design.imagePath : "", + design.backgroundType == CardDesignBackgroundTypes.image + ? design.imagePath + : "", + iconStyleIndex: iconStyleIndex, + isGradientOnly: + design.backgroundType == CardDesignBackgroundTypes.gradientOnly, cardOrder: cardOrder, ); } diff --git a/cw_core/lib/card_design.dart b/cw_core/lib/card_design.dart index 5786abebb..9fcfe0988 100644 --- a/cw_core/lib/card_design.dart +++ b/cw_core/lib/card_design.dart @@ -3,7 +3,7 @@ import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:flutter/material.dart'; -enum CardDesignBackgroundTypes { image, svgIcon, svgFull } +enum CardDesignBackgroundTypes { image, svgIcon, svgFull, gradientOnly } class CardColorCombination { final Color textColor; @@ -34,17 +34,26 @@ class CardColorCombination { ); } +class CardIconPath { + final String path; + final bool preColored; + + const CardIconPath(this.path, {this.preColored = false}); +} + class CardDesign { final Gradient gradient; final String imagePath; final CardDesignBackgroundTypes backgroundType; final CardColorCombination colors; + final bool preColoredIcon; const CardDesign( {this.backgroundType = CardDesignBackgroundTypes.svgIcon, this.gradient = const LinearGradient(colors: [Colors.black], begin: Alignment.topCenter, end: Alignment.bottomCenter), this.imagePath = "assets/new-ui/blank.svg", - this.colors = CardColorCombination.dark}); + this.colors = CardColorCombination.dark, + this.preColoredIcon = false}); static const LinearGradient gradientOrange = LinearGradient( colors: [Color(0xFFFF7C02), Color(0xFFFF5602)], @@ -120,6 +129,10 @@ class CardDesign { static const genericDefault = CardDesign(gradient: gradientBlue); + static const gradientOnlyDesign = CardDesign( + backgroundType: CardDesignBackgroundTypes.gradientOnly, + gradient: gradientBlue); + static const btc = CardDesign( imagePath: "assets/new-ui/balance_card_icons/bitcoin.svg"); @@ -332,10 +345,68 @@ class CardDesign { imagePath: "assets/new-ui/balance_card_backgrounds/bnb.svg"); CardDesign withGradient(Gradient gradient) => CardDesign( - gradient: gradient, colors: preferredColorCombinations[gradient] ?? colors, imagePath: imagePath, backgroundType: backgroundType); + gradient: gradient, + colors: preferredColorCombinations[gradient] ?? colors, + imagePath: imagePath, + backgroundType: backgroundType, + preColoredIcon: preColoredIcon); CardDesign withGradientAndColorCombination(Gradient gradient, CardColorCombination cardColorCombination) => CardDesign( - gradient: gradient, colors: cardColorCombination, imagePath: imagePath, backgroundType: backgroundType); + gradient: gradient, + colors: cardColorCombination, + imagePath: imagePath, + backgroundType: backgroundType, + preColoredIcon: preColoredIcon); + + CardDesign withIcon(CardIconPath icon) => CardDesign( + gradient: gradient, + colors: colors, + imagePath: icon.path, + backgroundType: backgroundType, + preColoredIcon: icon.preColored); + + static const String _balanceCardIconPrefix = "assets/new-ui/balance_card_icons"; + static const String _chainIconPrefix = "assets/new-ui/card_icons/chain_icons"; + static const String _ogIconPrefix = "assets/new-ui/card_icons/og_icons"; + static const String _outlineIconPrefix = "assets/new-ui/card_icons/outline_icons"; + static const String _symbolIconPrefix = "assets/new-ui/card_icons/symbol_icons"; + static const String _genericCakeIcon = "$_balanceCardIconPrefix/cake-card-icon.svg"; + + static const Map _iconNames = { + CryptoCurrency.arbEth: _CurrencyIconNames(ticker: 'arb', longName: 'arbitrum'), + CryptoCurrency.baseEth: _CurrencyIconNames(ticker: 'base', longName: 'base', chainFile: 'base_icon'), + CryptoCurrency.bch: _CurrencyIconNames(ticker: 'bch', longName: 'bitcoin_cash', chainFile: 'bitcoin-cash'), + CryptoCurrency.btc: _CurrencyIconNames(ticker: 'btc', longName: 'bitcoin', outlineFile: 'BTC'), + CryptoCurrency.bnb: _CurrencyIconNames(ticker: 'bnb', longName: 'bnb'), + CryptoCurrency.dcr: _CurrencyIconNames(ticker: 'dcr', longName: 'decred'), + CryptoCurrency.doge: _CurrencyIconNames(ticker: 'doge', longName: 'dogecoin'), + CryptoCurrency.eth: _CurrencyIconNames(ticker: 'eth', longName: 'ethereum'), + CryptoCurrency.btcln: _CurrencyIconNames(ticker: 'ln', longName: 'lightning'), + CryptoCurrency.ltc: _CurrencyIconNames(ticker: 'ltc', longName: 'litecoin'), + CryptoCurrency.xmr: _CurrencyIconNames( + ticker: 'xmr', longName: 'monero', ogPath: 'assets/images/xmr-og.webp'), + CryptoCurrency.nano: _CurrencyIconNames(ticker: 'xno', longName: 'nano'), + CryptoCurrency.maticpoly: _CurrencyIconNames(ticker: 'pol', longName: 'polygon'), + CryptoCurrency.sol: _CurrencyIconNames(ticker: 'sol', longName: 'solana'), + CryptoCurrency.trx: _CurrencyIconNames( + ticker: 'trx', longName: 'tron', ogPath: '$_ogIconPrefix/tron-og.svg'), + CryptoCurrency.zano: _CurrencyIconNames(ticker: 'zano', longName: 'zano'), + CryptoCurrency.zec: _CurrencyIconNames(ticker: 'zec', longName: 'zcash'), + }; + + static List iconPathsForWalletType(CryptoCurrency currency) { + final n = _iconNames[currency]; + if (n == null) return const []; + + return [ + CardIconPath('$_symbolIconPrefix/${n.ticker}-symbol.svg'), + CardIconPath('$_outlineIconPrefix/${n.outlineFile ?? n.ticker}-outline.svg'), + CardIconPath('$_balanceCardIconPrefix/${n.longName}.svg'), + CardIconPath('$_chainIconPrefix/${n.chainFile ?? n.longName}.svg', preColored: true), + CardIconPath(n.ogPath ?? '$_ogIconPrefix/${n.ticker}-og.svg', preColored: true), + const CardIconPath(_genericCakeIcon), + ]; + } static const List all = [genericDefault, btc, eth, xmr, ltc, eth, pol, doge, base, sol, btcln, tron, zano, dcr, arbitrum, zec, bnb, ethSpecial, btcSpecial, xmrSpecial, ltcSpecial, lnSpecial, tronSpecial, bchSpecial, wowSpecial, dogeSpecial, polSpecial, dcrSpecial, zanoSpecial, arbitrumSpecial, zecSpecial, bnbSpecial]; @@ -403,31 +474,91 @@ class CardDesign { CardDesign.gradientBlack: CardColorCombination.black, }; + CardDesign withIconStyleIndex(int iconStyleIndex, CryptoCurrency currency) { + final paths = iconPathsForWalletType(currency); + if (paths.isEmpty) return this; + if (iconStyleIndex < 0 || iconStyleIndex >= paths.length) return this; + return withIcon(paths[iconStyleIndex]); + } + + static Gradient gradientForStoredIndex( + int gradientIndex, + CryptoCurrency walletCurrency, + ) { + final n = CardDesign.allGradients.length; + final special = specialDesignsForCurrencies[walletCurrency]; + if (gradientIndex >= 0 && gradientIndex < n) { + return CardDesign.allGradients[gradientIndex]; + } + if (gradientIndex == n && special != null) { + return special.gradient; + } + return gradientBlue; + } + static CardDesign fromStyleSettings( BalanceCardStyleSettings? setting, CryptoCurrency walletCurrency) { if (setting == null) { return CardDesign.forCurrencySpecial(walletCurrency); - } else if (setting.backgroundImagePath.isNotEmpty) { - return CardDesign( - imagePath: setting.backgroundImagePath, + } + + if (setting.isGradientOnly) { + final gradient = gradientForStoredIndex(setting.gradientIndex, walletCurrency); + final textColors = preferredColorCombinations[gradient] + ?? specialDesignsForCurrencies[walletCurrency]?.colors + ?? gradientOnlyDesign.colors; + return gradientOnlyDesign.withGradientAndColorCombination(gradient, textColors); + } + + if (setting.backgroundImagePath.isNotEmpty) { + return CardDesign(imagePath: setting.backgroundImagePath); + } + + if (setting.useSpecialDesign && setting.gradientIndex != -1) { + return CardDesign.forCurrencySpecial(walletCurrency).withGradient( + gradientForStoredIndex(setting.gradientIndex, walletCurrency), ); - } else if (setting.useSpecialDesign && setting.gradientIndex != -1) { - return CardDesign.forCurrencySpecial(walletCurrency) - .withGradient(CardDesign.allGradients[setting.gradientIndex]); - } else if (!setting.useSpecialDesign && setting.gradientIndex == -1) { + } + + if (!setting.useSpecialDesign && setting.gradientIndex == -1) { final specialColors = - specialDesignsForCurrencies[walletCurrency] ?? - genericDefault; - return CardDesign.forCurrencyIcon(walletCurrency) - .withGradientAndColorCombination(specialColors.gradient, specialColors.colors); - } else if (setting.useSpecialDesign) { - return CardDesign.forCurrencySpecial(walletCurrency); - } else if (setting.gradientIndex != -1) { - return CardDesign.forCurrencyIcon(walletCurrency) - .withGradient(CardDesign.allGradients[setting.gradientIndex]); - } else { - printV("somehow, the user saved the design settings with literally no customization?"); + specialDesignsForCurrencies[walletCurrency] ?? genericDefault; + final design = CardDesign.forCurrencyIcon(walletCurrency) + .withGradientAndColorCombination( + specialColors.gradient, specialColors.colors); + return design.withIconStyleIndex(setting.iconStyleIndex, walletCurrency); + } + if (setting.useSpecialDesign) { return CardDesign.forCurrencySpecial(walletCurrency); } + if (setting.gradientIndex != -1) { + final baseIcon = CardDesign.forCurrencyIcon(walletCurrency); + final gradient = gradientForStoredIndex(setting.gradientIndex, walletCurrency); + final textColors = preferredColorCombinations[gradient] + ?? specialDesignsForCurrencies[walletCurrency]?.colors + ?? baseIcon.colors; + return baseIcon + .withGradientAndColorCombination(gradient, textColors) + .withIconStyleIndex(setting.iconStyleIndex, walletCurrency); + } + printV("somehow, the user saved the design settings with literally no " + "customization?"); + return CardDesign.forCurrencySpecial(walletCurrency); } +} + +class _CurrencyIconNames { + final String ticker; + final String longName; + final String? outlineFile; + final String? chainFile; + final String? ogPath; + + const _CurrencyIconNames({ + required this.ticker, + required this.longName, + this.outlineFile, + this.chainFile, + this.ogPath, + }); } \ No newline at end of file diff --git a/cw_core/lib/db/sqlite.dart b/cw_core/lib/db/sqlite.dart index eea479a80..bcd1a275d 100644 --- a/cw_core/lib/db/sqlite.dart +++ b/cw_core/lib/db/sqlite.dart @@ -1,4 +1,3 @@ - import 'dart:io'; import 'package:cw_core/root_dir.dart'; @@ -7,8 +6,6 @@ import 'package:sqflite_common_ffi/sqflite_ffi.dart'; Database? db; - - Future _addColumnIfNotExists( Database db, { required String table, @@ -41,11 +38,11 @@ Future initDb({String? pathOverride}) async { } } await db?.close(); - db = await openDatabase(dbFile.path, version: 8, - onUpgrade: (Database db, int oldVersion, int newVersion) async { - printV("migrating: $oldVersion, $newVersion"); - if (oldVersion <= 1) { - await db.execute(''' + db = await openDatabase(dbFile.path, version: 9, + onUpgrade: (Database db, int oldVersion, int newVersion) async { + printV("migrating: $oldVersion, $newVersion"); + if (oldVersion <= 1) { + await db.execute(''' DELETE FROM WalletInfo WHERE walletInfoId NOT IN ( SELECT MIN(walletInfoId) @@ -56,9 +53,9 @@ WHERE walletInfoId NOT IN ( CREATE UNIQUE INDEX IF NOT EXISTS idx_walletinfo_id_unique ON WalletInfo (id); '''); - } - if (oldVersion <= 2) { - await db.execute(''' + } + if (oldVersion <= 2) { + await db.execute(''' CREATE TABLE IF NOT EXISTS BalanceCardStyleSettings ( walletInfoId INTEGER, accountIndex INTEGER DEFAULT -1, @@ -69,48 +66,64 @@ CREATE TABLE IF NOT EXISTS BalanceCardStyleSettings ( FOREIGN KEY (walletInfoId) REFERENCES WalletInfo(walletInfoId) ); '''); - await _addColumnIfNotExists( - db, - table: 'WalletInfo', - column: 'receiveInfoboxDismissed', - definition: 'BOOLEAN DEFAULT FALSE', - ); + await _addColumnIfNotExists( + db, + table: 'WalletInfo', + column: 'receiveInfoboxDismissed', + definition: 'BOOLEAN DEFAULT FALSE', + ); - await _addColumnIfNotExists( - db, - table: 'BalanceCardStyleSettings', - column: 'cardOrder', - definition: 'INTEGER DEFAULT 0', - ); - } - if (oldVersion <= 3) { - await _addColumnIfNotExists(db, table: "WalletInfo", column: "showCombinedBalance", definition: "BOOLEAN DEFAULT TRUE"); - // null - primary token (eth, sol etc) - // not null - address of fav token - // if address doesn't correspond to a valid token, fallback to primary token - await _addColumnIfNotExists(db, table: "WalletInfo", column: "favoriteTokenAddress", definition: "TEXT DEFAULT NULL"); - } - if (oldVersion <= 4) { - await _createBridgeTransferTable(db); - } - if (oldVersion <= 5) { - await _createTradeTable(db); - } - if (oldVersion <= 6) { - await _addColumnIfNotExists( - db, - table: 'Trade', - column: 'toAddressExtraId', - definition: 'TEXT', - ); - } - if(oldVersion <= 7) { - await _createNodeTable(db); - } - }, - onCreate: (Database db, int version) async { - await db.execute( - ''' + await _addColumnIfNotExists( + db, + table: 'BalanceCardStyleSettings', + column: 'cardOrder', + definition: 'INTEGER DEFAULT 0', + ); + } + if (oldVersion <= 3) { + await _addColumnIfNotExists(db, + table: "WalletInfo", column: "showCombinedBalance", definition: "BOOLEAN DEFAULT TRUE"); + // null - primary token (eth, sol etc) + // not null - address of fav token + // if address doesn't correspond to a valid token, fallback to primary token + await _addColumnIfNotExists(db, + table: "WalletInfo", column: "favoriteTokenAddress", definition: "TEXT DEFAULT NULL"); + } + + if (oldVersion <= 4) { + await _createBridgeTransferTable(db); + } + + if (oldVersion <= 5) { + await _createTradeTable(db); + } + if (oldVersion <= 6) { + await _addColumnIfNotExists( + db, + table: 'Trade', + column: 'toAddressExtraId', + definition: 'TEXT', + ); + } + if (oldVersion <= 7) { + await _createNodeTable(db); + } + if (oldVersion <= 8) { + await _addColumnIfNotExists( + db, + table: 'BalanceCardStyleSettings', + column: 'iconStyleIndex', + definition: 'INTEGER DEFAULT 0', + ); + await _addColumnIfNotExists( + db, + table: 'BalanceCardStyleSettings', + column: 'isGradientOnly', + definition: 'BOOLEAN DEFAULT FALSE', + ); + } + }, onCreate: (Database db, int version) async { + await db.execute(''' CREATE TABLE WalletInfo ( walletInfoId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, id TEXT NOT NULL, @@ -139,8 +152,7 @@ CREATE TABLE WalletInfo ( ); '''); - await db.execute( - ''' + await db.execute(''' CREATE TABLE WalletInfoDerivationInfo ( walletInfoDerivationInfoId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, address TEXT NOT NULL, @@ -153,8 +165,7 @@ CREATE TABLE WalletInfoDerivationInfo ( ); '''); - await db.execute( - ''' + await db.execute(''' CREATE TABLE WalletInfoAddress ( walletInfoAddressId INTEGER PRIMARY KEY AUTOINCREMENT, walletInfoId INTEGER, @@ -164,8 +175,7 @@ CREATE TABLE WalletInfoAddress ( ); '''); - await db.execute( - ''' + await db.execute(''' CREATE TABLE WalletInfoAddressInfo ( walletInfoAddressInfoId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, walletInfoId INTEGER NOT NULL, @@ -177,8 +187,7 @@ CREATE TABLE WalletInfoAddressInfo ( ); '''); - await db.execute( - ''' + await db.execute(''' CREATE TABLE "WalletInfoAddressMap" ( walletInfoAddressMapId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, walletInfoId INTEGER NOT NULL, @@ -186,29 +195,29 @@ CREATE TABLE "WalletInfoAddressMap" ( addressValue TEXT NOT NULL, CONSTRAINT WalletInfoAddress_WalletInfo_FK FOREIGN KEY (walletInfoId) REFERENCES WalletInfo(walletInfoId) ); - ''' - ); - await db.execute(''' + '''); + await db.execute(''' CREATE UNIQUE INDEX IF NOT EXISTS idx_walletinfo_id_unique ON WalletInfo (id); '''); - await db.execute(''' + await db.execute(''' CREATE TABLE BalanceCardStyleSettings ( walletInfoId INTEGER, accountIndex INTEGER DEFAULT -1, gradientIndex INTEGER DEFAULT -1, useSpecialDesign BOOLEAN DEFAULT FALSE, backgroundImagePath TEXT DEFAULT "", + iconStyleIndex INTEGER DEFAULT 0, + isGradientOnly BOOLEAN DEFAULT FALSE, cardOrder INTEGER DEFAULT 0, PRIMARY KEY (walletInfoId, accountIndex), FOREIGN KEY (walletInfoId) REFERENCES WalletInfo(walletInfoId) ); '''); - await _createBridgeTransferTable(db); - await _createNodeTable(db); - await _createTradeTable(db); - } - ); + await _createBridgeTransferTable(db); + await _createNodeTable(db); + await _createTradeTable(db); + }); } Future _createTradeTable(Database db) async { @@ -356,4 +365,4 @@ isBuiltin BOOLEAN DEFAULT FALSE, isDefault BOOLEAN DEFAULT FALSE ); """); -} \ No newline at end of file +} diff --git a/lib/new-ui/pages/account_customizer.dart b/lib/new-ui/pages/account_customizer.dart index fd93e45d6..f9456e0d8 100644 --- a/lib/new-ui/pages/account_customizer.dart +++ b/lib/new-ui/pages/account_customizer.dart @@ -339,10 +339,10 @@ class _AccountCustomizerState extends State { printV("$i: $idx"); await BalanceCardStyleSettings.fromCardDesign( - widget.dashboardViewModel.wallet.walletInfo.internalId, - i, - idx, - _items[idx].card.design) + walletInfoId: widget.dashboardViewModel.wallet.walletInfo.internalId, + accountIndex: i, + cardOrder: idx, + design: _items[idx].card.design) .insert(); } } diff --git a/lib/new-ui/pages/card_customizer.dart b/lib/new-ui/pages/card_customizer.dart index 47d91c952..7a41a4b10 100644 --- a/lib/new-ui/pages/card_customizer.dart +++ b/lib/new-ui/pages/card_customizer.dart @@ -5,6 +5,8 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/new-ui/viewmodels/card_customizer/card_customizer_bloc.dart'; import 'package:cake_wallet/new-ui/widgets/coins_page/cards/balance_card.dart'; import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart'; +import 'package:cake_wallet/src/widgets/cake_image_widget.dart'; +import 'package:cw_core/card_design.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -23,7 +25,6 @@ class _CardCustomizerState extends State { bool editEnabled = false; late final CardCustomizerBloc bloc; - @override void initState() { super.initState(); @@ -46,192 +47,306 @@ class _CardCustomizerState extends State { } } + bool _showIconStylePanel(CardCustomizerState state) { + final design = state.availableDesigns[state.selectedDesignIndex]; + return design.backgroundType == CardDesignBackgroundTypes.svgIcon && + state.availableIconPaths.isNotEmpty; + } + + CardDesign _cardStylePreviewDesign(CardCustomizerState state, int index) { + var design = state.availableDesigns[index].withGradient(state.selectedColor); + if (design.backgroundType == CardDesignBackgroundTypes.svgIcon && + state.availableIconPaths.isNotEmpty) { + design = design.withIcon(state.availableIconPaths[state.selectedIconIndex]); + } + return design; + } + @override Widget build(BuildContext context) { return BlocListener( - listenWhen: (previous, current) => - previous.accountName != current.accountName, + listenWhen: (previous, current) => previous.accountName != current.accountName, listener: (context, state) { - if(accountNameController.text != state.accountName) { + if (accountNameController.text != state.accountName) { accountNameController.text = state.accountName; } }, - child: BlocBuilder( - builder: (context, state) { - if (state is CardCustomizerNotLoaded) return SizedBox.shrink(); - return PopScope( - child: SingleChildScrollView( - child: SafeArea( - child: Column( - spacing: 25.0, - mainAxisSize: MainAxisSize.min, - children: [ - ModalTopBar( - title: editEnabled ? S.of(context).edit_account : S.of(context).edit_card, - leadingIcon: Icon(Icons.close), - // trailingIcon: editEnabled ? Icon(Icons.delete_forever) : null, - onLeadingPressed: () => Navigator.of(context).maybePop(), - // onTrailingPressed: () {}, - ), - if (editEnabled) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 18.0), - child: Column( - spacing: 8.0, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(S.of(context).account_name), - TextField( - maxLength: 32, - decoration: InputDecoration(counterText: ""), - onChanged: (value) { - context.read().add(AccountNameChanged(value)); - }, - controller: accountNameController, - ) - ], - ), + child: BlocBuilder( + builder: (context, state) { + if (state is CardCustomizerNotLoaded) return SizedBox.shrink(); + return PopScope( + child: SingleChildScrollView( + child: SafeArea( + child: Column( + spacing: 25.0, + mainAxisSize: MainAxisSize.min, + children: [ + ModalTopBar( + title: editEnabled ? S.of(context).edit_account : S.of(context).edit_card, + leadingIcon: Icon(Icons.close), + // trailingIcon: editEnabled ? Icon(Icons.delete_forever) : null, + onLeadingPressed: () => Navigator.of(context).maybePop(), + // onTrailingPressed: () {}, ), - BalanceCard( - width: min(MediaQuery.of(context).size.width * 0.87, 768), - selected: true, - designSwitchDuration: Duration(milliseconds: 300), - accountName: - editEnabled ? state.accountName:"" , - balance: "0.00", - assetName: state.displaySats ? "sats" : widget.cryptoName, - capitalizeAssetName: !state.displaySats, - design: state.selectedDesign, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 18.0), - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surfaceContainer, - borderRadius: BorderRadius.circular(16), - ), + if (editEnabled) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 18.0), child: Column( + spacing: 8.0, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: const EdgeInsets.all(12.0), - child: Column( - spacing: 8.0, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(S.of(context).card_style), - Container( - height: 63, - child: ListView.separated( - scrollDirection: Axis.horizontal, - itemCount: state.availableDesigns.length, - separatorBuilder: (context, index) { - return SizedBox(width: 8.0); - }, - itemBuilder: (context, index) { - return GestureDetector( - onTap: () { - context - .read() - .add(CardDesignSelected(index)); - }, - child: AnimatedContainer( - duration: Duration(milliseconds: 300), - decoration: ShapeDecoration( - shape: RoundedSuperellipseBorder( - side: BorderSide(color: ((index == state.selectedDesignIndex )? Theme.of(context).colorScheme.onSurface : Colors.transparent), width: 1), - borderRadius: BorderRadiusGeometry.circular(12), - ), - ), - child: AnimatedScale( - duration: Duration(milliseconds: 200), - scale: index == state.selectedDesignIndex ? 0.94 : 1, - child: BalanceCard( - width: 96, - borderRadius: 10, - selected: false, - designSwitchDuration: Duration(milliseconds: 300), - design: state.availableDesigns[index], - gradient: state.selectedDesign.gradient, - ), - ), - ), - ); - }), - ), - ], - )), - SizedBox(height: 8), - Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surfaceContainerHigh, - borderRadius: BorderRadius.circular(16)), - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Column( - spacing: 8.0, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(S.of(context).color), - Container( - width: double.infinity, - child: Wrap( - direction: Axis.horizontal, - spacing: 4, // space between items in a row - runSpacing: 8, - children: - List.generate(state.availableColors.length, (index) { - return Material( - borderRadius: BorderRadius.circular(999999999), - child: InkWell( - borderRadius: BorderRadius.circular(999999999), - onTap: () { - context - .read() - .add(ColorSelected(index)); - }, - child: Stack( - children: [ - AnimatedOpacity( - duration: Duration(milliseconds: 200), - opacity: index == state.selectedColorIndex ? 1 : 0, - child: Container( - width:32,height:32,decoration: BoxDecoration(borderRadius: BorderRadius.circular(99999999),border: Border.all(color:Theme.of(context) - .colorScheme - .onSurface)) - ), - ), - AnimatedScale( - duration: Duration(milliseconds: 200), - scale: index == state.selectedColorIndex ? 0.8 : 1, - child: Container( - width: 32, - height: 32, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(99999999), - gradient: state.availableColors[index]), - ), - ), - ], - ), - ), - ); - }), - )), - ], - ), - ), + Text(S.of(context).account_name), + TextField( + maxLength: 32, + decoration: InputDecoration(counterText: ""), + onChanged: (value) { + context.read().add(AccountNameChanged(value)); + }, + controller: accountNameController, ) ], ), - )), - ], + ), + BalanceCard( + width: min(MediaQuery.of(context).size.width * 0.87, 768), + selected: true, + designSwitchDuration: Duration(milliseconds: 300), + accountName: editEnabled ? state.accountName : "", + balance: "0.00", + assetName: state.displaySats ? "sats" : widget.cryptoName, + capitalizeAssetName: !state.displaySats, + design: state.selectedDesign, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 18.0), + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.circular(16), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + spacing: 8.0, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(S.of(context).card_style), + Container( + height: 63, + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: state.availableDesigns.length, + separatorBuilder: (context, index) { + return SizedBox(width: 8.0); + }, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + context + .read() + .add(CardDesignSelected(index)); + }, + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + decoration: ShapeDecoration( + shape: RoundedSuperellipseBorder( + side: BorderSide( + color: + ((index == state.selectedDesignIndex) + ? Theme.of(context) + .colorScheme + .onSurface + : Colors.transparent), + width: 1), + borderRadius: + BorderRadiusGeometry.circular(12), + ), + ), + child: AnimatedScale( + duration: Duration(milliseconds: 200), + scale: index == state.selectedDesignIndex + ? 0.94 + : 1, + child: BalanceCard( + width: 96, + borderRadius: 10, + selected: false, + designSwitchDuration: + Duration(milliseconds: 300), + design: _cardStylePreviewDesign(state, index), + ), + ), + ), + ); + }), + ), + ], + )), + AnimatedSwitcher( + duration: const Duration(milliseconds: 350), + switchInCurve: Curves.easeOut, + switchOutCurve: Curves.easeIn, + transitionBuilder: (Widget child, Animation animation) { + return FadeTransition( + opacity: animation, + child: SizeTransition( + sizeFactor: animation, + axisAlignment: -1, + child: child, + ), + ); + }, + child: _showIconStylePanel(state) + ? Column( + key: const ValueKey('icon_style_panel'), + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + child: Column( + spacing: 8.0, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(S.of(context).icon_style), + SizedBox( + height: 48, + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: state.availableIconPaths.length, + separatorBuilder: (context, _) => + const SizedBox(width: 8.0), + itemBuilder: (context, index) { + final icon = state.availableIconPaths[index]; + final isSelected = + index == state.selectedIconIndex; + return GestureDetector( + onTap: () { + context + .read() + .add(IconStyleSelected(index)); + }, + child: AnimatedContainer( + duration: + const Duration(milliseconds: 200), + width: 48, + height: 48, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(18), + color: Theme.of(context) + .colorScheme + .surfaceContainerHigh, + border: Border.all( + color: isSelected + ? Theme.of(context) + .colorScheme + .onSurface + : Colors.transparent, + width: 2, + ), + ), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: CakeImageWidget(imageUrl: icon.path), + ), + ), + ); + }, + ), + ), + ], + ), + ), + ], + ) + : const SizedBox.shrink(key: ValueKey('icon_style_hidden')), + ), + SizedBox(height: 8), + Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainerHigh, + borderRadius: BorderRadius.circular(16)), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + spacing: 8.0, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(S.of(context).color), + Container( + width: double.infinity, + child: Wrap( + direction: Axis.horizontal, + spacing: 4, // space between items in a row + runSpacing: 8, + children: List.generate(state.availableColors.length, + (index) { + return Material( + borderRadius: BorderRadius.circular(999999999), + child: InkWell( + borderRadius: BorderRadius.circular(999999999), + onTap: () { + context + .read() + .add(ColorSelected(index)); + }, + child: Stack( + children: [ + AnimatedOpacity( + duration: Duration(milliseconds: 200), + opacity: index == state.selectedColorIndex + ? 1 + : 0, + child: Container( + width: 32, + height: 32, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(99999999), + border: Border.all( + color: Theme.of(context) + .colorScheme + .onSurface))), + ), + AnimatedScale( + duration: Duration(milliseconds: 200), + scale: index == state.selectedColorIndex + ? 0.8 + : 1, + child: Container( + width: 32, + height: 32, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(99999999), + gradient: + state.availableColors[index]), + ), + ), + ], + ), + ), + ); + }), + )), + ], + ), + ), + ) + ], + ), + )), + ], + ), ), ), - ), - ); - }, - ), -); + ); + }, + ), + ); } } diff --git a/lib/new-ui/viewmodels/card_customizer/card_customizer_bloc.dart b/lib/new-ui/viewmodels/card_customizer/card_customizer_bloc.dart index 24f75fea5..0bbd1a55b 100644 --- a/lib/new-ui/viewmodels/card_customizer/card_customizer_bloc.dart +++ b/lib/new-ui/viewmodels/card_customizer/card_customizer_bloc.dart @@ -18,11 +18,14 @@ class CardCustomizerBloc extends Bloc final bool displaySats; CardCustomizerBloc(this._wallet, {this.lightningMode = false, this.displaySats = false}) - : super(CardCustomizerNotLoaded(0, 0, [CardDesign.genericDefault], [], "", -1, displaySats, 0)) { + : super(CardCustomizerNotLoaded( + 0, 0, [CardDesign.genericDefault], [], + "", -1, displaySats, 0)) { on<_Init>(_init); on(_onDesignSelected); on(_onColorSelected); + on(_onIconStyleSelected); on(_onDesignSaved); on(_onAccountNameChanged); @@ -46,6 +49,7 @@ class CardCustomizerBloc extends Bloc final List ret = List.empty(growable: true); final curr = lightningMode ? CryptoCurrency.btcln : _wallet.currency; + ret.add(CardDesign.gradientOnlyDesign); ret.add(CardDesign.forCurrencyIcon(curr)); if (CardDesign.specialDesignsForCurrencies[curr] != null) @@ -55,26 +59,30 @@ class CardCustomizerBloc extends Bloc } int _initSelectedDesign(CardDesign currentDesign) { - if (currentDesign.backgroundType == CardDesignBackgroundTypes.svgIcon) + if (currentDesign.backgroundType == CardDesignBackgroundTypes.gradientOnly) { return 0; - else if (currentDesign.backgroundType == CardDesignBackgroundTypes.svgFull) + } + if (currentDesign.backgroundType == CardDesignBackgroundTypes.svgIcon) { return 1; - else - return 0; + } + if (currentDesign.backgroundType == CardDesignBackgroundTypes.svgFull) { + return 2; + } + return 0; + } + + int _initSelectedIconIndex( + BalanceCardStyleSettings? settings, + List availableIconPaths, + ) { + if (settings == null || availableIconPaths.isEmpty) return 0; + if (settings.iconStyleIndex >= availableIconPaths.length) return 0; + return settings.iconStyleIndex; } int _initSelectedColor(CardDesign currentDesign) { - int ret = CardDesign.allGradients.indexOf(currentDesign.gradient); - if(ret == -1) { - // special design with its own color. select last color in list. - return CardDesign.allGradients.length; - } else if (ret == -1) { - // no color selected, select default. - return 0; - } else { - // select whatever's selected. - return ret; - } + final ret = CardDesign.allGradients.indexOf(currentDesign.gradient); + return ret == -1 ? CardDesign.allGradients.length : ret; } void _init(_Init event, Emitter emit) async { @@ -95,24 +103,40 @@ class CardCustomizerBloc extends Bloc } else { accountIndex = -1; } + final curr = + lightningMode ? CryptoCurrency.btcln : _wallet.currency; final currentDesignSettings = await _loadCurrentDesignSettings(accountIndex); - final currentDesign = CardDesign.fromStyleSettings(currentDesignSettings, lightningMode ? CryptoCurrency.btcln : _wallet.currency); + final currentDesign = CardDesign.fromStyleSettings(currentDesignSettings, curr); final availableDesigns = _initAvailableDesigns(lightningMode: lightningMode); final availableColors = _updateAvailableColors(currentDesign); - final selectedDesign = _initSelectedDesign(currentDesign); + final selectedDesignIndex = _initSelectedDesign(currentDesign); final selectedColor = _initSelectedColor(currentDesign); + final availableIconPaths = CardDesign.iconPathsForWalletType(curr); + final selectedIconIndex = _initSelectedIconIndex( + currentDesignSettings, availableIconPaths); - emit(CardCustomizerInitial(selectedDesign, selectedColor, availableDesigns, availableColors, - accountName, accountIndex, displaySats, currentDesignSettings?.cardOrder ?? 0)); + emit(CardCustomizerInitial( + selectedDesignIndex, + selectedColor, + availableDesigns, + availableColors, + accountName, + accountIndex, + displaySats, + currentDesignSettings?.cardOrder ?? 0, + availableIconPaths: availableIconPaths, + selectedIconIndex: selectedIconIndex)); } void _onDesignSelected(CardDesignSelected event, Emitter emit) { final newColors = _updateAvailableColors(state.availableDesigns[event.newDesignIndex]); late final int newColorIndex; - if (newColors.length < state.availableColors.length) { + if (newColors.isEmpty) { + newColorIndex = 0; + } else if (newColors.length < state.availableColors.length) { newColorIndex = 0; } else { - newColorIndex = state.selectedColorIndex; + newColorIndex = state.selectedColorIndex.clamp(0, newColors.length - 1); } emit(state.copyWith( @@ -125,17 +149,36 @@ class CardCustomizerBloc extends Bloc emit(state.copyWith(selectedColorIndex: event.newColorIndex)); } + void _onIconStyleSelected( + IconStyleSelected event, Emitter emit) { + emit(state.copyWith(selectedIconIndex: event.iconIndex)); + } + void _onAccountNameChanged(AccountNameChanged event, Emitter emit) { emit(state.copyWith(accountName: event.newAccountName)); } void _onDesignSaved(DesignSaved event, Emitter emit) { BalanceCardStyleSettings.fromCardDesign( - _wallet.walletInfo.internalId, state.accountIndex, state.cardOrder, state.selectedDesign) + walletInfoId: _wallet.walletInfo.internalId, + accountIndex: state.accountIndex, + cardOrder: state.cardOrder, + design: state.selectedDesign, + iconStyleIndex: state.selectedIconIndex, + gradientIndexOverride: state.selectedColorIndex) .insert() .then((value) { - emit(CardCustomizerSaved(state.selectedDesignIndex, state.selectedColorIndex, - state.availableDesigns, state.availableColors, state.accountName, state.accountIndex, state.displaySats, state.cardOrder)); + emit(CardCustomizerSaved( + state.selectedDesignIndex, + state.selectedColorIndex, + state.availableDesigns, + state.availableColors, + state.accountName, + state.accountIndex, + state.displaySats, + state.cardOrder, + availableIconPaths: state.availableIconPaths, + selectedIconIndex: state.selectedIconIndex)); }); saveAccountName(); } diff --git a/lib/new-ui/viewmodels/card_customizer/card_customizer_event.dart b/lib/new-ui/viewmodels/card_customizer/card_customizer_event.dart index e6eba5518..7b16b0e5d 100644 --- a/lib/new-ui/viewmodels/card_customizer/card_customizer_event.dart +++ b/lib/new-ui/viewmodels/card_customizer/card_customizer_event.dart @@ -26,3 +26,9 @@ class AccountNameChanged extends CardCustomizerEvent { class DesignSaved extends CardCustomizerEvent {} + +class IconStyleSelected extends CardCustomizerEvent { + final int iconIndex; + + IconStyleSelected(this.iconIndex); +} diff --git a/lib/new-ui/viewmodels/card_customizer/card_customizer_state.dart b/lib/new-ui/viewmodels/card_customizer/card_customizer_state.dart index 916c10ecc..a9efc6aa0 100644 --- a/lib/new-ui/viewmodels/card_customizer/card_customizer_state.dart +++ b/lib/new-ui/viewmodels/card_customizer/card_customizer_state.dart @@ -9,6 +9,8 @@ sealed class CardCustomizerState { final bool displaySats; final List availableDesigns; final List availableColors; + final List availableIconPaths; + final int selectedIconIndex; CardCustomizerState( this.selectedDesignIndex, @@ -17,12 +19,30 @@ sealed class CardCustomizerState { this.availableColors, this.accountName, this.accountIndex, - this.displaySats, - this.cardOrder - ); + this.displaySats, + this.cardOrder, { + this.availableIconPaths = const [], + this.selectedIconIndex = 0, + }); CardDesign get selectedDesign { - return availableDesigns[selectedDesignIndex].withGradient(selectedColor); + final gradient = selectedColor; + final baseDesign = availableDesigns[selectedDesignIndex]; + + CardDesign design; + if (CardDesign.preferredColorCombinations.containsKey(gradient)) { + design = baseDesign.withGradient(gradient); + } else { + final specialDesign = availableDesigns.length > 2 ? availableDesigns.last : null; + final textColors = specialDesign?.colors ?? baseDesign.colors; + design = baseDesign.withGradientAndColorCombination(gradient, textColors); + } + + if (design.backgroundType == CardDesignBackgroundTypes.svgIcon && + availableIconPaths.isNotEmpty) { + design = design.withIcon(availableIconPaths[selectedIconIndex]); + } + return design; } CardCustomizerState copyWith({ @@ -33,6 +53,8 @@ sealed class CardCustomizerState { String? accountName, int? accountIndex, int? cardOrder, + List? availableIconPaths, + int? selectedIconIndex, }); Gradient get selectedColor => availableColors[selectedColorIndex]; @@ -42,7 +64,16 @@ final class CardCustomizerNotLoaded extends CardCustomizerState { CardCustomizerNotLoaded(super.selectedDesignIndex, super.selectedColorIndex, super.availableDesigns, super.availableColors, super.accountName, super.accountIndex, super.displaySats, super.cardOrder); @override - CardCustomizerState copyWith({int? selectedDesignIndex, int? selectedColorIndex, List? availableDesigns, List? availableColors, String? accountName, int? accountIndex, int? cardOrder}) { + CardCustomizerState copyWith( + {int? selectedDesignIndex, + int? selectedColorIndex, + List? availableDesigns, + List? availableColors, + String? accountName, + int? accountIndex, + int? cardOrder, + List? availableIconPaths, + int? selectedIconIndex}) { // this is never gonna be copied. it's near-instantly replaced with initial throw UnimplementedError(); } @@ -56,10 +87,14 @@ final class CardCustomizerInitial extends CardCustomizerState { List availableColors, String accountName, int accountIndex, - bool displaySats, - int cardOrder, - ) : super(selectedDesignIndex, selectedColorIndex, availableDesigns, availableColors, accountName, - accountIndex, displaySats, cardOrder); + bool displaySats, + int cardOrder, { + List availableIconPaths = const [], + int selectedIconIndex = 0, + }) : super(selectedDesignIndex, selectedColorIndex, availableDesigns, + availableColors, accountName, accountIndex, displaySats, cardOrder, + availableIconPaths: availableIconPaths, + selectedIconIndex: selectedIconIndex); CardCustomizerInitial copyWith({ int? selectedDesignIndex, @@ -70,6 +105,8 @@ final class CardCustomizerInitial extends CardCustomizerState { int? accountIndex, bool? displaySats, int? cardOrder, + List? availableIconPaths, + int? selectedIconIndex, }) { return CardCustomizerInitial( selectedDesignIndex ?? this.selectedDesignIndex, @@ -80,13 +117,17 @@ final class CardCustomizerInitial extends CardCustomizerState { accountIndex ?? this.accountIndex, displaySats ?? this.displaySats, cardOrder ?? this.cardOrder, + availableIconPaths: availableIconPaths ?? this.availableIconPaths, + selectedIconIndex: selectedIconIndex ?? this.selectedIconIndex, ); } } final class CardCustomizerSaved extends CardCustomizerState { - CardCustomizerSaved(super.selectedDesignIndex, super.selectedColorIndex, super.availableDesigns, - super.availableColors, super.accountName, super.accountIndex, super.displaySats, super.cardOrder); + CardCustomizerSaved(super.selectedDesignIndex, super.selectedColorIndex, + super.availableDesigns, super.availableColors, super.accountName, + super.accountIndex, super.displaySats, super.cardOrder, + {super.availableIconPaths, super.selectedIconIndex}); @override CardCustomizerState copyWith( @@ -96,8 +137,10 @@ final class CardCustomizerSaved extends CardCustomizerState { List? availableColors, String? accountName, int? accountIndex, - bool? displaySats, - int? cardOrder}) { + bool? displaySats, + int? cardOrder, + List? availableIconPaths, + int? selectedIconIndex}) { return CardCustomizerSaved( selectedDesignIndex ?? this.selectedDesignIndex, selectedColorIndex ?? this.selectedColorIndex, @@ -107,6 +150,8 @@ final class CardCustomizerSaved extends CardCustomizerState { accountIndex ?? this.accountIndex, displaySats ?? this.displaySats, cardOrder ?? this.cardOrder, + availableIconPaths: availableIconPaths ?? this.availableIconPaths, + selectedIconIndex: selectedIconIndex ?? this.selectedIconIndex, ); } } diff --git a/lib/new-ui/widgets/coins_page/cards/balance_card.dart b/lib/new-ui/widgets/coins_page/cards/balance_card.dart index 714fc5cc3..88fff31db 100644 --- a/lib/new-ui/widgets/coins_page/cards/balance_card.dart +++ b/lib/new-ui/widgets/coins_page/cards/balance_card.dart @@ -2,7 +2,6 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/widgets/cake_image_widget.dart'; import 'package:cw_core/card_design.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; class BalanceCardAction { final String label; @@ -247,16 +246,7 @@ class BalanceCard extends StatelessWidget { switchInCurve: Curves.easeInOut, switchOutCurve: Curves.easeInOut, child: design.backgroundType == CardDesignBackgroundTypes.svgIcon - ? CakeImageWidget( - imageUrl: design.imagePath, - key: const ValueKey('svgIcon'), - height: iconWidth, - width: iconWidth, - colorFilter: ColorFilter.mode( - design.colors.backgroundImageColor.withAlpha(80), - BlendMode.srcIn, - ), - ) + ? _CornerSvgIcon(design: design, iconWidth: iconWidth) : const SizedBox.shrink( key: ValueKey('svgIconOff'), ), @@ -320,3 +310,26 @@ class BalanceCard extends StatelessWidget { ), ); } + +class _CornerSvgIcon extends StatelessWidget { + const _CornerSvgIcon({required this.design, required this.iconWidth}); + + final CardDesign design; + final double iconWidth; + + @override + Widget build(BuildContext context) { + return CakeImageWidget( + imageUrl: design.imagePath, + key: ValueKey(design.imagePath), + height: iconWidth, + width: iconWidth, + colorFilter: design.preColoredIcon + ? null + : ColorFilter.mode( + design.colors.backgroundImageColor.withValues(alpha: 0.33), + BlendMode.dstIn, + ), + ); + } +} diff --git a/lib/src/widgets/cake_image_widget.dart b/lib/src/widgets/cake_image_widget.dart index 8df0a7bc6..a28072932 100644 --- a/lib/src/widgets/cake_image_widget.dart +++ b/lib/src/widgets/cake_image_widget.dart @@ -71,6 +71,7 @@ class CakeImageWidget extends StatelessWidget { width: width, fit: fit, color: color, + errorBuilder: (_, __, ___) => _buildErrorWidget(context), ); } } else { diff --git a/lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart b/lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart index 6481efb25..8b1cc83af 100644 --- a/lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart +++ b/lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart @@ -52,10 +52,10 @@ abstract class MoneroAccountEditOrCreateViewModelBase with Store { final gradients = await _getUsableCardGradients(); await BalanceCardStyleSettings.fromCardDesign( - _wallet.walletInfo.internalId, - _moneroAccountList.accounts.length, - _moneroAccountList.accounts.length, - CardDesign.specialDesignsForCurrencies[_wallet.currency]! + walletInfoId: _wallet.walletInfo.internalId, + accountIndex: _moneroAccountList.accounts.length, + cardOrder: _moneroAccountList.accounts.length, + design: CardDesign.specialDesignsForCurrencies[_wallet.currency]! .withGradient(gradients[Random().nextInt(gradients.length)])) .insert(); } diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 99955ad49..416c6dea5 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -284,6 +284,11 @@ flutter: - assets/new-ui/navbar/ - assets/new-ui/changelog/icons/ - assets/new-ui/changelog/text/ + - assets/new-ui/card_icons/ + - assets/new-ui/card_icons/chain_icons/ + - assets/new-ui/card_icons/og_icons/ + - assets/new-ui/card_icons/outline_icons/ + - assets/new-ui/card_icons/symbol_icons/ - assets/new-ui/crypto_full_icons/ fonts: diff --git a/res/pictures/balance_card_icons/bnb.svg b/res/pictures/balance_card_icons/bnb.svg index bac89c817..79eb9c846 100644 --- a/res/pictures/balance_card_icons/bnb.svg +++ b/res/pictures/balance_card_icons/bnb.svg @@ -1,3 +1,3 @@ - - + + diff --git a/res/pictures/balance_card_icons/cake-card-icon.svg b/res/pictures/balance_card_icons/cake-card-icon.svg new file mode 100644 index 000000000..e1204e14d --- /dev/null +++ b/res/pictures/balance_card_icons/cake-card-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/arbitrum.svg b/res/pictures/card_icons/chain_icons/arbitrum.svg new file mode 100644 index 000000000..376e1ccb2 --- /dev/null +++ b/res/pictures/card_icons/chain_icons/arbitrum.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/base_icon.svg b/res/pictures/card_icons/chain_icons/base_icon.svg new file mode 100644 index 000000000..33879508d --- /dev/null +++ b/res/pictures/card_icons/chain_icons/base_icon.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/bitcoin-cash.svg b/res/pictures/card_icons/chain_icons/bitcoin-cash.svg new file mode 100644 index 000000000..42afabbee --- /dev/null +++ b/res/pictures/card_icons/chain_icons/bitcoin-cash.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/bitcoin.svg b/res/pictures/card_icons/chain_icons/bitcoin.svg new file mode 100644 index 000000000..7b63e0e2f --- /dev/null +++ b/res/pictures/card_icons/chain_icons/bitcoin.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/bnb.svg b/res/pictures/card_icons/chain_icons/bnb.svg new file mode 100644 index 000000000..a8db2b10e --- /dev/null +++ b/res/pictures/card_icons/chain_icons/bnb.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/decred.svg b/res/pictures/card_icons/chain_icons/decred.svg new file mode 100644 index 000000000..cff4f8b3f --- /dev/null +++ b/res/pictures/card_icons/chain_icons/decred.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/dogecoin.svg b/res/pictures/card_icons/chain_icons/dogecoin.svg new file mode 100644 index 000000000..f9448acd5 --- /dev/null +++ b/res/pictures/card_icons/chain_icons/dogecoin.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/ethereum.svg b/res/pictures/card_icons/chain_icons/ethereum.svg new file mode 100644 index 000000000..88ac153fa --- /dev/null +++ b/res/pictures/card_icons/chain_icons/ethereum.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/lightning.svg b/res/pictures/card_icons/chain_icons/lightning.svg new file mode 100644 index 000000000..bab1adf94 --- /dev/null +++ b/res/pictures/card_icons/chain_icons/lightning.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/litecoin.svg b/res/pictures/card_icons/chain_icons/litecoin.svg new file mode 100644 index 000000000..426237a38 --- /dev/null +++ b/res/pictures/card_icons/chain_icons/litecoin.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/monero.svg b/res/pictures/card_icons/chain_icons/monero.svg new file mode 100644 index 000000000..2685b87d6 --- /dev/null +++ b/res/pictures/card_icons/chain_icons/monero.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/nano.svg b/res/pictures/card_icons/chain_icons/nano.svg new file mode 100644 index 000000000..6d5c7bbdb --- /dev/null +++ b/res/pictures/card_icons/chain_icons/nano.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/polygon.svg b/res/pictures/card_icons/chain_icons/polygon.svg new file mode 100644 index 000000000..161fbf79d --- /dev/null +++ b/res/pictures/card_icons/chain_icons/polygon.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/solana.svg b/res/pictures/card_icons/chain_icons/solana.svg new file mode 100644 index 000000000..dcae65e62 --- /dev/null +++ b/res/pictures/card_icons/chain_icons/solana.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/tron.svg b/res/pictures/card_icons/chain_icons/tron.svg new file mode 100644 index 000000000..adf4f4b9f --- /dev/null +++ b/res/pictures/card_icons/chain_icons/tron.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/zano.svg b/res/pictures/card_icons/chain_icons/zano.svg new file mode 100644 index 000000000..6d4e43599 --- /dev/null +++ b/res/pictures/card_icons/chain_icons/zano.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/chain_icons/zcash.svg b/res/pictures/card_icons/chain_icons/zcash.svg new file mode 100644 index 000000000..3e5115e3b --- /dev/null +++ b/res/pictures/card_icons/chain_icons/zcash.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/arb-og.svg b/res/pictures/card_icons/og_icons/arb-og.svg new file mode 100644 index 000000000..fe32a50fc --- /dev/null +++ b/res/pictures/card_icons/og_icons/arb-og.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/base-og.svg b/res/pictures/card_icons/og_icons/base-og.svg new file mode 100644 index 000000000..b7acf8219 --- /dev/null +++ b/res/pictures/card_icons/og_icons/base-og.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/pictures/card_icons/og_icons/bch-og.svg b/res/pictures/card_icons/og_icons/bch-og.svg new file mode 100644 index 000000000..c7b2f805f --- /dev/null +++ b/res/pictures/card_icons/og_icons/bch-og.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/bnb-og.svg b/res/pictures/card_icons/og_icons/bnb-og.svg new file mode 100644 index 000000000..2480c3af8 --- /dev/null +++ b/res/pictures/card_icons/og_icons/bnb-og.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/btc-og.svg b/res/pictures/card_icons/og_icons/btc-og.svg new file mode 100644 index 000000000..5cb4f828f --- /dev/null +++ b/res/pictures/card_icons/og_icons/btc-og.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/pictures/card_icons/og_icons/dcr-og.svg b/res/pictures/card_icons/og_icons/dcr-og.svg new file mode 100644 index 000000000..2ffcfb2b0 --- /dev/null +++ b/res/pictures/card_icons/og_icons/dcr-og.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/res/pictures/card_icons/og_icons/doge-og.svg b/res/pictures/card_icons/og_icons/doge-og.svg new file mode 100644 index 000000000..1aeedfa37 --- /dev/null +++ b/res/pictures/card_icons/og_icons/doge-og.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/eth-og.svg b/res/pictures/card_icons/og_icons/eth-og.svg new file mode 100644 index 000000000..19f57d474 --- /dev/null +++ b/res/pictures/card_icons/og_icons/eth-og.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/ln-og.svg b/res/pictures/card_icons/og_icons/ln-og.svg new file mode 100644 index 000000000..3623fbc55 --- /dev/null +++ b/res/pictures/card_icons/og_icons/ln-og.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/ltc-og.svg b/res/pictures/card_icons/og_icons/ltc-og.svg new file mode 100644 index 000000000..269b4eff0 --- /dev/null +++ b/res/pictures/card_icons/og_icons/ltc-og.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/pol-og.svg b/res/pictures/card_icons/og_icons/pol-og.svg new file mode 100644 index 000000000..32bb6e8e8 --- /dev/null +++ b/res/pictures/card_icons/og_icons/pol-og.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/sol-og.svg b/res/pictures/card_icons/og_icons/sol-og.svg new file mode 100644 index 000000000..f2359baeb --- /dev/null +++ b/res/pictures/card_icons/og_icons/sol-og.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/tron-og.svg b/res/pictures/card_icons/og_icons/tron-og.svg new file mode 100644 index 000000000..f5efbb161 --- /dev/null +++ b/res/pictures/card_icons/og_icons/tron-og.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/xmr-og.svg b/res/pictures/card_icons/og_icons/xmr-og.svg new file mode 100644 index 000000000..58a28d3a0 --- /dev/null +++ b/res/pictures/card_icons/og_icons/xmr-og.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/res/pictures/card_icons/og_icons/xno-og.svg b/res/pictures/card_icons/og_icons/xno-og.svg new file mode 100644 index 000000000..406f68e91 --- /dev/null +++ b/res/pictures/card_icons/og_icons/xno-og.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/zano-og.svg b/res/pictures/card_icons/og_icons/zano-og.svg new file mode 100644 index 000000000..20c2fe760 --- /dev/null +++ b/res/pictures/card_icons/og_icons/zano-og.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/pictures/card_icons/og_icons/zec-og.svg b/res/pictures/card_icons/og_icons/zec-og.svg new file mode 100644 index 000000000..ff4c2e9f4 --- /dev/null +++ b/res/pictures/card_icons/og_icons/zec-og.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/pictures/card_icons/outline_icons/BTC-outline.svg b/res/pictures/card_icons/outline_icons/BTC-outline.svg new file mode 100644 index 000000000..065d80d86 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/BTC-outline.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/pictures/card_icons/outline_icons/arb-outline.svg b/res/pictures/card_icons/outline_icons/arb-outline.svg new file mode 100644 index 000000000..1bb3c0e04 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/arb-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/base-outline.svg b/res/pictures/card_icons/outline_icons/base-outline.svg new file mode 100644 index 000000000..d9ffd84a8 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/base-outline.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/res/pictures/card_icons/outline_icons/bch-outline.svg b/res/pictures/card_icons/outline_icons/bch-outline.svg new file mode 100644 index 000000000..e4d3c83fb --- /dev/null +++ b/res/pictures/card_icons/outline_icons/bch-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/bnb-outline.svg b/res/pictures/card_icons/outline_icons/bnb-outline.svg new file mode 100644 index 000000000..9d1581769 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/bnb-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/dcr-outline.svg b/res/pictures/card_icons/outline_icons/dcr-outline.svg new file mode 100644 index 000000000..a82dc5b7d --- /dev/null +++ b/res/pictures/card_icons/outline_icons/dcr-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/doge-outline.svg b/res/pictures/card_icons/outline_icons/doge-outline.svg new file mode 100644 index 000000000..ad4c6ecb4 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/doge-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/eth-outline.svg b/res/pictures/card_icons/outline_icons/eth-outline.svg new file mode 100644 index 000000000..c5b2c8093 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/eth-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/ln-outline.svg b/res/pictures/card_icons/outline_icons/ln-outline.svg new file mode 100644 index 000000000..98b666d0f --- /dev/null +++ b/res/pictures/card_icons/outline_icons/ln-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/ltc-outline.svg b/res/pictures/card_icons/outline_icons/ltc-outline.svg new file mode 100644 index 000000000..bfb2375f1 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/ltc-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/pol-outline.svg b/res/pictures/card_icons/outline_icons/pol-outline.svg new file mode 100644 index 000000000..cd9c4e6ca --- /dev/null +++ b/res/pictures/card_icons/outline_icons/pol-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/sol-outline.svg b/res/pictures/card_icons/outline_icons/sol-outline.svg new file mode 100644 index 000000000..977ba1487 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/sol-outline.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/pictures/card_icons/outline_icons/trx-outline.svg b/res/pictures/card_icons/outline_icons/trx-outline.svg new file mode 100644 index 000000000..3978ed461 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/trx-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/xmr-outline.svg b/res/pictures/card_icons/outline_icons/xmr-outline.svg new file mode 100644 index 000000000..d1947c9c8 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/xmr-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/xno-outline.svg b/res/pictures/card_icons/outline_icons/xno-outline.svg new file mode 100644 index 000000000..59724494e --- /dev/null +++ b/res/pictures/card_icons/outline_icons/xno-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/zano-outline.svg b/res/pictures/card_icons/outline_icons/zano-outline.svg new file mode 100644 index 000000000..e7d99de04 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/zano-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/outline_icons/zec-outline.svg b/res/pictures/card_icons/outline_icons/zec-outline.svg new file mode 100644 index 000000000..ecff95b5b --- /dev/null +++ b/res/pictures/card_icons/outline_icons/zec-outline.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/res/pictures/card_icons/symbol_icons/arb-symbol.svg b/res/pictures/card_icons/symbol_icons/arb-symbol.svg new file mode 100644 index 000000000..708e469f2 --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/arb-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/base-symbol.svg b/res/pictures/card_icons/symbol_icons/base-symbol.svg new file mode 100644 index 000000000..3ad0e35bc --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/base-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/bch-symbol.svg b/res/pictures/card_icons/symbol_icons/bch-symbol.svg new file mode 100644 index 000000000..d9deb707f --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/bch-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/bnb-symbol.svg b/res/pictures/card_icons/symbol_icons/bnb-symbol.svg new file mode 100644 index 000000000..223c42a4e --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/bnb-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/btc-symbol.svg b/res/pictures/card_icons/symbol_icons/btc-symbol.svg new file mode 100644 index 000000000..9ec6df61b --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/btc-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/dcr-symbol.svg b/res/pictures/card_icons/symbol_icons/dcr-symbol.svg new file mode 100644 index 000000000..b2a38fc8f --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/dcr-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/doge-symbol.svg b/res/pictures/card_icons/symbol_icons/doge-symbol.svg new file mode 100644 index 000000000..39590bd42 --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/doge-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/eth-symbol.svg b/res/pictures/card_icons/symbol_icons/eth-symbol.svg new file mode 100644 index 000000000..5c77dd13d --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/eth-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/ln-symbol.svg b/res/pictures/card_icons/symbol_icons/ln-symbol.svg new file mode 100644 index 000000000..6c1ffa8cc --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/ln-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/ltc-symbol.svg b/res/pictures/card_icons/symbol_icons/ltc-symbol.svg new file mode 100644 index 000000000..463c045d4 --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/ltc-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/pol-symbol.svg b/res/pictures/card_icons/symbol_icons/pol-symbol.svg new file mode 100644 index 000000000..8ba604628 --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/pol-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/sol-symbol.svg b/res/pictures/card_icons/symbol_icons/sol-symbol.svg new file mode 100644 index 000000000..64ee020e0 --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/sol-symbol.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/res/pictures/card_icons/symbol_icons/trx-symbol.svg b/res/pictures/card_icons/symbol_icons/trx-symbol.svg new file mode 100644 index 000000000..702233999 --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/trx-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/xmr-symbol.svg b/res/pictures/card_icons/symbol_icons/xmr-symbol.svg new file mode 100644 index 000000000..62c837db2 --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/xmr-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/xno-symbol.svg b/res/pictures/card_icons/symbol_icons/xno-symbol.svg new file mode 100644 index 000000000..1c84b07ef --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/xno-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/zano-symbol.svg b/res/pictures/card_icons/symbol_icons/zano-symbol.svg new file mode 100644 index 000000000..bdd9de50d --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/zano-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/zec-symbol.svg b/res/pictures/card_icons/symbol_icons/zec-symbol.svg new file mode 100644 index 000000000..dfc5a85bd --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/zec-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index c10fdd318..8a6951b90 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -530,6 +530,7 @@ "how_to_use": "كيفية الاستخدام", "how_to_use_card": "كيفية استخدام هذه البطاقة", "i_understand": "أفهم", + "icon_style": "نمط الأيقونة", "id": "المعرّف: ", "if_you_dont_see_your_device": "إذا لم يظهر جهازك أعلاه، يُرجى التأكد من أن Ledger قيد التشغيل ومفتوح القفل!", "ignor": "تجاهل", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index ad912b030..a46bfbfbc 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -530,6 +530,7 @@ "how_to_use": "Как да използвате", "how_to_use_card": "Как да използвате тази карта", "i_understand": "Разбирам", + "icon_style": "Стил на иконата", "id": "ID: ", "if_you_dont_see_your_device": "Ако не виждате устройството си по-горе, моля, уверете се, че вашият Ledger е буден и отключен!", "ignor": "Игнорирай", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index ff731539e..312224c82 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -530,6 +530,7 @@ "how_to_use": "Jak používat", "how_to_use_card": "Jak tuto kartu používat", "i_understand": "Rozumím", + "icon_style": "Styl ikony", "id": "ID: ", "if_you_dont_see_your_device": "Pokud své zařízení výše nevidíte, ujistěte se, že je váš Ledger zapnutý a odemčený!", "ignor": "Ignorovat", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 42c892ae8..c20eeeec8 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -530,6 +530,7 @@ "how_to_use": "So verwenden Sie", "how_to_use_card": "So verwenden Sie diese Karte", "i_understand": "Ich verstehe", + "icon_style": "Symbolstil", "id": "ID: ", "if_you_dont_see_your_device": "Wenn Sie Ihr Gerät oben nicht sehen, stellen Sie bitte sicher, dass Ihr Ledger eingeschaltet und entsperrt ist!", "ignore": "Ignorieren", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 6e73b1683..160192565 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -534,6 +534,7 @@ "how_to_use": "How to use", "how_to_use_card": "How to use this card", "i_understand": "I understand", + "icon_style": "Icon style", "id": "ID: ", "if_you_dont_see_your_device": "If you don't see your device above, please be sure your Ledger is awake and unlocked!", "ignor": "Ignore", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 5754f2000..e820dc568 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -530,6 +530,7 @@ "how_to_use": "Cómo usar", "how_to_use_card": "Cómo usar esta tarjeta", "i_understand": "Entiendo", + "icon_style": "Estilo de icono", "id": "ID: ", "if_you_dont_see_your_device": "Si no ves tu dispositivo arriba, asegúrate de que tu Ledger esté encendido y desbloqueado.", "ignor": "Ignorar", diff --git a/res/values/strings_fa.arb b/res/values/strings_fa.arb index f39bf4f73..ea3c0df67 100644 --- a/res/values/strings_fa.arb +++ b/res/values/strings_fa.arb @@ -528,6 +528,7 @@ "how_to_use": "نحوه استفاده", "how_to_use_card": "چگونه از این کارت استفاده کنیم", "i_understand": "متوجه شدم", + "icon_style": "سبک آیکون", "id": "شناسه: ", "if_you_dont_see_your_device": "اگر دستگاه خود را در بالا نمی‌بینید، لطفاً مطمئن شوید که Ledger شما روشن است و قفل آن باز شده است!", "ignor": "نادیده گرفتن", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 72f8ec0b1..b5ef76528 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -530,6 +530,7 @@ "how_to_use": "Comment utiliser", "how_to_use_card": "Comment utiliser cette carte", "i_understand": "Je comprends", + "icon_style": "Style d'icône", "id": "ID : ", "if_you_dont_see_your_device": "Si vous ne voyez pas votre appareil ci‑dessus, assurez‑vous que votre Ledger est allumé et déverrouillé !", "ignor": "Ignorer", diff --git a/res/values/strings_gn.arb b/res/values/strings_gn.arb index e2ea93646..c5e08c467 100644 --- a/res/values/strings_gn.arb +++ b/res/values/strings_gn.arb @@ -418,6 +418,7 @@ "how_to_use": "Mba’éichapa ojepuru", "how_to_use_card": "Mba’éichapa ojeiporu ko tarjeta", "i_understand": "Aikũmby", + "icon_style": "Estilo icono rehegua", "id": "ID: ", "ignor": "Eheja", "import": "Embohasa", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index d6dab4f5f..af4797bfb 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -530,6 +530,7 @@ "how_to_use": "Yadda ake amfani da shi", "how_to_use_card": "Yadda ake amfani da wannan kati", "i_understand": "Na fahimta", + "icon_style": "Ikon salo", "id": "ID: ", "if_you_dont_see_your_device": "Idan ba ka ga na'urarka a sama ba, da fatan ka tabbatar Ledger ɗinka yana kunne kuma a buɗe!", "ignor": "Yi watsi", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 4073dc5ac..bfb674462 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -530,6 +530,7 @@ "how_to_use": "कैसे उपयोग करें", "how_to_use_card": "इस कार्ड का उपयोग कैसे करें", "i_understand": "मैं समझता/समझती हूँ", + "icon_style": "चिह्न शैली", "id": "ID: ", "if_you_dont_see_your_device": "यदि आपको ऊपर अपना डिवाइस नहीं दिख रहा है, तो कृपया सुनिश्चित करें कि आपका Ledger चालू है और अनलॉक है!", "ignor": "नज़रअंदाज़ करें", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index cf1da0fbb..5a71246df 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -530,6 +530,7 @@ "how_to_use": "Kako koristiti", "how_to_use_card": "Kako koristiti ovu karticu", "i_understand": "Razumijem", + "icon_style": "Stil ikone", "id": "ID: ", "if_you_dont_see_your_device": "Ako gore ne vidite svoj uređaj, provjerite je li vaš Ledger uključen i otključan!", "ignor": "Zanemari", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 191444e9d..75ae49fea 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -530,6 +530,7 @@ "how_to_use": "Ինչպես օգտագործել", "how_to_use_card": "Ինչպես օգտագործել այս քարտը", "i_understand": "Հասկացա", + "icon_style": "Սրբապատկերների ոճը", "id": "ID: ", "if_you_dont_see_your_device": "Եթե վերևում չեք տեսնում ձեր սարքը, համոզվեք, որ ձեր Ledger-ը միացված է և ապակողպված է։", "ignor": "Անտեսել", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 4ade8cd41..5bebc0548 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -530,6 +530,7 @@ "how_to_use": "Cara menggunakan", "how_to_use_card": "Cara menggunakan kartu ini", "i_understand": "Saya mengerti", + "icon_style": "Gaya ikon", "id": "ID: ", "if_you_dont_see_your_device": "Jika Anda tidak melihat perangkat Anda di atas, pastikan Ledger Anda menyala dan tidak terkunci!", "ignor": "Abaikan", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 96906a864..faaf12cac 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -530,6 +530,7 @@ "how_to_use": "Come usare", "how_to_use_card": "Come usare questa carta", "i_understand": "Ho capito", + "icon_style": "Stile dell'icona", "id": "ID: ", "if_you_dont_see_your_device": "Se non vedi il tuo dispositivo qui sopra, assicurati che il tuo Ledger sia acceso e sbloccato!", "ignor": "Ignora", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 3bd828e31..40075ccde 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -531,6 +531,7 @@ "how_to_use": "使い方", "how_to_use_card": "このカードの使い方", "i_understand": "理解しました", + "icon_style": "アイコンのスタイル", "id": "ID: ", "if_you_dont_see_your_device": "上記にデバイスが表示されない場合は、Ledgerが起動していてロック解除されていることを確認してください!", "ignor": "無視", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 2cbc34b80..a91bb57c6 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -530,6 +530,7 @@ "how_to_use": "사용 방법", "how_to_use_card": "이 카드 사용 방법", "i_understand": "이해했습니다", + "icon_style": "아이콘 스타일", "id": "ID: ", "if_you_dont_see_your_device": "위에서 기기가 보이지 않으면 Ledger가 켜져 있고 잠금 해제되어 있는지 확인하세요!", "ignor": "무시", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index bb37d0ad0..a3bd26e59 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -530,6 +530,7 @@ "how_to_use": "အသုံးပြုနည်း", "how_to_use_card": "ဒီကတ်ကို ဘယ်လိုသုံးရမလဲ", "i_understand": "နားလည်ပါတယ်", + "icon_style": "အိုင်ကွန်စတိုင်", "id": "ID: ", "if_you_dont_see_your_device": "အထက်မှာ သင့်စက်ကို မတွေ့ပါက သင့် Ledger ကို ဖွင့်ထားပြီး လော့ခ်ဖွင့်ထားကြောင်း သေချာပါစေ။", "ignor": "လျစ်လျူရှုပါ", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 903399cb7..a45f5daf4 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -528,6 +528,7 @@ "how_to_use": "Hoe te gebruiken", "how_to_use_card": "Hoe je deze kaart gebruikt", "i_understand": "Ik begrijp het", + "icon_style": "Pictogramstijl", "id": "ID: ", "if_you_dont_see_your_device": "Als je je apparaat hierboven niet ziet, zorg er dan voor dat je Ledger ontgrendeld is!", "ignor": "Negeren", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index dec73dc17..757b6d4f9 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -529,6 +529,7 @@ "how_to_use": "Jak używać", "how_to_use_card": "Jak używać tej karty", "i_understand": "Rozumiem", + "icon_style": "Styl ikony", "id": "ID: ", "if_you_dont_see_your_device": "Jeśli nie widzisz swojego urządzenia powyżej, upewnij się, że Twój Ledger jest aktywny i odblokowany!", "ignor": "Ignoruj", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 5fd2359a0..751a4183c 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -530,6 +530,7 @@ "how_to_use": "Como usar", "how_to_use_card": "Como usar este cartão", "i_understand": "Eu entendo", + "icon_style": "Estilo do ícone", "id": "ID: ", "if_you_dont_see_your_device": "Se você não vir seu dispositivo acima, verifique se o seu Ledger está ligado e desbloqueado!", "ignor": "Ignorar", diff --git a/res/values/strings_pt_BR.arb b/res/values/strings_pt_BR.arb index c411aca23..8c8e8083d 100644 --- a/res/values/strings_pt_BR.arb +++ b/res/values/strings_pt_BR.arb @@ -527,6 +527,7 @@ "how_to_use": "Como usar", "how_to_use_card": "Como usar este cartão", "i_understand": "Eu entendo", + "icon_style": "Estilo do ícone", "id": "ID: ", "if_you_dont_see_your_device": "Se você não vir seu dispositivo acima, certifique-se de que seu Ledger esteja ligado e desbloqueado!", "ignor": "Ignorar", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 0d62647f7..df01fd237 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -530,6 +530,7 @@ "how_to_use": "Как использовать", "how_to_use_card": "Как пользоваться этой картой", "i_understand": "Я понимаю", + "icon_style": "Стиль иконок", "id": "ID: ", "if_you_dont_see_your_device": "Если вы не видите свое устройство выше, пожалуйста, убедитесь, что ваш Ledger включен и разблокирован!", "ignor": "Игнорировать", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 1fbf7d673..913e2b4b9 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -530,6 +530,7 @@ "how_to_use": "วิธีใช้งาน", "how_to_use_card": "วิธีใช้การ์ดนี้", "i_understand": "ฉันเข้าใจ", + "icon_style": "สไตล์ไอคอน", "id": "ID: ", "if_you_dont_see_your_device": "หากคุณไม่เห็นอุปกรณ์ของคุณด้านบน โปรดตรวจสอบให้แน่ใจว่า Ledger ของคุณเปิดอยู่และปลดล็อกแล้ว!", "ignor": "เพิกเฉย", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index afaad1d6d..be9395531 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -530,6 +530,7 @@ "how_to_use": "Paano gamitin", "how_to_use_card": "Paano gamitin ang card na ito", "i_understand": "Naiintindihan ko", + "icon_style": "Estilo ng icon", "id": "ID: ", "if_you_dont_see_your_device": "Kung hindi mo nakikita ang iyong device sa itaas, pakitiyak na gising at naka-unlock ang iyong Ledger!", "ignor": "Huwag pansinin", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 3ce254f3d..68b93fe38 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -530,6 +530,7 @@ "how_to_use": "Nasıl kullanılır", "how_to_use_card": "Bu kart nasıl kullanılır", "i_understand": "Anladım", + "icon_style": "Simge stili", "id": "ID: ", "if_you_dont_see_your_device": "Cihazınızı yukarıda görmüyorsanız, lütfen Ledger'ınızın açık, uyanık ve kilidinin açılmış olduğundan emin olun!", "ignor": "Yoksay", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 0e6582989..0a869100c 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -530,6 +530,7 @@ "how_to_use": "Як користуватися", "how_to_use_card": "Як користуватися цією карткою", "i_understand": "Я розумію", + "icon_style": "Стиль значка", "id": "ID: ", "if_you_dont_see_your_device": "Якщо ви не бачите свій пристрій вище, будь ласка, переконайтеся, що ваш Ledger увімкнений і розблокований!", "ignor": "Ігнорувати", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 676c5e266..bdb0906b3 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -530,6 +530,7 @@ "how_to_use": "استعمال کرنے کا طریقہ", "how_to_use_card": "اس کارڈ کو استعمال کرنے کا طریقہ", "i_understand": "میں سمجھ گیا/گئی ہوں", + "icon_style": "آئیکن اسٹائل", "id": "ID: ", "if_you_dont_see_your_device": "اگر آپ کو اوپر اپنا ڈیوائس نظر نہیں آ رہا، تو براہِ کرم یقینی بنائیں کہ آپ کا Ledger آن ہے اور اَن لاک ہے!", "ignor": "نظر انداز کریں", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 4a921b4a1..038e04b09 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -529,6 +529,7 @@ "how_to_use": "Cách sử dụng", "how_to_use_card": "Cách sử dụng thẻ này", "i_understand": "Tôi hiểu", + "icon_style": "Kiểu biểu tượng", "id": "ID: ", "if_you_dont_see_your_device": "Nếu bạn không thấy thiết bị của mình ở trên, hãy đảm bảo rằng Ledger của bạn đang bật và đã được mở khóa!", "ignor": "Bỏ qua", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index c46c4caf0..a1f40d41e 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -531,6 +531,7 @@ "how_to_use": "Bí a ṣe lè lò", "how_to_use_card": "Báwo ni a ṣe ń lo káàdì yìí", "i_understand": "Mo ye mi", + "icon_style": "Aami ara", "id": "ID: ", "if_you_dont_see_your_device": "Ti o ko ba ri ẹrọ rẹ loke, jọwọ rii daju pe Ledger rẹ wa ni titan ati pe o ti ṣí i silẹ!", "ignor": "Foju kọ", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 9a0956ac8..22ed313bc 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -530,6 +530,7 @@ "how_to_use": "如何使用", "how_to_use_card": "如何使用此卡", "i_understand": "我明白了", + "icon_style": "图标风格", "id": "ID: ", "if_you_dont_see_your_device": "如果您在上方看不到您的设备,请确保您的 Ledger 已唤醒并已解锁!", "ignor": "忽略", diff --git a/res/values/strings_zh_tw.arb b/res/values/strings_zh_tw.arb index 12c458ed8..c2ea4aa0c 100644 --- a/res/values/strings_zh_tw.arb +++ b/res/values/strings_zh_tw.arb @@ -460,6 +460,7 @@ "how_to_connect": "如何連線", "how_to_use": "如何使用", "how_to_use_card": "如何使用這張卡", + "icon_style": "圖示樣式", "id": "ID:", "if_you_dont_see_your_device": "如果您在上方看不到您的裝置,請確認您的 Ledger 已喚醒並解鎖!", "ignor": "忽略",