From a93d93dd486de4d447682b05aff49faee721c20f Mon Sep 17 00:00:00 2001 From: Oleksandr Sobol Date: Tue, 1 Sep 2020 20:06:41 +0300 Subject: [PATCH 1/7] CAKE-29 | fixed call of contact list page --- lib/di.dart | 7 +++++-- lib/router.dart | 22 ++-------------------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/lib/di.dart b/lib/di.dart index 83846c80b..7221b8964 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -290,8 +290,11 @@ Future setup( getIt.registerFactory(() => ContactListViewModel( getIt.get().contactListStore, getIt.get())); - getIt.registerFactory( - () => ContactListPage(getIt.get())); + /*getIt.registerFactory( + () => ContactListPage(getIt.get()));*/ + + getIt.registerFactoryParam((bool isEditable, _) => + ContactListPage(getIt.get(), isEditable: isEditable)); getIt.registerFactoryParam((Contact contact, _) => ContactPage(getIt.get(param1: contact))); diff --git a/lib/router.dart b/lib/router.dart index 68e010293..9fd37dca3 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -340,11 +340,11 @@ class Router { case Routes.addressBook: return MaterialPageRoute( - builder: (_) => getIt.get()); + builder: (_) => getIt.get(param1: true)); case Routes.pickerAddressBook: return MaterialPageRoute( - builder: (_) => getIt.get()); + builder: (_) => getIt.get(param1: false)); case Routes.addressBookAddContact: return CupertinoPageRoute( @@ -360,24 +360,6 @@ class Router { return CupertinoPageRoute( builder: (_) => getIt.get()); - /*MultiProvider( - providers: [ - ProxyProvider( - update: (_, settingsStore, __) => ExchangeTradeStore( - trade: settings.arguments as Trade, - walletStore: walletStore, - trades: trades), - ), - ProxyProvider( - update: (_, settingsStore, __) => SendStore( - transactionDescriptions: transactionDescriptions, - walletService: walletService, - settingsStore: settingsStore, - priceStore: priceStore)), - ], - child: ExchangeTradePage(), - ));*/ - case Routes.exchangeConfirm: return MaterialPageRoute( builder: (_) => getIt.get()); From 9da460da48e0430458a4a6df93cc5be528e20b05 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Tue, 1 Sep 2020 22:04:00 +0300 Subject: [PATCH 2/7] CAKE-31 | applied new design to restore buttons --- assets/images/2.0x/backup.png | Bin 5087 -> 5275 bytes assets/images/2.0x/restore_keys.png | Bin 5362 -> 5508 bytes assets/images/2.0x/restore_seed.png | Bin 4989 -> 5180 bytes assets/images/2.0x/restore_wallet_image.png | Bin 4204 -> 4392 bytes assets/images/3.0x/backup.png | Bin 8528 -> 8976 bytes assets/images/3.0x/restore_keys.png | Bin 8826 -> 9161 bytes assets/images/3.0x/restore_seed.png | Bin 8826 -> 9188 bytes assets/images/3.0x/restore_wallet_image.png | Bin 6930 -> 7359 bytes assets/images/backup.png | Bin 2026 -> 2021 bytes assets/images/restore_keys.png | Bin 2232 -> 2293 bytes assets/images/restore_seed.png | Bin 2077 -> 2175 bytes assets/images/restore_wallet_image.png | Bin 1747 -> 1886 bytes cw_monero/pubspec.lock | 31 +++--- ios/Podfile | 91 ++++++++++-------- ios/Podfile.lock | 6 +- ios/Runner.xcodeproj/project.pbxproj | 31 ++++++ lib/di.dart | 3 - .../restore/widgets/restore_button.dart | 9 +- 18 files changed, 103 insertions(+), 68 deletions(-) diff --git a/assets/images/2.0x/backup.png b/assets/images/2.0x/backup.png index 044e494a9d318eb9d1720809fc551d8b09aebfdb..5cf40bba74cd6bd9cbcf4bfcbde47586b02f9d70 100644 GIT binary patch delta 5237 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 delta 5048 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 diff --git a/assets/images/2.0x/restore_keys.png b/assets/images/2.0x/restore_keys.png index db52a8a2fb6cd85cb58e5b78f8a682f7871a5292..6a90ef2c2496b783ba6556cf5a675c15b653fe72 100644 GIT binary patch delta 5472 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 diff --git a/assets/images/2.0x/restore_seed.png b/assets/images/2.0x/restore_seed.png index ae32393cc2b88c5415205131b0b8934565f76825..2bbea22cfffa1a453186cd0dac1d0ea7eee6a8eb 100644 GIT binary patch delta 5141 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 delta 4157 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 Hu0mjfDo!!2 diff --git a/assets/images/3.0x/backup.png b/assets/images/3.0x/backup.png index 48737c9b2b106e2aaea0b59deea168312f75c9d9..5971200dcb7ff841bf64d94ca109dc26bb77f8e2 100644 GIT binary patch delta 8968 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 delta 8516 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 M07*qoM6N<$f|N0}sQ>@~ delta 8816 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 nX_Zf delta 8816 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 delta 1962 zcmV;b2UYmx59$w)R)2pm1zz7cA%zbx+UNuity$>y-i${ar`S$$uBf(JA4CAcAu2E(v#u zekdf7B`Ji;?ofF>HwjOc2juUeDKI8`pE5n)9QX4J(vNfgJ=!sj7H%vQI$}g*^tZtZ z#@6w2+gZ_-{=?3HSV~2XC(ECGoAnN3up+`8O35D)JQm}IeOLgxobX^sdGP3v!YYQ% zAZ6C)08kaNuzwlMebT1x+>OOUkRiZb!kFD_UntCqhbT|}JS__)w}K$JgvSGbShhTk zh29w*{H?p`X7x=Sar@c#boKJD^#-?>-s_j1dMDkS|Cyc<4_MxOW~$8=wT@1X>J|Hf zBt@f28i-0dP}AIY193L($!az@D3g|zg3kITk!XvGOMjdF(wJ`ZsLqSauW^9v2JAD3 zViR2bVOyb{b-PSYNg^harMtSi-#2@`d*SYdmkn>7c=oQT-uoPM`_R3T=?)|dt}!f% za>pM7*v~)?+b(Zw2AkmhzL-eTkJZ_95BEJO27B^srW0p1o^`Bf@J~@5!)L`&3(_Z; z)%LQB#ea=hQzS$1ftW=4v0DR>u8u|Q{$qdQ0kZC2qMOF_Z}+iV8w2Rm(D)po&tvyn za3F~<-}a#LE%v}kradbrksIIi>Eg_&uK5YN1As2O#sK;xdLKf2Pu66jcDSAH({-t2 z7WO)5xq+LueSJq9hq$9EdF8KqS2|gAfqCq;FMmDK6%R=+tb)yiS_P!5w`xIcs1Jov zHE_ahnTFd-?X;8mB*=lSO1a~*Sf(<{BMtpbZ+Y<3u$}wR(AnM4eJpQM9-KUs`-k&- zhJt|{F_Ux$13l)K%8vwJdRB5&6qI{q&ZmA_%kx0T?B+5Ixvvm|lNrAfF93t8+uxA<-n=?{ZW^Ws!{=`U$ne`IIYzjoqkwB0ZDJ_?uhhhd|+AmdL9 zqOw87!oDq|T$skLm0+Bhw^drVbMxC_bASGab{#uV8hwW?2x|x9AERJ3HL{6T8zs#p z(+jI;U)5<)M%sx6ealgOT}&tp?9rZy#J*j|_7}Ye!6mX13_ns5;C9*75U^t@#d9$n zXKX@F&Xgx=z7JW2^=2fAPa@y=sh)YH=eDs^b$q1*V^p;XO1GX1)vfP@TwHz;h<_sK z@;Z{lW0g8$A(zlQ=KYB}L88tAUX@rY2UM7)FP|aL;8TBNI5; zTG}T6pXyw&j2zj$6$NXHe>N4TsV+2ij5Bl1xv_M1=lm))Txz#TD7M-hY1_aN0@Y7p zSw8i4x`&D4^~Vcm!~>G~RXwAWdLM~>jcE(t*m9{TJ1zIHrKhH3SbF10`N8Nr=j&8T zP%gC^8TiWcZWp)+7NiCyT7SK~X?8&Y?TmUt88ct!}0# zF=-V*tND@8(-e`)j+;J`__UTCGnrdO7B@Lv2`Pr967ji$50~N~JAbg>VUgQu-(0?V zMr6C@W@D}5Exs8bR`Ro@L!~f|%h~R2! z#Jc0C)>w>@UEkpox`-#s7oSp6G1Y}-V-z11ey-x+wD?E6{q%2>=*ZY4XuE-2gOxkD z$n5Lum555tBC-+9$A1E_RgAuh0QiJSS0z2GVZC{}3_zqJQg)1tjK{&@y(3+!b1^ zA%V|k;CNAP3)b7Ssq+7H9GeA)0_v(Gf;j(>wZl~OnE)J0<-1%p wi%U3zOe61}$|Lh8M?3;bHQ&A_k5K4;0d*oW>0BW<+W-In07*qoM6N<$f)p3f0{{R3 diff --git a/assets/images/restore_keys.png b/assets/images/restore_keys.png index cc1d806916c0c86cd91fc9887c30b791f840528a..bbb7890f154dae531a75755a992ac1b945d0e0f9 100644 GIT binary patch delta 2231 zcmV;o2uSz15%m#}R)2~~L_t(|0j*eXY+F|qKljgb;-sO;zN30bNKBg4M4}%Cm7EO9 zx-MIv1r1$QlIOy<79`>b2_!bK&D2dyVsQjg+EIu@VcI&aaY|`Iw-QH4Oo*|h+9$qH z_wx{SA&H&$-o0n%+KKC=c48+zQsVdSyZ794f9L;Y@PO#m<9~&a#l(cr&+Bo4czmruIG;IfYxu*Kzq)q}-A4*)JI zh6`^Tqi?&U9V3`mNPtz`B0@qyKZrQxSS<5=`^>j>zHyj~7$!UE_dL=vy0#h4jCeYy~8FUnY( zhM{&JJKGgNo5nkB3Z`4NPDa*Hdz*xlpke}fp3EZAe}5%7*~q@z3V50XvjmG%_y`Nc zX$f-V=V_KR-<%h4xJ~Iq(8tAgV404hzS#;s>``ogn+LIWg`pN7M-I)jrOf;(yAWas zajC%}kIzc*lZUQ$WSbVyiD9Q$)_^ zwB|Ga@qdOwF3+F3BunVb^cUi-8WSXBXhlGq zHfSwEw*WmPH9Jb)$1DzMjyyB|Yc{`m;lLSvt3_k>;&~A@@85o2PknYp^?rU?L8yp} zU!Do}neptCE2D&@BVG65o@`gXn#bH>LX-p9G=Dm@Up@ekA!Mg}stzNc`5q1lFbuGp zr0t}5mL-EuYM)J>PqTcjQ$77%-vJ~KX1o$w4B8a?q7V59?Y^E^AIFx}Bwq6&cuEs z^ncRl%C=~T93=aY3!|Db6B^PLAu?V0j}9&8gl6H*0Vm44D{+JiK}Mg-e0jhR#?gV}JTKG()I+NK-L#P@W-s>O6kh>ur27X34O- z9p_$9u16n`%IGHy%$kD+>Eo~dzn4JU>#5>A&yXEa0M3!Wgd1f5Eh0;Y%1Nmvwx4Vz z2=Uurc)w*D8YBtOOR(R5B-@oMr#jU0+C;y}gWEnTmkLqR24ByJ|%{&;*VDMp9taNm~2xrcXvi zi~m~*ey%!$)FaC8-HfzYdiJa^d4D}F`784k0W%bk$FbgG* zCtqOqO1O%E7suH=L7PXWn~RCcoOZY2VbpSh*y1NIhn72(l@hi1%UXlKqAU?RVH4TFjHqUXKlS#S|16z_1QHr#OiwSQ?po$0rP+}MHHU~;?t z8@^fi*|*#Yx)lg}zV~>d>hACCiKT7}0)HXzo$hcI3n0h6N<&bgEj`_L@Vz}10q3Y6 z=BqeI6;Srz?0=qUBl|XdH=~6$LMpo(LsQa89bM;qSpitP>Gb~Syw_1cNm35m=Wnmfa9%Zi7-acrr(RaX4cpIvf34c=I<%qk#dTgeDHGaLnpl>`? zd>wW`JHEjD<-ls3f^>q=Oe;^7vO@KD)00S5oT9szFx`fYeC=xM80>&{bw@o;7w1B; zIZ12+RPdf$>x(Z(R*!OxY3f<>mKOHmtAU%aL)!Hv`UD|`g06d!eV-g)QfdsDwvlTX z1KyH|WH5GTZx7^_A4-C{-7QQ{kvHc^^~qzIU=|(#eG0!<*M?jQw)_A9002ovPDHLk FV1lu}NTL7$ delta 2169 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 diff --git a/assets/images/restore_wallet_image.png b/assets/images/restore_wallet_image.png index 4bd343eb384a97ca912afae86d5e8103cf46f7e7..9fee53f1d1fb3bc12a97088dc36d96561ab68d86 100644 GIT binary patch delta 1821 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 br}-B%v*a^VB`oLw015yANkvXXu0mjfo>V?1 diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock index f462e288d..0aa42cd07 100644 --- a/cw_monero/pubspec.lock +++ b/cw_monero/pubspec.lock @@ -7,42 +7,42 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.13" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.2" + version: "1.6.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.0.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.3" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.14.12" convert: dependency: transitive description: @@ -56,7 +56,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.4" ffi: dependency: "direct main" description: @@ -80,7 +80,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.12" matcher: dependency: transitive description: @@ -109,13 +109,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.4.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0+1" petitparser: dependency: transitive description: @@ -136,7 +129,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.3" sky_engine: dependency: transitive description: flutter @@ -148,7 +141,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.7.0" stack_trace: dependency: transitive description: @@ -183,7 +176,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.2.15" typed_data: dependency: transitive description: @@ -204,7 +197,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.5.0" + version: "3.6.1" sdks: dart: ">=2.6.0 <3.0.0" flutter: ">=0.1.4 <2.0.0" diff --git a/ios/Podfile b/ios/Podfile index 78d39756e..6697f0a53 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -15,59 +15,72 @@ def parse_KV_file(file, separator='=') if !File.exists? file_abs_path return []; end - pods_ary = [] + generated_key_values = {} skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) { |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - pods_ary.push({:name => podname, :path => podpath}); - else - puts "Invalid plugin specification: #{line}" - end - } - return pods_ary + File.foreach(file_abs_path) do |line| + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } + plugin = line.split(pattern=separator) + if plugin.length == 2 + podname = plugin[0].strip() + path = plugin[1].strip() + podpath = File.expand_path("#{path}", file_abs_path) + generated_key_values[podname] = podpath + else + puts "Invalid plugin specification: #{line}" + end + end + generated_key_values end target 'Runner' do - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. use_frameworks! - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') + use_modular_headers! - # Flutter Pods - generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') - if generated_xcode_build_settings.empty? - puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first." - end - generated_xcode_build_settings.map { |p| - if p[:name] == 'FLUTTER_FRAMEWORK_DIR' - symlink = File.join('.symlinks', 'flutter') - File.symlink(File.dirname(p[:path]), symlink) - pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) + # Flutter Pod + + copied_flutter_dir = File.join(__dir__, 'Flutter') + copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') + copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') + unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) + # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. + # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. + # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. + + generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') + unless File.exist?(generated_xcode_build_settings_path) + raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" end - } + generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) + cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; + + unless File.exist?(copied_framework_path) + FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) + end + unless File.exist?(copied_podspec_path) + FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) + end + end + + # Keep pod path relative so it can be checked into Podfile.lock. + pod 'Flutter', :path => 'Flutter' # Plugin Pods - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.map { |p| - symlink = File.join('.symlinks', 'plugins', p[:name]) - File.symlink(p[:path], symlink) - pod p[:name], :path => File.join(symlink, 'ios') - } -end -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock + # referring to absolute paths on developers' machines. + system('rm -rf .symlinks') + system('mkdir -p .symlinks/plugins') + plugin_pods = parse_KV_file('../.flutter-plugins') + plugin_pods.each do |name, path| + symlink = File.join('.symlinks', 'plugins', name) + File.symlink(path, symlink) + pod name, :path => File.join(symlink, 'ios') + end +end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '4.0' # required by simple_permission config.build_settings['ENABLE_BITCODE'] = 'NO' end end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 959c597e1..3429d8968 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -61,7 +61,7 @@ DEPENDENCIES: - cw_monero (from `.symlinks/plugins/cw_monero/ios`) - devicelocale (from `.symlinks/plugins/devicelocale/ios`) - esys_flutter_share (from `.symlinks/plugins/esys_flutter_share/ios`) - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `Flutter`) - flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - local_auth (from `.symlinks/plugins/local_auth/ios`) @@ -92,7 +92,7 @@ EXTERNAL SOURCES: esys_flutter_share: :path: ".symlinks/plugins/esys_flutter_share/ios" Flutter: - :path: ".symlinks/flutter/ios" + :path: Flutter flutter_plugin_android_lifecycle: :path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios" flutter_secure_storage: @@ -145,6 +145,6 @@ SPEC CHECKSUMS: url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313 url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c -PODFILE CHECKSUM: f1916a43bb28badbd408be80e8e4b8652a74e93e +PODFILE CHECKSUM: c34e2287a9ccaa606aeceab922830efb9a6ff69a COCOAPODS: 1.9.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 54901a5a7..40ffc72b1 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -272,9 +272,40 @@ files = ( ); inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../Flutter/Flutter.framework", + "${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework", + "${BUILT_PRODUCTS_DIR}/SwiftProtobuf/SwiftProtobuf.framework", + "${BUILT_PRODUCTS_DIR}/barcode_scan/barcode_scan.framework", + "${BUILT_PRODUCTS_DIR}/cw_monero/cw_monero.framework", + "${BUILT_PRODUCTS_DIR}/devicelocale/devicelocale.framework", + "${BUILT_PRODUCTS_DIR}/esys_flutter_share/esys_flutter_share.framework", + "${BUILT_PRODUCTS_DIR}/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework", + "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework", + "${BUILT_PRODUCTS_DIR}/local_auth/local_auth.framework", + "${BUILT_PRODUCTS_DIR}/package_info/package_info.framework", + "${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework", + "${BUILT_PRODUCTS_DIR}/share/share.framework", + "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework", + "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftProtobuf.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/barcode_scan.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/cw_monero.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/devicelocale.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/esys_flutter_share.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_plugin_android_lifecycle.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/lib/di.dart b/lib/di.dart index 7221b8964..a15c1811a 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -290,9 +290,6 @@ Future setup( getIt.registerFactory(() => ContactListViewModel( getIt.get().contactListStore, getIt.get())); - /*getIt.registerFactory( - () => ContactListPage(getIt.get()));*/ - getIt.registerFactoryParam((bool isEditable, _) => ContactListPage(getIt.get(), isEditable: isEditable)); diff --git a/lib/src/screens/restore/widgets/restore_button.dart b/lib/src/screens/restore/widgets/restore_button.dart index ba07d1fe8..72630492f 100644 --- a/lib/src/screens/restore/widgets/restore_button.dart +++ b/lib/src/screens/restore/widgets/restore_button.dart @@ -19,12 +19,12 @@ class RestoreButton extends StatelessWidget { onTap: onPressed, child: Container( width: double.infinity, - height: 150, + height: 160, padding: EdgeInsets.all(24), alignment: Alignment.topLeft, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(12)), - color: Theme.of(context).accentTextTheme.title.backgroundColor, + color: Theme.of(context).accentTextTheme.caption.color, ), child: Row( mainAxisSize: MainAxisSize.max, @@ -44,7 +44,7 @@ class RestoreButton extends StatelessWidget { title, style: TextStyle( fontSize: 16, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.title.color ), ), @@ -54,7 +54,8 @@ class RestoreButton extends StatelessWidget { description, style: TextStyle( fontSize: 14, - color: Theme.of(context).primaryTextTheme.caption.color + fontWeight: FontWeight.normal, + color: Theme.of(context).primaryTextTheme.overline.color ), ), ) From 9c2d3d339f1a8fdeb17c02ed1c27c08cc9f20a6d Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Wed, 2 Sep 2020 21:31:43 +0300 Subject: [PATCH 3/7] CAKE-31 | applied new design to restore wallet from seed page and seed widget --- lib/router.dart | 2 +- .../restore_wallet_from_seed_page.dart | 51 ++++-- lib/src/widgets/seed_widget.dart | 170 ++++++++++-------- lib/themes.dart | 2 + 4 files changed, 134 insertions(+), 91 deletions(-) diff --git a/lib/router.dart b/lib/router.dart index 9fd37dca3..ccff5677a 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -196,7 +196,7 @@ class Router { ? Routes.seedLanguage : Routes.restoreWalletFromKeys; final args = type == WalletType.monero - ? [type, Routes.restoreWalletFromSeed] + ? [type, Routes.restoreWalletFromKeys] : [type]; Navigator.of(context).pushNamed(route, arguments: args); diff --git a/lib/src/screens/restore/restore_wallet_from_seed_page.dart b/lib/src/screens/restore/restore_wallet_from_seed_page.dart index 5c46b32ef..bc30a48d8 100644 --- a/lib/src/screens/restore/restore_wallet_from_seed_page.dart +++ b/lib/src/screens/restore/restore_wallet_from_seed_page.dart @@ -20,20 +20,40 @@ class RestoreWalletFromSeedPage extends BasePage { String get title => S.current.restore_title_from_seed; @override - Color get backgroundLightColor => Palette.lavender; + Color get titleColor => Colors.white; @override - Color get backgroundDarkColor => PaletteDark.lightNightBlue; + Color get backgroundLightColor => Colors.transparent; + + @override + Color get backgroundDarkColor => Colors.transparent; + + @override + bool get resizeToAvoidBottomPadding => false; @override Widget body(BuildContext context) => - RestoreFromSeedForm(key: formKey, type: type, language: language); + RestoreFromSeedForm(key: formKey, type: type, language: language, + leading: leading(context), middle: middle(context)); + + @override + Widget build(BuildContext context) { + return Scaffold( + resizeToAvoidBottomPadding: resizeToAvoidBottomPadding, + body: Container( + color: Theme.of(context).backgroundColor, + child: body(context) + ) + ); + } } class RestoreFromSeedForm extends StatefulWidget { - RestoreFromSeedForm({Key key, this.type, this.language}) : super(key: key); + RestoreFromSeedForm({Key key, this.type, this.language, this.leading, this.middle}) : super(key: key); final WalletType type; final String language; + final Widget leading; + final Widget middle; @override _RestoreFromSeedFormState createState() => _RestoreFromSeedFormState(); @@ -49,18 +69,17 @@ class _RestoreFromSeedFormState extends State { return GestureDetector( onTap: () => SystemChannels.textInput.invokeMethod('TextInput.hide'), - child: Container( - color: Theme.of(context).backgroundColor, - child: SeedWidget( - key: _seedKey, - maxLength: mnemonicLength(widget.type), - onMnemonicChange: (seed) => null, - onFinish: () => Navigator.of(context).pushNamed( - Routes.restoreWalletFromSeedDetails, - arguments: [widget.type, widget.language, mnemonic()]), - validator: - SeedValidator(type: widget.type, language: widget.language), - ), + child: SeedWidget( + key: _seedKey, + maxLength: mnemonicLength(widget.type), + onMnemonicChange: (seed) => null, + onFinish: () => Navigator.of(context).pushNamed( + Routes.restoreWalletFromSeedDetails, + arguments: [widget.type, widget.language, mnemonic()]), + leading: widget.leading, + middle: widget.middle, + validator: + SeedValidator(type: widget.type, language: widget.language), ), ); } diff --git a/lib/src/widgets/seed_widget.dart b/lib/src/widgets/seed_widget.dart index c9b918556..5da136c74 100644 --- a/lib/src/widgets/seed_widget.dart +++ b/lib/src/widgets/seed_widget.dart @@ -6,6 +6,7 @@ import 'package:cake_wallet/core/seed_validator.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/domain/common/mnemonic_item.dart'; import 'package:cake_wallet/generated/i18n.dart'; +import 'package:flutter/widgets.dart'; class SeedWidget extends StatefulWidget { SeedWidget( @@ -13,6 +14,8 @@ class SeedWidget extends StatefulWidget { this.maxLength, this.onMnemonicChange, this.onFinish, + this.leading, + this.middle, this.validator}) : super(key: key); @@ -20,6 +23,8 @@ class SeedWidget extends StatefulWidget { final Function(List) onMnemonicChange; final Function() onFinish; final SeedValidator validator; + final Widget leading; + final Widget middle; @override SeedWidgetState createState() => SeedWidgetState(maxLength: maxLength); @@ -199,74 +204,91 @@ class SeedWidgetState extends State { child: Column(children: [ Flexible( fit: FlexFit.tight, - flex: 1, + flex: 2, child: Container( width: double.infinity, height: double.infinity, - padding: EdgeInsets.all(24), + padding: EdgeInsets.all(0), decoration: BoxDecoration( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)), - color: Theme.of(context).accentTextTheme.title.backgroundColor), - child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - S.of(context).restore_active_seed, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).primaryTextTheme.caption.color), - ), - Padding( - padding: EdgeInsets.only(top: 5), - child: Wrap( - children: items.map((item) { - final isValid = widget.validator.isValid(item); - final isSelected = selectedItem == item; - - return InkWell( - onTap: () => onMnemonicTap(item), - child: Container( - decoration: BoxDecoration( - color: isValid - ? Colors.transparent - : Palette.red), - margin: EdgeInsets.only(right: 7, bottom: 8), - child: Text( - item.toString(), - style: TextStyle( - color: isValid - ? Theme.of(context) - .primaryTextTheme - .title - .color - : Theme.of(context) - .primaryTextTheme - .caption - .color, - fontSize: 16, - fontWeight: isSelected - ? FontWeight.w900 - : FontWeight.w400, - decoration: isSelected - ? TextDecoration.underline - : TextDecoration.none), - )), - ); - }).toList(), - )) + gradient: LinearGradient(colors: [ + Theme.of(context).primaryTextTheme.subhead.color, + Theme.of(context).primaryTextTheme.subhead.decorationColor, ], - ), + begin: Alignment.topLeft, + end: Alignment.bottomRight) ), + child: Column( + children: [ + CupertinoNavigationBar( + leading: widget.leading, + middle: widget.middle, + backgroundColor: Colors.transparent, + border: null, + ), + Expanded( + child: Container( + padding: EdgeInsets.all(24), + alignment: Alignment.topLeft, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + S.of(context).restore_active_seed, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: + Theme.of(context).textTheme.overline.backgroundColor), + ), + Padding( + padding: EdgeInsets.only(top: 5), + child: Wrap( + children: items.map((item) { + final isValid = widget.validator.isValid(item); + final isSelected = selectedItem == item; + + return InkWell( + onTap: () => onMnemonicTap(item), + child: Container( + decoration: BoxDecoration( + color: isValid + ? Colors.transparent + : Palette.red), + margin: EdgeInsets.only(right: 7, bottom: 8), + child: Text( + item.toString(), + style: TextStyle( + color: isValid + ? Colors.white + : Colors.grey, + fontSize: 16, + fontWeight: isSelected + ? FontWeight.w900 + : FontWeight.w600, + decoration: isSelected + ? TextDecoration.underline + : TextDecoration.none), + )), + ); + }).toList(), + )) + ], + ), + ), + ) + ) + ], + ) ), ), Flexible( fit: FlexFit.tight, - flex: 2, + flex: 3, child: Padding( padding: EdgeInsets.only(left: 24, top: 48, right: 24, bottom: 24), @@ -277,8 +299,8 @@ class SeedWidgetState extends State { Text( S.of(context).restore_new_seed, style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, + fontSize: 20, + fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.title.color), ), @@ -291,6 +313,7 @@ class SeedWidgetState extends State { : null, style: TextStyle( fontSize: 16.0, + fontWeight: FontWeight.normal, color: Theme.of(context).primaryTextTheme.title.color), controller: _seedController, @@ -306,10 +329,11 @@ class SeedWidgetState extends State { Text('${items.length}/$maxLength', style: TextStyle( color: Theme.of(context) - .primaryTextTheme - .caption - .color, - fontSize: 14)), + .accentTextTheme + .display2 + .decorationColor, + fontWeight: FontWeight.normal, + fontSize: 16)), SizedBox(width: 10), InkWell( onTap: () async => @@ -322,17 +346,14 @@ class SeedWidgetState extends State { decoration: BoxDecoration( color: Theme.of(context) .accentTextTheme - .title - .backgroundColor, + .caption + .color, borderRadius: BorderRadius.circular(10.0)), child: Text( S.of(context).paste, style: TextStyle( - color: Theme.of(context) - .primaryTextTheme - .title - .color), + color: Palette.blueCraiola), )), ) ], @@ -341,20 +362,21 @@ class SeedWidgetState extends State { ), hintStyle: TextStyle( color: Theme.of(context) - .primaryTextTheme - .caption - .color, + .accentTextTheme + .display2 + .decorationColor, + fontWeight: FontWeight.normal, fontSize: 16), hintText: S.of(context).restore_from_seed_placeholder, errorText: _errorMessage, focusedBorder: UnderlineInputBorder( borderSide: BorderSide( - color: Theme.of(context).dividerColor, + color: Theme.of(context).accentTextTheme.subtitle.backgroundColor, width: 1.0)), enabledBorder: UnderlineInputBorder( borderSide: BorderSide( - color: Theme.of(context).dividerColor, + color: Theme.of(context).accentTextTheme.subtitle.backgroundColor, width: 1.0))), enableInteractiveSelection: false, ), @@ -386,7 +408,7 @@ class SeedWidgetState extends State { onPressed: () => widget.onFinish != null ? widget.onFinish() : null, - color: Colors.green, + color: Palette.blueCraiola, textColor: Colors.white) : PrimaryButton( text: selectedItem != null @@ -397,7 +419,7 @@ class SeedWidgetState extends State { : null, onDisabledPressed: () => showErrorIfExist(), isDisabled: !isCurrentMnemonicValid, - color: Colors.green, + color: Palette.blueCraiola, textColor: Colors.white), ), ) diff --git a/lib/themes.dart b/lib/themes.dart index a25a61de1..452264e21 100644 --- a/lib/themes.dart +++ b/lib/themes.dart @@ -154,6 +154,7 @@ class Themes { ), display2: TextStyle( color: Palette.shadowWhite, // action button color (address text field) + decorationColor: Palette.darkGray // hint text (seed widget) ), ), @@ -320,6 +321,7 @@ class Themes { ), display2: TextStyle( color: PaletteDark.nightBlue, // action button color (address text field) + decorationColor: PaletteDark.darkCyanBlue // hint text (seed widget) ), ), From f1ec962b61887b29121238cecdc44f6b19dfa605 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Fri, 4 Sep 2020 13:40:28 +0300 Subject: [PATCH 4/7] CAKE-31 | created wallet_restoration_from_keys_vm; applied new design to restore_wallet_from_keys_page, restore_wallet_from_seed_details, new_wallet_page, new_wallet_type_page, seed_language_page; reworked seed_language_selector, seed_language_picker, select_button --- lib/di.dart | 11 + lib/router.dart | 17 +- .../screens/new_wallet/new_wallet_page.dart | 27 +- .../new_wallet/new_wallet_type_page.dart | 31 ++- .../new_wallet/widgets/select_button.dart | 27 +- .../restore_wallet_from_keys_page.dart | 204 ++++++---------- .../restore_wallet_from_seed_details.dart | 26 +- .../seed_language/seed_language_page.dart | 16 +- .../widgets/seed_language_picker.dart | 230 +++++++----------- lib/src/widgets/blockchain_height_widget.dart | 50 +--- lib/src/widgets/seed_language_selector.dart | 6 +- lib/themes.dart | 8 + .../wallet_restoration_from_keys_vm.dart | 64 +++++ 13 files changed, 323 insertions(+), 394 deletions(-) create mode 100644 lib/view_model/wallet_restoration_from_keys_vm.dart diff --git a/lib/di.dart b/lib/di.dart index a15c1811a..37061f8aa 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -57,6 +57,7 @@ import 'package:mobx/mobx.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:cake_wallet/view_model/wallet_restoration_from_seed_vm.dart'; +import 'package:cake_wallet/view_model/wallet_restoration_from_keys_vm.dart'; import 'package:cake_wallet/core/wallet_creation_service.dart'; import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/src/domain/common/wallet_type.dart'; @@ -156,6 +157,16 @@ Future setup( type: type, language: language, seed: mnemonic); }); + getIt + .registerFactoryParam((args, _) { + final type = args.first as WalletType; + final language = args[1] as String; + + return WalletRestorationFromKeysVM( + getIt.get(param1: type), walletInfoSource, + type: type, language: language); + }); + getIt.registerFactory( () => WalletAddressListViewModel(wallet: getIt.get().wallet)); diff --git a/lib/router.dart b/lib/router.dart index ccff5677a..14f658e0c 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -2,6 +2,7 @@ import 'package:cake_wallet/src/screens/dashboard/dashboard_page.dart'; import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart'; import 'package:cake_wallet/view_model/wallet_new_vm.dart'; import 'package:cake_wallet/view_model/wallet_restoration_from_seed_vm.dart'; +import 'package:cake_wallet/view_model/wallet_restoration_from_keys_vm.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; @@ -165,6 +166,7 @@ class Router { builder: (_) => NewWalletTypePage( onTypeSelected: (context, type) => Navigator.of(context) .pushNamed(Routes.restoreWalletOptions, arguments: type), + isNewWallet: false, )); case Routes.restoreOptions: @@ -236,17 +238,12 @@ class Router { ? args[1] as String : 'English'; // FIXME: Unnamed constant; English default and only one language for bitcoin. + final walletRestorationFromKeysVM = + getIt.get(param1: [type, language]); + return CupertinoPageRoute( - builder: (_) => - ProxyProvider( - update: (_, authStore, __) => WalletRestorationStore( - authStore: authStore, - sharedPreferences: sharedPreferences, - walletListService: walletListService), - child: RestoreWalletFromKeysPage( - walletsService: walletListService, - walletService: walletService, - sharedPreferences: sharedPreferences))); + builder: (_) => RestoreWalletFromKeysPage( + walletRestorationFromKeysVM: walletRestorationFromKeysVM)); case Routes.dashboard: return CupertinoPageRoute( diff --git a/lib/src/screens/new_wallet/new_wallet_page.dart b/lib/src/screens/new_wallet/new_wallet_page.dart index 1eaf95b46..473d2d6ce 100644 --- a/lib/src/screens/new_wallet/new_wallet_page.dart +++ b/lib/src/screens/new_wallet/new_wallet_page.dart @@ -1,3 +1,5 @@ +import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter/material.dart'; @@ -40,6 +42,7 @@ class _WalletNameFormState extends State { static const aspectRatioImage = 1.22; final walletNameImage = Image.asset('assets/images/wallet_name.png'); + final walletNameLightImage = Image.asset('assets/images/wallet_name_light.png'); final _formKey = GlobalKey(); final _languageSelectorKey = GlobalKey(); ReactionDisposer _stateReaction; @@ -72,6 +75,9 @@ class _WalletNameFormState extends State { @override Widget build(BuildContext context) { + final walletImage = getIt.get().isDarkTheme + ? walletNameImage : walletNameLightImage; + return Container( padding: EdgeInsets.only(top: 24), child: ScrollableWithBottomSection( @@ -82,7 +88,7 @@ class _WalletNameFormState extends State { padding: EdgeInsets.only(left: 12, right: 12), child: AspectRatio( aspectRatio: aspectRatioImage, - child: FittedBox(child: walletNameImage, fit: BoxFit.fill)), + child: FittedBox(child: walletImage, fit: BoxFit.fill)), ), Padding( padding: EdgeInsets.only(top: 24), @@ -98,19 +104,26 @@ class _WalletNameFormState extends State { Theme.of(context).primaryTextTheme.title.color), decoration: InputDecoration( hintStyle: TextStyle( - fontSize: 16.0, + fontSize: 18.0, + fontWeight: FontWeight.w500, color: Theme.of(context) - .primaryTextTheme - .caption + .accentTextTheme + .display3 .color), hintText: S.of(context).wallet_name, focusedBorder: UnderlineInputBorder( borderSide: BorderSide( - color: Theme.of(context).dividerColor, + color: Theme.of(context) + .accentTextTheme + .display3 + .decorationColor, width: 1.0)), enabledBorder: UnderlineInputBorder( borderSide: BorderSide( - color: Theme.of(context).dividerColor, + color: Theme.of(context) + .accentTextTheme + .display3 + .decorationColor, width: 1.0))), validator: WalletNameValidator())), ), @@ -122,7 +135,7 @@ class _WalletNameFormState extends State { textAlign: TextAlign.center, style: TextStyle( fontSize: 16.0, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.title.color), ), ), diff --git a/lib/src/screens/new_wallet/new_wallet_type_page.dart b/lib/src/screens/new_wallet/new_wallet_type_page.dart index 9dfcfbf33..673bd9478 100644 --- a/lib/src/screens/new_wallet/new_wallet_type_page.dart +++ b/lib/src/screens/new_wallet/new_wallet_type_page.dart @@ -1,4 +1,6 @@ +import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/src/domain/common/wallet_type.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:cake_wallet/generated/i18n.dart'; @@ -6,15 +8,17 @@ import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/screens/new_wallet/widgets/select_button.dart'; -import 'package:cake_wallet/routes.dart'; class NewWalletTypePage extends BasePage { - NewWalletTypePage({this.onTypeSelected}); + NewWalletTypePage({this.onTypeSelected, this.isNewWallet = true}); final void Function(BuildContext, WalletType) onTypeSelected; + final bool isNewWallet; @override - String get title => S.current.new_wallet; + String get title => isNewWallet + ? S.current.new_wallet + : S.current.wallet_list_restore_wallet; @override Widget body(BuildContext context) => @@ -38,6 +42,7 @@ class WalletTypeFormState extends State { final bitcoinIcon = Image.asset('assets/images/bitcoin.png', height: 24, width: 24); final walletTypeImage = Image.asset('assets/images/wallet_type.png'); + final walletTypeLightImage = Image.asset('assets/images/wallet_type_light.png'); WalletType selected; List types; @@ -50,6 +55,9 @@ class WalletTypeFormState extends State { @override Widget build(BuildContext context) { + final walletImage = getIt.get().isDarkTheme + ? walletTypeImage : walletTypeLightImage; + return Container( padding: EdgeInsets.only(top: 24), child: ScrollableWithBottomSection( @@ -61,7 +69,7 @@ class WalletTypeFormState extends State { padding: EdgeInsets.only(left: 12, right: 12), child: AspectRatio( aspectRatio: aspectRatioImage, - child: FittedBox(child: walletTypeImage, fit: BoxFit.fill)), + child: FittedBox(child: walletImage, fit: BoxFit.fill)), ), Padding( padding: EdgeInsets.only(top: 48), @@ -70,7 +78,7 @@ class WalletTypeFormState extends State { textAlign: TextAlign.center, style: TextStyle( fontSize: 16, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.title.color), ), ), @@ -79,8 +87,7 @@ class WalletTypeFormState extends State { child: SelectButton( image: _iconFor(type), text: walletTypeToString(type), - color: _backgroundColorFor(selected == type), - textColor: _textColorFor(selected == type), + isSelected: selected == type, onTap: () => setState(() => selected = type)), )) ], @@ -97,16 +104,6 @@ class WalletTypeFormState extends State { ); } - // FIXME: Move color selection inside ui element; add isSelected to buttons. - - Color _backgroundColorFor(bool isSelected) => isSelected - ? Theme.of(context).accentTextTheme.title.decorationColor - : Theme.of(context).accentTextTheme.title.backgroundColor; - - Color _textColorFor(bool isSelected) => isSelected - ? Theme.of(context).primaryTextTheme.title.backgroundColor - : Theme.of(context).primaryTextTheme.title.color; - Image _iconFor(WalletType type) { switch (type) { case WalletType.monero: diff --git a/lib/src/screens/new_wallet/widgets/select_button.dart b/lib/src/screens/new_wallet/widgets/select_button.dart index 7e583ec4e..bd69a8015 100644 --- a/lib/src/screens/new_wallet/widgets/select_button.dart +++ b/lib/src/screens/new_wallet/widgets/select_button.dart @@ -4,21 +4,30 @@ class SelectButton extends StatelessWidget { SelectButton({ @required this.image, @required this.text, - @required this.color, - @required this.textColor, @required this.onTap, + this.isSelected = false, }); final Image image; final String text; - final Color color; - final Color textColor; + final bool isSelected; final VoidCallback onTap; - final selectArrowImage = Image.asset('assets/images/select_arrow.png'); - @override Widget build(BuildContext context) { + final color = isSelected + ? Theme.of(context).accentTextTheme.subtitle.decorationColor + : Theme.of(context).accentTextTheme.caption.color; + final textColor = isSelected + ? Theme.of(context).accentTextTheme.headline.decorationColor + : Theme.of(context).primaryTextTheme.title.color; + final arrowColor = isSelected + ? Theme.of(context).accentTextTheme.headline.decorationColor + : Theme.of(context).accentTextTheme.subhead.color; + + final selectArrowImage = Image.asset('assets/images/select_arrow.png', + color: arrowColor); + return GestureDetector( onTap: onTap, child: Container( @@ -39,9 +48,7 @@ class SelectButton extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - image != null - ? image - : Offstage(), + image ?? Offstage(), Padding( padding: image != null ? EdgeInsets.only(left: 15) @@ -50,7 +57,7 @@ class SelectButton extends StatelessWidget { text, style: TextStyle( fontSize: 18, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w500, color: textColor ), ), diff --git a/lib/src/screens/restore/restore_wallet_from_keys_page.dart b/lib/src/screens/restore/restore_wallet_from_keys_page.dart index 766ef7a0e..6f950f6e4 100644 --- a/lib/src/screens/restore/restore_wallet_from_keys_page.dart +++ b/lib/src/screens/restore/restore_wallet_from_keys_page.dart @@ -1,40 +1,36 @@ -import 'package:mobx/mobx.dart'; -import 'package:provider/provider.dart'; -import 'package:shared_preferences/shared_preferences.dart'; +import 'package:cake_wallet/core/validator.dart'; +import 'package:cake_wallet/palette.dart'; import 'package:flutter/services.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/src/domain/services/wallet_list_service.dart'; -import 'package:cake_wallet/src/domain/services/wallet_service.dart'; -import 'package:cake_wallet/src/stores/wallet_restoration/wallet_restoration_store.dart'; -import 'package:cake_wallet/src/stores/wallet_restoration/wallet_restoration_state.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/blockchain_height_widget.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; -import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; +import 'package:cake_wallet/view_model/wallet_restoration_from_keys_vm.dart'; +import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; class RestoreWalletFromKeysPage extends BasePage { RestoreWalletFromKeysPage( - {@required this.walletsService, - @required this.sharedPreferences, - @required this.walletService}); + {@required this.walletRestorationFromKeysVM}); - final WalletListService walletsService; - final WalletService walletService; - final SharedPreferences sharedPreferences; + final WalletRestorationFromKeysVM walletRestorationFromKeysVM; @override String get title => S.current.restore_title_from_keys; @override - Widget body(BuildContext context) => RestoreFromKeysFrom(); + Widget body(BuildContext context) => RestoreFromKeysFrom(walletRestorationFromKeysVM); } class RestoreFromKeysFrom extends StatefulWidget { + RestoreFromKeysFrom(this.walletRestorationFromKeysVM); + + final WalletRestorationFromKeysVM walletRestorationFromKeysVM; + @override _RestoreFromKeysFromState createState() => _RestoreFromKeysFromState(); } @@ -46,6 +42,23 @@ class _RestoreFromKeysFromState extends State { final _addressController = TextEditingController(); final _viewKeyController = TextEditingController(); final _spendKeyController = TextEditingController(); + final _wifController = TextEditingController(); + + @override + void initState() { + _nameController.addListener(() => + widget.walletRestorationFromKeysVM.name = _nameController.text); + _addressController.addListener(() => + widget.walletRestorationFromKeysVM.address = _addressController.text); + _viewKeyController.addListener(() => + widget.walletRestorationFromKeysVM.viewKey = _viewKeyController.text); + _spendKeyController.addListener(() => + widget.walletRestorationFromKeysVM.spendKey = _spendKeyController.text); + _wifController.addListener(() => + widget.walletRestorationFromKeysVM.wif = _wifController.text); + + super.initState(); + } @override void dispose() { @@ -53,31 +66,14 @@ class _RestoreFromKeysFromState extends State { _addressController.dispose(); _viewKeyController.dispose(); _spendKeyController.dispose(); + _wifController.dispose(); super.dispose(); } - void onHandleControllers(WalletRestorationStore walletRestorationStore) { - if (_nameController.text.isNotEmpty && - _addressController.text.isNotEmpty && - _viewKeyController.text.isNotEmpty && - _spendKeyController.text.isNotEmpty) { - walletRestorationStore.setDisabledState(false); - } else { - walletRestorationStore.setDisabledState(true); - } - } - @override Widget build(BuildContext context) { - final walletRestorationStore = Provider.of(context); - final seedLanguageStore = Provider.of(context); - _nameController.addListener(() {onHandleControllers(walletRestorationStore);}); - _addressController.addListener(() {onHandleControllers(walletRestorationStore);}); - _viewKeyController.addListener(() {onHandleControllers(walletRestorationStore);}); - _spendKeyController.addListener(() {onHandleControllers(walletRestorationStore);}); - - reaction((_) => walletRestorationStore.state, (WalletRestorationState state) { + /*reaction((_) => walletRestorationStore.state, (WalletRestorationState state) { if (state is WalletRestoredSuccessfully) { Navigator.of(context).popUntil((route) => route.isFirst); } @@ -96,7 +92,7 @@ class _RestoreFromKeysFromState extends State { }); }); } - }); + });*/ return Container( padding: EdgeInsets.only(left: 24, right: 24), @@ -110,66 +106,39 @@ class _RestoreFromKeysFromState extends State { Flexible( child: Container( padding: EdgeInsets.only(top: 20.0), - child: TextFormField( - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color - ), + child: BaseTextFormField( controller: _nameController, - decoration: InputDecoration( - hintStyle: TextStyle( - color: Theme.of(context).primaryTextTheme.caption.color, - fontSize: 16 - ), - hintText: S.of(context).restore_wallet_name, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0))), - validator: (value) { - walletRestorationStore.validateWalletName(value); - return walletRestorationStore.errorMessage; - }, - ), + hintText: S.of(context).restore_wallet_name, + validator: WalletNameValidator(), + ) )) ], ), + if (!widget.walletRestorationFromKeysVM.hasRestorationHeight) + Row( + children: [ + Flexible( + child: Container( + padding: EdgeInsets.only(top: 20.0), + child: BaseTextFormField( + controller: _wifController, + hintText: 'WIF', + ) + )) + ], + ), + if (widget.walletRestorationFromKeysVM.hasRestorationHeight) ... [ Row( children: [ Flexible( child: Container( padding: EdgeInsets.only(top: 20.0), - child: TextFormField( - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color - ), + child: BaseTextFormField( controller: _addressController, keyboardType: TextInputType.multiline, maxLines: null, - decoration: InputDecoration( - hintStyle: TextStyle( - color: Theme.of(context).primaryTextTheme.caption.color, - fontSize: 16 - ), - hintText: S.of(context).restore_address, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0))), - validator: (value) { - walletRestorationStore.validateAddress(value); - return walletRestorationStore.errorMessage; - }, - ), + hintText: S.of(context).restore_address, + ) )) ], ), @@ -178,31 +147,10 @@ class _RestoreFromKeysFromState extends State { Flexible( child: Container( padding: EdgeInsets.only(top: 20.0), - child: TextFormField( - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color - ), + child: BaseTextFormField( controller: _viewKeyController, - decoration: InputDecoration( - hintStyle: TextStyle( - color: Theme.of(context).primaryTextTheme.caption.color, - fontSize: 16 - ), - hintText: S.of(context).restore_view_key_private, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0))), - validator: (value) { - walletRestorationStore.validateKeys(value); - return walletRestorationStore.errorMessage; - }, - ), + hintText: S.of(context).restore_view_key_private, + ) )) ], ), @@ -211,35 +159,19 @@ class _RestoreFromKeysFromState extends State { Flexible( child: Container( padding: EdgeInsets.only(top: 20.0), - child: TextFormField( - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color - ), + child: BaseTextFormField( controller: _spendKeyController, - decoration: InputDecoration( - hintStyle: TextStyle( - color: Theme.of(context).primaryTextTheme.caption.color, - fontSize: 16 - ), - hintText: S.of(context).restore_spend_key_private, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0))), - validator: (value) { - walletRestorationStore.validateKeys(value); - return walletRestorationStore.errorMessage; - }, - ), + hintText: S.of(context).restore_spend_key_private, + ) )) ], ), - BlockchainHeightWidget(key: _blockchainHeightKey), + BlockchainHeightWidget( + key: _blockchainHeightKey, + onHeightChange: (height) { + widget.walletRestorationFromKeysVM.height = height; + print(height); + })], ]), ), bottomSectionPadding: EdgeInsets.only(bottom: 24), @@ -247,19 +179,19 @@ class _RestoreFromKeysFromState extends State { return LoadingPrimaryButton( onPressed: () { if (_formKey.currentState.validate()) { - walletRestorationStore.restoreFromKeys( + /*walletRestorationStore.restoreFromKeys( name: _nameController.text, language: seedLanguageStore.selectedSeedLanguage, address: _addressController.text, viewKey: _viewKeyController.text, spendKey: _spendKeyController.text, - restoreHeight: _blockchainHeightKey.currentState.height); + restoreHeight: _blockchainHeightKey.currentState.height);*/ } }, text: S.of(context).restore_recover, - color: Colors.green, + color: Palette.blueCraiola, textColor: Colors.white, - isDisabled: walletRestorationStore.disabledState, + //isDisabled: walletRestorationStore.disabledState, ); }), ), diff --git a/lib/src/screens/restore/restore_wallet_from_seed_details.dart b/lib/src/screens/restore/restore_wallet_from_seed_details.dart index 5a83a8b3c..3225be9e7 100644 --- a/lib/src/screens/restore/restore_wallet_from_seed_details.dart +++ b/lib/src/screens/restore/restore_wallet_from_seed_details.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/palette.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -9,6 +10,7 @@ import 'package:cake_wallet/src/widgets/blockchain_height_widget.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; +import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; import 'package:cake_wallet/view_model/wallet_restoration_from_seed_vm.dart'; class RestoreWalletFromSeedDetailsPage extends BasePage { @@ -91,27 +93,9 @@ class _RestoreFromSeedDetailsFormState Flexible( child: Container( padding: EdgeInsets.only(top: 20.0), - child: TextFormField( - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color), + child: BaseTextFormField( controller: _nameController, - decoration: InputDecoration( - hintStyle: TextStyle( - color: Theme.of(context) - .primaryTextTheme - .caption - .color, - fontSize: 16), - hintText: S.of(context).restore_wallet_name, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0))), + hintText: S.of(context).restore_wallet_name, validator: WalletNameValidator(), ), )) @@ -137,7 +121,7 @@ class _RestoreFromSeedDetailsFormState isLoading: widget.walletRestorationFromSeedVM.state is WalletCreating, text: S.of(context).restore_recover, - color: Colors.green, + color: Palette.blueCraiola, textColor: Colors.white, isDisabled: _nameController.text.isNotEmpty, ); diff --git a/lib/src/screens/seed_language/seed_language_page.dart b/lib/src/screens/seed_language/seed_language_page.dart index 48b2fd5b6..ccee8aae5 100644 --- a/lib/src/screens/seed_language/seed_language_page.dart +++ b/lib/src/screens/seed_language/seed_language_page.dart @@ -1,5 +1,6 @@ +import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/src/widgets/seed_language_selector.dart'; -import 'package:provider/provider.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; @@ -7,8 +8,6 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; -import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart'; -import 'package:cake_wallet/src/screens/new_wallet/widgets/select_button.dart'; import 'package:cake_wallet/src/screens/seed_language/widgets/seed_language_picker.dart'; class SeedLanguage extends BasePage { @@ -16,6 +15,9 @@ class SeedLanguage extends BasePage { final Function(BuildContext, String) onConfirm; + @override + String get title => S.current.wallet_list_restore_wallet; + @override Widget body(BuildContext context) => SeedLanguageForm(onConfirm: onConfirm); } @@ -33,10 +35,14 @@ class SeedLanguageFormState extends State { static const aspectRatioImage = 1.22; final walletNameImage = Image.asset('assets/images/wallet_name.png'); + final walletNameLightImage = Image.asset('assets/images/wallet_name_light.png'); final _languageSelectorKey = GlobalKey(); @override Widget build(BuildContext context) { + final walletImage = getIt.get().isDarkTheme + ? walletNameImage : walletNameLightImage; + return Container( padding: EdgeInsets.only(top: 24), child: ScrollableWithBottomSection( @@ -47,7 +53,7 @@ class SeedLanguageFormState extends State { padding: EdgeInsets.only(left: 12, right: 12), child: AspectRatio( aspectRatio: aspectRatioImage, - child: FittedBox(child: walletNameImage, fit: BoxFit.fill)), + child: FittedBox(child: walletImage, fit: BoxFit.fill)), ), Padding( padding: EdgeInsets.only(top: 40), @@ -56,7 +62,7 @@ class SeedLanguageFormState extends State { textAlign: TextAlign.center, style: TextStyle( fontSize: 16.0, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.title.color), ), ), diff --git a/lib/src/screens/seed_language/widgets/seed_language_picker.dart b/lib/src/screens/seed_language/widgets/seed_language_picker.dart index cc476b294..47e43c7c7 100644 --- a/lib/src/screens/seed_language/widgets/seed_language_picker.dart +++ b/lib/src/screens/seed_language/widgets/seed_language_picker.dart @@ -1,9 +1,9 @@ import 'dart:ui'; +import 'package:cake_wallet/src/widgets/alert_background.dart'; +import 'package:cake_wallet/src/widgets/alert_close_button.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/palette.dart'; -import 'package:provider/provider.dart'; -import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart'; import 'package:cake_wallet/generated/i18n.dart'; List flagImages = [ @@ -57,170 +57,111 @@ class SeedLanguagePicker extends StatefulWidget { class SeedLanguagePickerState extends State { SeedLanguagePickerState({this.selected}); + final closeButton = Image.asset('assets/images/close.png'); String selected; @override Widget build(BuildContext context) { - return GestureDetector( - onTap: () => Navigator.of(context).pop(), - child: Container( - color: Colors.transparent, - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0), - child: Container( - decoration: BoxDecoration( - color: PaletteDark.darkNightBlue.withOpacity(0.75)), - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: EdgeInsets.only(left: 24, right: 24), - child: Text( - S.of(context).seed_choose, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - decoration: TextDecoration.none, - color: Colors.white), + return AlertBackground( + child: Stack( + alignment: Alignment.center, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.only(left: 24, right: 24), + child: Text( + S.of(context).seed_choose, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + fontFamily: 'Poppins', + decoration: TextDecoration.none, + color: Colors.white ), ), - Padding( - padding: EdgeInsets.only(top: 24), - child: GestureDetector( - onTap: () => null, - child: Container( - height: 300, - width: 300, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(14)), - color: Theme.of(context).dividerColor), - child: GridView.count( - shrinkWrap: true, - crossAxisCount: 3, - childAspectRatio: 1, - physics: const NeverScrollableScrollPhysics(), - crossAxisSpacing: 1, - mainAxisSpacing: 1, - children: List.generate(9, (index) { - if (index == 8) { - return gridTile( - isCurrent: false, - place: Places.bottomRight, - image: null, - text: '', - onTap: null); - } else { - final code = languageCodes[index]; - final flag = flagImages[index]; - final isCurrent = - index == seedLanguages.indexOf(selected); + ), + Padding( + padding: EdgeInsets.only(top: 24), + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(14)), + child: Container( + height: 300, + width: 300, + color: Theme.of(context).accentTextTheme.title.backgroundColor, + child: GridView.count( + shrinkWrap: true, + crossAxisCount: 3, + childAspectRatio: 1, + physics: const NeverScrollableScrollPhysics(), + crossAxisSpacing: 1, + mainAxisSpacing: 1, + children: List.generate(9, (index) { - if (index == 0) { - return gridTile( - isCurrent: isCurrent, - place: Places.topLeft, - image: flag, - text: code, - onTap: () { - selected = seedLanguages[index]; - Navigator.of(context).pop(selected); - }); + if (index == 8) { + + return gridTile( + isCurrent: false, + image: null, + text: '', + onTap: null); + + } + + final code = languageCodes[index]; + final flag = flagImages[index]; + final isCurrent = + index == seedLanguages.indexOf(selected); + + return gridTile( + isCurrent: isCurrent, + image: flag, + text: code, + onTap: () { + selected = seedLanguages[index]; + Navigator.of(context).pop(selected); } - - if (index == 2) { - return gridTile( - isCurrent: isCurrent, - place: Places.topRight, - image: flag, - text: code, - onTap: () { - selected = seedLanguages[index]; - Navigator.of(context).pop(selected); - }); - } - - if (index == 6) { - return gridTile( - isCurrent: isCurrent, - place: Places.bottomLeft, - image: flag, - text: code, - onTap: () { - selected = seedLanguages[index]; - Navigator.of(context).pop(selected); - }); - } - - return gridTile( - isCurrent: isCurrent, - place: Places.inside, - image: flag, - text: code, - onTap: () { - selected = seedLanguages[index]; - Navigator.of(context).pop(selected); - }); - } - }), - ), + ); + }), ), ), - ) - ], - ), + ), + ) + ], ), - ), - ), - ), + AlertCloseButton(image: closeButton) + ], + ) ); } - Widget gridTile( - {@required bool isCurrent, - @required Places place, - @required Image image, - @required String text, - @required VoidCallback onTap}) { - BorderRadius borderRadius; - final color = isCurrent - ? Theme.of(context).accentTextTheme.subtitle.decorationColor - : Theme.of(context).primaryTextTheme.display1.color; - final textColor = isCurrent - ? Colors.blue - : Theme.of(context).primaryTextTheme.title.color; + Widget gridTile({ + @required bool isCurrent, + @required Image image, + @required String text, + @required VoidCallback onTap}) { - switch (place) { - case Places.topLeft: - borderRadius = BorderRadius.only(topLeft: Radius.circular(14)); - break; - case Places.topRight: - borderRadius = BorderRadius.only(topRight: Radius.circular(14)); - break; - case Places.bottomLeft: - borderRadius = BorderRadius.only(bottomLeft: Radius.circular(14)); - break; - case Places.bottomRight: - borderRadius = BorderRadius.only(bottomRight: Radius.circular(14)); - break; - case Places.inside: - borderRadius = BorderRadius.all(Radius.circular(0)); - break; - } + final color = isCurrent + ? Theme.of(context).textTheme.body2.color + : Theme.of(context).accentTextTheme.title.color; + final textColor = isCurrent + ? Palette.blueCraiola + : Theme.of(context).primaryTextTheme.title.color; return GestureDetector( onTap: onTap, child: Container( padding: EdgeInsets.all(10), - decoration: BoxDecoration(borderRadius: borderRadius, color: color), + color: color, child: Center( child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - image != null ? image : Offstage(), + image ?? Offstage(), Padding( padding: image != null ? EdgeInsets.only(left: 10) @@ -229,14 +170,17 @@ class SeedLanguagePickerState extends State { text, style: TextStyle( fontSize: 18, - fontWeight: FontWeight.bold, + fontWeight: FontWeight.w600, + fontFamily: 'Poppins', decoration: TextDecoration.none, - color: textColor), + color: textColor + ), ), ) ], ), ), - )); + ) + ); } } diff --git a/lib/src/widgets/blockchain_height_widget.dart b/lib/src/widgets/blockchain_height_widget.dart index 9e66d4077..2f6105887 100644 --- a/lib/src/widgets/blockchain_height_widget.dart +++ b/lib/src/widgets/blockchain_height_widget.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/domain/monero/get_height_by_date.dart'; +import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; class BlockchainHeightWidget extends StatefulWidget { BlockchainHeightWidget({GlobalKey key, this.onHeightChange}) @@ -46,26 +47,12 @@ class BlockchainHeightState extends State { Flexible( child: Container( padding: EdgeInsets.only(top: 20.0, bottom: 10.0), - child: TextFormField( - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color), + child: BaseTextFormField( controller: restoreHeightController, keyboardType: TextInputType.numberWithOptions( signed: false, decimal: false), - decoration: InputDecoration( - hintStyle: TextStyle( - color: Theme.of(context).primaryTextTheme.caption.color, - fontSize: 16), - hintText: S.of(context).widgets_restore_from_blockheight, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, width: 1.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0))), - ), + hintText: S.of(context).widgets_restore_from_blockheight, + ) )) ], ), @@ -75,7 +62,7 @@ class BlockchainHeightState extends State { S.of(context).widgets_or, style: TextStyle( fontSize: 16.0, - fontWeight: FontWeight.bold, + fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.title.color), ), ), @@ -86,31 +73,10 @@ class BlockchainHeightState extends State { child: InkWell( onTap: () => _selectDate(context), child: IgnorePointer( - child: TextFormField( - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color), - decoration: InputDecoration( - hintStyle: TextStyle( - color: Theme.of(context) - .primaryTextTheme - .caption - .color, - fontSize: 16), - hintText: S.of(context).widgets_restore_from_date, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.0))), + child: BaseTextFormField( controller: dateController, - validator: (value) { - return null; - }, - ), + hintText: S.of(context).widgets_restore_from_date, + ) ), ), )) diff --git a/lib/src/widgets/seed_language_selector.dart b/lib/src/widgets/seed_language_selector.dart index f66cadb8e..74420d370 100644 --- a/lib/src/widgets/seed_language_selector.dart +++ b/lib/src/widgets/seed_language_selector.dart @@ -34,14 +34,14 @@ class SeedLanguageSelectorState extends State { return SelectButton( image: null, text: seedLocales[seedLanguages.indexOf(selected)], - color: Theme.of(context).accentTextTheme.title.backgroundColor, - textColor: Theme.of(context).primaryTextTheme.title.color, onTap: () async { final selected = await showDialog( context: context, builder: (BuildContext context) => SeedLanguagePicker(key: _pickerKey, selected: this.selected)); - setState(() => this.selected = selected); + if (selected != null) { + setState(() => this.selected = selected); + } }); } } diff --git a/lib/themes.dart b/lib/themes.dart index 452264e21..e2f75b7ff 100644 --- a/lib/themes.dart +++ b/lib/themes.dart @@ -156,6 +156,10 @@ class Themes { color: Palette.shadowWhite, // action button color (address text field) decorationColor: Palette.darkGray // hint text (seed widget) ), + display3: TextStyle( + color: Palette.darkGray, // hint text (new wallet page) + decorationColor: Palette.periwinkleCraiola // underline (new wallet page) + ), ), @@ -323,6 +327,10 @@ class Themes { color: PaletteDark.nightBlue, // action button color (address text field) decorationColor: PaletteDark.darkCyanBlue // hint text (seed widget) ), + display3: TextStyle( + color: PaletteDark.cyanBlue, // hint text (new wallet page) + decorationColor: PaletteDark.darkGrey // underline (new wallet page) + ), ), diff --git a/lib/view_model/wallet_restoration_from_keys_vm.dart b/lib/view_model/wallet_restoration_from_keys_vm.dart new file mode 100644 index 000000000..e0e0114c6 --- /dev/null +++ b/lib/view_model/wallet_restoration_from_keys_vm.dart @@ -0,0 +1,64 @@ +import 'package:flutter/foundation.dart'; +import 'package:hive/hive.dart'; +import 'package:mobx/mobx.dart'; +import 'package:cake_wallet/monero/monero_wallet_service.dart'; +import 'package:cake_wallet/bitcoin/bitcoin_wallet_creation_credentials.dart'; +import 'package:cake_wallet/core/generate_wallet_password.dart'; +import 'package:cake_wallet/core/wallet_creation_service.dart'; +import 'package:cake_wallet/core/wallet_credentials.dart'; +import 'package:cake_wallet/src/domain/common/wallet_type.dart'; +import 'package:cake_wallet/view_model/wallet_creation_vm.dart'; +import 'package:cake_wallet/src/domain/common/wallet_info.dart'; + +part 'wallet_restoration_from_keys_vm.g.dart'; + +class WalletRestorationFromKeysVM = WalletRestorationFromKeysVMBase + with _$WalletRestorationFromKeysVM; + +abstract class WalletRestorationFromKeysVMBase extends WalletCreationVM + with Store { + WalletRestorationFromKeysVMBase(this._walletCreationService, Box walletInfoSource, + {@required WalletType type, @required this.language}) + : super(walletInfoSource, type: type, isRecovery: true); + + @observable + int height; + + @observable + String viewKey; + + @observable + String spendKey; + + @observable + String wif; + + @observable + String address; + + bool get hasRestorationHeight => type == WalletType.monero; + + final String language; + final WalletCreationService _walletCreationService; + + @override + WalletCredentials getCredentials(dynamic options) { + final password = generateWalletPassword(type); + + switch (type) { + case WalletType.monero: + return MoneroRestoreWalletFromKeysCredentials( + name: name, password: password, language: language, address: address, + viewKey: viewKey, spendKey: spendKey, height: height); + case WalletType.bitcoin: + return BitcoinRestoreWalletFromWIFCredentials( + name: name, password: password, wif: wif); + default: + return null; + } + } + + @override + Future process(WalletCredentials credentials) async => + _walletCreationService.restoreFromKeys(credentials); +} From a76266ef40680f544ac0e9654fba65d212815d06 Mon Sep 17 00:00:00 2001 From: Oleksandr Sobol Date: Fri, 4 Sep 2020 14:36:19 +0300 Subject: [PATCH 5/7] CAKE-31 | changed height of restore button; changed button title in the new wallet page; localized string resources from restore wallet options page --- lib/generated/i18n.dart | 69 +++++++++++++++++++ .../screens/new_wallet/new_wallet_page.dart | 3 +- .../restore/restore_wallet_options_page.dart | 9 +-- .../restore/widgets/restore_button.dart | 2 +- res/values/strings_de.arb | 3 + res/values/strings_en.arb | 3 + res/values/strings_es.arb | 3 + res/values/strings_hi.arb | 3 + res/values/strings_ja.arb | 3 + res/values/strings_ko.arb | 3 + res/values/strings_nl.arb | 3 + res/values/strings_pl.arb | 3 + res/values/strings_pt.arb | 3 + res/values/strings_ru.arb | 3 + res/values/strings_uk.arb | 3 + res/values/strings_zh.arb | 3 + 16 files changed, 111 insertions(+), 8 deletions(-) diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 5408734ae..a14182527 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -144,6 +144,9 @@ class S implements WidgetsLocalizations { String get reset => "Reset"; String get restore_active_seed => "Active seed"; String get restore_address => "Address"; + String get restore_bitcoin_description_from_keys => "Restore your wallet from generated WIF string from your private keys"; + String get restore_bitcoin_description_from_seed => "Restore your wallet from 12 word combination code"; + String get restore_bitcoin_title_from_keys => "Restore from WIF"; String get restore_description_from_backup => "You can restore the whole Cake Wallet app from your back-up file"; String get restore_description_from_keys => "Restore your wallet from generated keystrokes saved from your private keys"; String get restore_description_from_seed => "Restore your wallet from either the 25 word or 13 word combination code"; @@ -496,6 +499,8 @@ class $de extends S { @override String get settings_title => "die Einstellungen"; @override + String get restore_bitcoin_description_from_seed => "Stellen Sie Ihre Brieftasche aus dem 12-Wort-Kombinationscode wieder her"; + @override String get address_book_menu => "Adressbuch"; @override String get wallet_restoration_store_incorrect_seed_length => "Falsche Samenlänge"; @@ -630,6 +635,10 @@ class $de extends S { @override String get xmr_available_balance => "XMR verfügbares Guthaben"; @override + String get restore_bitcoin_description_from_keys => "Stellen Sie Ihre Brieftasche aus der generierten WIF-Zeichenfolge aus Ihren privaten Schlüsseln wieder her"; + @override + String get restore_bitcoin_title_from_keys => "Aus WIF wiederherstellen"; + @override String get scan_qr_code => "Scannen Sie den QR-Code, um die Adresse zu erhalten"; @override String get trade_state_paid => "Bezahlt"; @@ -1128,6 +1137,8 @@ class $hi extends S { @override String get settings_title => "सेटिंग्स"; @override + String get restore_bitcoin_description_from_seed => "12 शब्द संयोजन कोड से अपने वॉलेट को पुनर्स्थापित करें"; + @override String get address_book_menu => "पता पुस्तिका"; @override String get wallet_restoration_store_incorrect_seed_length => "गलत बीज की लंबाई"; @@ -1262,6 +1273,10 @@ class $hi extends S { @override String get xmr_available_balance => "XMR उपलब्ध शेष राशि"; @override + String get restore_bitcoin_description_from_keys => "अपने निजी कुंजी से उत्पन्न WIF स्ट्रिंग से अपने वॉलेट को पुनर्स्थापित करें"; + @override + String get restore_bitcoin_title_from_keys => "WIF से पुनर्स्थापित करें"; + @override String get scan_qr_code => "पता प्राप्त करने के लिए QR कोड स्कैन करें"; @override String get trade_state_paid => "भुगतान किया है"; @@ -1760,6 +1775,8 @@ class $ru extends S { @override String get settings_title => "Настройки"; @override + String get restore_bitcoin_description_from_seed => "Вы можете восстановить кошелёк используя 12-ти значную мнемоническую фразу"; + @override String get address_book_menu => "Адресная книга"; @override String get wallet_restoration_store_incorrect_seed_length => "Неверная длина мнемонической фразы"; @@ -1894,6 +1911,10 @@ class $ru extends S { @override String get xmr_available_balance => "Доступный XMR баланс"; @override + String get restore_bitcoin_description_from_keys => "Вы можете восстановить кошелёк с помощью WIF"; + @override + String get restore_bitcoin_title_from_keys => "Восстановить с помощью WIF"; + @override String get scan_qr_code => "Отсканируйте QR-код для получения адреса"; @override String get trade_state_paid => "Оплаченная"; @@ -2392,6 +2413,8 @@ class $ko extends S { @override String get settings_title => "설정"; @override + String get restore_bitcoin_description_from_seed => "12 단어 조합 코드에서 지갑 복원"; + @override String get address_book_menu => "주소록"; @override String get wallet_restoration_store_incorrect_seed_length => "시드 길이가 잘못되었습니다"; @@ -2526,6 +2549,10 @@ class $ko extends S { @override String get xmr_available_balance => "XMR 사용 가능한 잔액"; @override + String get restore_bitcoin_description_from_keys => "개인 키에서 생성 된 WIF 문자열에서 지갑 복원"; + @override + String get restore_bitcoin_title_from_keys => "WIF에서 복원"; + @override String get scan_qr_code => "QR 코드를 스캔하여 주소를 얻습니다."; @override String get trade_state_paid => "유료"; @@ -3024,6 +3051,8 @@ class $pt extends S { @override String get settings_title => "Configurações"; @override + String get restore_bitcoin_description_from_seed => "Restaure sua carteira a partir de um código de combinação de 12 palavras"; + @override String get address_book_menu => "Livro de endereços"; @override String get wallet_restoration_store_incorrect_seed_length => "Comprimento de semente incorreto"; @@ -3158,6 +3187,10 @@ class $pt extends S { @override String get xmr_available_balance => "Saldo XMR disponível"; @override + String get restore_bitcoin_description_from_keys => "Restaure sua carteira a partir da string WIF gerada de suas chaves privadas"; + @override + String get restore_bitcoin_title_from_keys => "Restaurar de WIF"; + @override String get scan_qr_code => "Digitalize o código QR para obter o endereço"; @override String get trade_state_paid => "Paga"; @@ -3656,6 +3689,8 @@ class $uk extends S { @override String get settings_title => "Налаштування"; @override + String get restore_bitcoin_description_from_seed => "Ви можете відновити гаманець використовуючи 12-ти слівну мнемонічну фразу"; + @override String get address_book_menu => "Адресна книга"; @override String get wallet_restoration_store_incorrect_seed_length => "Невірна довжина мнемонічної фрази"; @@ -3790,6 +3825,10 @@ class $uk extends S { @override String get xmr_available_balance => "Доступний XMR баланс"; @override + String get restore_bitcoin_description_from_keys => "Ви можете відновити гаманець за допомогою WIF"; + @override + String get restore_bitcoin_title_from_keys => "Відновити за допомогою WIF"; + @override String get scan_qr_code => "Скануйте QR-код для одержання адреси"; @override String get trade_state_paid => "Оплачена"; @@ -4288,6 +4327,8 @@ class $ja extends S { @override String get settings_title => "設定"; @override + String get restore_bitcoin_description_from_seed => "12ワードの組み合わせコードからウォレットを復元する"; + @override String get address_book_menu => "住所録"; @override String get wallet_restoration_store_incorrect_seed_length => "誤ったシード長s"; @@ -4422,6 +4463,10 @@ class $ja extends S { @override String get xmr_available_balance => "XMR利用可能残高"; @override + String get restore_bitcoin_description_from_keys => "秘密鍵から生成されたWIF文字列からウォレットを復元します"; + @override + String get restore_bitcoin_title_from_keys => "WIFから復元"; + @override String get scan_qr_code => "QRコードをスキャンして住所を取得します"; @override String get trade_state_paid => "有料"; @@ -4924,6 +4969,8 @@ class $pl extends S { @override String get settings_title => "Ustawienia"; @override + String get restore_bitcoin_description_from_seed => "Przywróć swój portfel z kodu złożonego z 12 słów"; + @override String get address_book_menu => "Książka adresowa"; @override String get wallet_restoration_store_incorrect_seed_length => "Nieprawidłowa długość nasion"; @@ -5058,6 +5105,10 @@ class $pl extends S { @override String get xmr_available_balance => "XMR Dostępne saldo"; @override + String get restore_bitcoin_description_from_keys => "Przywróć swój portfel z wygenerowanego ciągu WIF z kluczy prywatnych"; + @override + String get restore_bitcoin_title_from_keys => "Przywróć z WIF"; + @override String get scan_qr_code => "Zeskanuj kod QR, aby uzyskać adres"; @override String get trade_state_paid => "Płatny"; @@ -5556,6 +5607,8 @@ class $es extends S { @override String get settings_title => "Configuraciones"; @override + String get restore_bitcoin_description_from_seed => "Restaure su billetera a partir del código de combinación de 12 palabras"; + @override String get address_book_menu => "Libreta de direcciones"; @override String get wallet_restoration_store_incorrect_seed_length => "Longitud de semilla incorrecta"; @@ -5690,6 +5743,10 @@ class $es extends S { @override String get xmr_available_balance => "XMR Available Balance"; @override + String get restore_bitcoin_description_from_keys => "Restaure su billetera a partir de una cadena WIF generada a partir de sus claves privadas"; + @override + String get restore_bitcoin_title_from_keys => "Restaurar desde WIF"; + @override String get scan_qr_code => "Escanee el código QR para obtener la dirección"; @override String get trade_state_paid => "Pagado"; @@ -6188,6 +6245,8 @@ class $nl extends S { @override String get settings_title => "Instellingen"; @override + String get restore_bitcoin_description_from_seed => "Herstel uw portemonnee met een combinatiecode van 12 woorden"; + @override String get address_book_menu => "Adresboek"; @override String get wallet_restoration_store_incorrect_seed_length => "Onjuiste zaadlengte"; @@ -6322,6 +6381,10 @@ class $nl extends S { @override String get xmr_available_balance => "XMR Beschikbaar saldo"; @override + String get restore_bitcoin_description_from_keys => "Herstel uw portemonnee van de gegenereerde WIF-string van uw privésleutels"; + @override + String get restore_bitcoin_title_from_keys => "Herstel van WIF"; + @override String get scan_qr_code => "Scan de QR-code om het adres te krijgen"; @override String get trade_state_paid => "Betaald"; @@ -6820,6 +6883,8 @@ class $zh extends S { @override String get settings_title => "设定值"; @override + String get restore_bitcoin_description_from_seed => "從12個單詞的組合碼恢復您的錢包"; + @override String get address_book_menu => "地址簿"; @override String get wallet_restoration_store_incorrect_seed_length => "种子长度错误"; @@ -6954,6 +7019,10 @@ class $zh extends S { @override String get xmr_available_balance => "XMR 可用余额 "; @override + String get restore_bitcoin_description_from_keys => "從私鑰中生成的WIF字符串還原您的錢包"; + @override + String get restore_bitcoin_title_from_keys => "從WIF還原"; + @override String get scan_qr_code => "掃描二維碼獲取地址"; @override String get trade_state_paid => "已付费"; diff --git a/lib/src/screens/new_wallet/new_wallet_page.dart b/lib/src/screens/new_wallet/new_wallet_page.dart index 473d2d6ce..60d780d2d 100644 --- a/lib/src/screens/new_wallet/new_wallet_page.dart +++ b/lib/src/screens/new_wallet/new_wallet_page.dart @@ -153,7 +153,8 @@ class _WalletNameFormState extends State { builder: (context) { return LoadingPrimaryButton( onPressed: _confirmForm, - text: S.of(context).continue_text, + //text: S.of(context).continue_text, + text: S.of(context).seed_language_next, color: Colors.green, textColor: Colors.white, isLoading: _walletNewVM.state is WalletCreatedSuccessfully, diff --git a/lib/src/screens/restore/restore_wallet_options_page.dart b/lib/src/screens/restore/restore_wallet_options_page.dart index bb805e7c0..57bf6642a 100644 --- a/lib/src/screens/restore/restore_wallet_options_page.dart +++ b/lib/src/screens/restore/restore_wallet_options_page.dart @@ -1,11 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/restore/widgets/restore_button.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/domain/common/wallet_type.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart'; class RestoreWalletOptionsPage extends BasePage { RestoreWalletOptionsPage( @@ -56,7 +53,7 @@ class RestoreWalletOptionsPage extends BasePage { return S.of(context).restore_description_from_seed; case WalletType.bitcoin: // TODO: Add transaction for bitcoin description. - return 'Restore your wallet from 12 word combination code'; + return S.of(context).restore_bitcoin_description_from_seed; default: return ''; } @@ -68,7 +65,7 @@ class RestoreWalletOptionsPage extends BasePage { return S.of(context).restore_description_from_keys; case WalletType.bitcoin: // TODO: Add transaction for bitcoin description. - return 'Restore your wallet from generated WIF string from your private keys'; + return S.of(context).restore_bitcoin_description_from_keys; default: return ''; } @@ -80,7 +77,7 @@ class RestoreWalletOptionsPage extends BasePage { return S.of(context).restore_title_from_keys; case WalletType.bitcoin: // TODO: Add transaction for bitcoin description. - return 'Restore from WIF'; + return S.of(context).restore_bitcoin_title_from_keys; default: return ''; } diff --git a/lib/src/screens/restore/widgets/restore_button.dart b/lib/src/screens/restore/widgets/restore_button.dart index 72630492f..8945d51c4 100644 --- a/lib/src/screens/restore/widgets/restore_button.dart +++ b/lib/src/screens/restore/widgets/restore_button.dart @@ -19,7 +19,7 @@ class RestoreButton extends StatelessWidget { onTap: onPressed, child: Container( width: double.infinity, - height: 160, + height: 170, padding: EdgeInsets.all(24), alignment: Alignment.topLeft, decoration: BoxDecoration( diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 68095ca01..219e17320 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "Beschreibung zur Wiederherstellung der Brieftasche", "restore_new_seed" : "Neuer Seed", "restore_active_seed" : "Aktives Seed", + "restore_bitcoin_description_from_seed" : "Stellen Sie Ihre Brieftasche aus dem 12-Wort-Kombinationscode wieder her", + "restore_bitcoin_description_from_keys" : "Stellen Sie Ihre Brieftasche aus der generierten WIF-Zeichenfolge aus Ihren privaten Schlüsseln wieder her", + "restore_bitcoin_title_from_keys" : "Aus WIF wiederherstellen", "seed_title" : "Seed", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 277ce28ba..82afbe400 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "Wallet restore description", "restore_new_seed" : "New seed", "restore_active_seed" : "Active seed", + "restore_bitcoin_description_from_seed" : "Restore your wallet from 12 word combination code", + "restore_bitcoin_description_from_keys" : "Restore your wallet from generated WIF string from your private keys", + "restore_bitcoin_title_from_keys" : "Restore from WIF", "seed_title" : "Seed", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index f6cc257f6..f01e9002b 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "Restaurar billetera", "restore_new_seed" : "Nueva semilla", "restore_active_seed" : "Semilla activa", + "restore_bitcoin_description_from_seed" : "Restaure su billetera a partir del código de combinación de 12 palabras", + "restore_bitcoin_description_from_keys" : "Restaure su billetera a partir de una cadena WIF generada a partir de sus claves privadas", + "restore_bitcoin_title_from_keys" : "Restaurar desde WIF", "seed_title" : "Semilla", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 9e0e1a032..7b0d95adf 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "बटुआ विवरण पुनर्स्थापित करें", "restore_new_seed" : "नया बीज", "restore_active_seed" : "सक्रिय बीज", + "restore_bitcoin_description_from_seed" : "12 शब्द संयोजन कोड से अपने वॉलेट को पुनर्स्थापित करें", + "restore_bitcoin_description_from_keys" : "अपने निजी कुंजी से उत्पन्न WIF स्ट्रिंग से अपने वॉलेट को पुनर्स्थापित करें", + "restore_bitcoin_title_from_keys" : "WIF से पुनर्स्थापित करें", "seed_title" : "बीज", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index a1822f806..000475bd8 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "ウォレットの復元", "restore_new_seed" : "新しい種", "restore_active_seed" : "アクティブシード", + "restore_bitcoin_description_from_seed" : "12ワードの組み合わせコードからウォレットを復元する", + "restore_bitcoin_description_from_keys" : "秘密鍵から生成されたWIF文字列からウォレットを復元します", + "restore_bitcoin_title_from_keys" : "WIFから復元", "seed_title" : "シード", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 31d7f6cfd..c33dded12 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "월렛 복원 설명", "restore_new_seed" : "새로운 씨앗", "restore_active_seed" : "활성 종자", + "restore_bitcoin_description_from_seed" : "12 단어 조합 코드에서 지갑 복원", + "restore_bitcoin_description_from_keys" : "개인 키에서 생성 된 WIF 문자열에서 지갑 복원", + "restore_bitcoin_title_from_keys" : "WIF에서 복원", "seed_title" : "씨", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 542be0271..2fc68aef3 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "Portemonnee-herstelbeschrijving", "restore_new_seed" : "Nieuw zaad", "restore_active_seed" : "Actief zaad", + "restore_bitcoin_description_from_seed" : "Herstel uw portemonnee met een combinatiecode van 12 woorden", + "restore_bitcoin_description_from_keys" : "Herstel uw portemonnee van de gegenereerde WIF-string van uw privésleutels", + "restore_bitcoin_title_from_keys" : "Herstel van WIF", "seed_title" : "Zaad", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index da2bd6f2e..5970fadb8 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "Opis przywracania portfela", "restore_new_seed" : "Nowe nasienie", "restore_active_seed" : "Aktywne nasiona", + "restore_bitcoin_description_from_seed" : "Przywróć swój portfel z kodu złożonego z 12 słów", + "restore_bitcoin_description_from_keys" : "Przywróć swój portfel z wygenerowanego ciągu WIF z kluczy prywatnych", + "restore_bitcoin_title_from_keys" : "Przywróć z WIF", "seed_title" : "Ziarno", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 7f4df2a4a..f085280bf 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "Restauração da carteira", "restore_new_seed" : "Nova semente", "restore_active_seed" : "Semente ativa", + "restore_bitcoin_description_from_seed" : "Restaure sua carteira a partir de um código de combinação de 12 palavras", + "restore_bitcoin_description_from_keys" : "Restaure sua carteira a partir da string WIF gerada de suas chaves privadas", + "restore_bitcoin_title_from_keys" : "Restaurar de WIF", "seed_title" : "Semente", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index b5f82e379..68c1453b3 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "Описание восстановления кошелька", "restore_new_seed" : "Новая мнемоническая фраза", "restore_active_seed" : "Активная мнемоническая фраза", + "restore_bitcoin_description_from_seed" : "Вы можете восстановить кошелёк используя 12-ти значную мнемоническую фразу", + "restore_bitcoin_description_from_keys" : "Вы можете восстановить кошелёк с помощью WIF", + "restore_bitcoin_title_from_keys" : "Восстановить с помощью WIF", "seed_title" : "Мнемоническая фраза", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index bcfc96688..2cf2119b2 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "Опис відновлюваного гаманця", "restore_new_seed" : "Нова мнемонічна фраза", "restore_active_seed" : "Активна мнемонічна фраза", + "restore_bitcoin_description_from_seed" : "Ви можете відновити гаманець використовуючи 12-ти слівну мнемонічну фразу", + "restore_bitcoin_description_from_keys" : "Ви можете відновити гаманець за допомогою WIF", + "restore_bitcoin_title_from_keys" : "Відновити за допомогою WIF", "seed_title" : "Мнемонічна фраза", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 0f5794a10..8fcce5de1 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -165,6 +165,9 @@ "restore_wallet_restore_description" : "钱包还原说明", "restore_new_seed" : "新種子", "restore_active_seed" : "活性種子", + "restore_bitcoin_description_from_seed" : "從12個單詞的組合碼恢復您的錢包", + "restore_bitcoin_description_from_keys" : "從私鑰中生成的WIF字符串還原您的錢包", + "restore_bitcoin_title_from_keys" : "從WIF還原", "seed_title" : "种子", From c5980234cb5582d4884525d70cc33202f15c834d Mon Sep 17 00:00:00 2001 From: Oleksandr Sobol Date: Fri, 4 Sep 2020 19:26:04 +0300 Subject: [PATCH 6/7] CAKE-33 | applied new design to welcome page; called restore wallet options page from welcome page; changed title of the restore wallet options page --- .../restore/restore_wallet_options_page.dart | 2 +- lib/src/screens/welcome/welcome_page.dart | 36 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/lib/src/screens/restore/restore_wallet_options_page.dart b/lib/src/screens/restore/restore_wallet_options_page.dart index 57bf6642a..750a9c7e0 100644 --- a/lib/src/screens/restore/restore_wallet_options_page.dart +++ b/lib/src/screens/restore/restore_wallet_options_page.dart @@ -15,7 +15,7 @@ class RestoreWalletOptionsPage extends BasePage { final Function(BuildContext context) onRestoreFromKeys; @override - String get title => S.current.restore_seed_keys_restore; + String get title => S.current.restore_restore_wallet; final imageSeed = Image.asset('assets/images/restore_seed.png'); final imageKeys = Image.asset('assets/images/restore_keys.png'); diff --git a/lib/src/screens/welcome/welcome_page.dart b/lib/src/screens/welcome/welcome_page.dart index 46a4fb89f..78cd04835 100644 --- a/lib/src/screens/welcome/welcome_page.dart +++ b/lib/src/screens/welcome/welcome_page.dart @@ -1,12 +1,10 @@ +import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:flutter/material.dart'; -import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:provider/provider.dart'; -import 'package:cake_wallet/themes.dart'; -import 'package:cake_wallet/theme_changer.dart'; class WelcomePage extends BasePage { static const aspectRatioImage = 1.25; @@ -23,14 +21,13 @@ class WelcomePage extends BasePage { @override Widget body(BuildContext context) { - final _themeChanger = Provider.of(context); - final welcomeImage = _themeChanger.getTheme() == Themes.darkTheme - ? welcomeImageDark : welcomeImageLight; + final welcomeImage = getIt.get().isDarkTheme + ? welcomeImageDark : welcomeImageLight; final newWalletImage = Image.asset('assets/images/new_wallet.png', height: 12, width: 12, - color: Palette.oceanBlue); + color: Theme.of(context).accentTextTheme.headline.decorationColor); final restoreWalletImage = Image.asset('assets/images/restore_wallet.png', height: 12, width: 12, @@ -60,13 +57,14 @@ class WelcomePage extends BasePage { S.of(context).welcome, style: TextStyle( fontSize: 18, - color: Theme.of(context).primaryTextTheme.caption.color, + fontWeight: FontWeight.w500, + color: Theme.of(context).accentTextTheme.display3.color, ), textAlign: TextAlign.center, ), ), Padding( - padding: EdgeInsets.only(top: 10), + padding: EdgeInsets.only(top: 5), child: Text( S.of(context).cake_wallet, style: TextStyle( @@ -78,13 +76,13 @@ class WelcomePage extends BasePage { ), ), Padding( - padding: EdgeInsets.only(top: 14), + padding: EdgeInsets.only(top: 5), child: Text( S.of(context).first_wallet_text, style: TextStyle( fontSize: 16, - fontWeight: FontWeight.w600, - color: Theme.of(context).primaryTextTheme.caption.color, + fontWeight: FontWeight.w500, + color: Theme.of(context).accentTextTheme.display3.color, ), textAlign: TextAlign.center, ), @@ -97,7 +95,8 @@ class WelcomePage extends BasePage { S.of(context).please_make_selection, style: TextStyle( fontSize: 12, - color: Theme.of(context).primaryTextTheme.caption.color, + fontWeight: FontWeight.normal, + color: Theme.of(context).accentTextTheme.display3.color, ), textAlign: TextAlign.center, ), @@ -107,18 +106,17 @@ class WelcomePage extends BasePage { onPressed: () => Navigator.pushNamed(context, Routes.newWalletFromWelcome), image: newWalletImage, text: S.of(context).create_new, - color: Colors.white, - textColor: Palette.oceanBlue, - borderColor: Palette.oceanBlue, + color: Theme.of(context).accentTextTheme.subtitle.decorationColor, + textColor: Theme.of(context).accentTextTheme.headline.decorationColor, ), ), Padding( padding: EdgeInsets.only(top: 10), child: PrimaryImageButton( - onPressed: () => Navigator.pushNamed(context, Routes.restoreOptions), + onPressed: () => Navigator.pushNamed(context, Routes.restoreWalletOptionsFromWelcome), image: restoreWalletImage, text: S.of(context).restore_wallet, - color: Theme.of(context).primaryTextTheme.overline.color, + color: Theme.of(context).accentTextTheme.caption.color, textColor: Theme.of(context).primaryTextTheme.title.color), ) ], From cfb08d64cd81aee92db498849aba8b0ae4ead76b Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Fri, 4 Sep 2020 19:32:51 +0300 Subject: [PATCH 7/7] CAKE-35 | changed content font weight in the base alert dialog --- lib/src/widgets/base_alert_dialog.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/widgets/base_alert_dialog.dart b/lib/src/widgets/base_alert_dialog.dart index 14b5a58a4..d22d01d5a 100644 --- a/lib/src/widgets/base_alert_dialog.dart +++ b/lib/src/widgets/base_alert_dialog.dart @@ -31,6 +31,7 @@ class BaseAlertDialog extends StatelessWidget { textAlign: TextAlign.center, style: TextStyle( fontSize: 16, + fontWeight: FontWeight.normal, fontFamily: 'Poppins', color: Theme.of(context).primaryTextTheme.title.color, decoration: TextDecoration.none,