From affc35f3355f20740f9ba47458ef93028ebda699 Mon Sep 17 00:00:00 2001 From: Godwin Asuquo <41484542+godilite@users.noreply.github.com> Date: Wed, 14 Jun 2023 02:04:52 +0300 Subject: [PATCH] CW-342 Enable Mac Layout on iPad (#958) * Add iPad responsive layout * Set magic number to position input field on wider screens * Adjust screen resolution * Update target device family for ios * Add icons for iPad * Revert width adjustment for ipad * Fix overflowing balance * Fix overflowing balance * Fix PR issues * Remove unused icons [skip ci] --------- Co-authored-by: OmarHatem --- ios/Podfile.lock | 22 ++++---- ios/Runner.xcodeproj/project.pbxproj | 6 +-- .../AppIcon.appiconset/Contents.json | 13 +++++ .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 880 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1997 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 3332 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1399 bytes .../Icon-App-29x29@2x 1.png | Bin 0 -> 3203 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 3203 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 5030 bytes .../Icon-App-40x40@1x 1.png | Bin 0 -> 1997 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1997 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 7194 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 4305 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 9427 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 10439 bytes lib/di.dart | 3 +- lib/entities/main_actions.dart | 1 + lib/main.dart | 5 +- lib/src/screens/dashboard/dashboard_page.dart | 2 +- .../dashboard/widgets/address_page.dart | 2 +- .../dashboard/widgets/balance_page.dart | 29 ++++++----- .../dashboard/widgets/transactions_page.dart | 2 +- lib/src/screens/exchange/exchange_page.dart | 4 +- .../screens/receive/anonpay_invoice_page.dart | 49 +++++++++--------- .../receive/widgets/currency_input_field.dart | 34 +++++++----- lib/src/screens/send/send_page.dart | 4 +- lib/src/screens/send/widgets/send_card.dart | 6 +-- .../settings/display_settings_page.dart | 25 +++++---- .../screens/wallet_list/wallet_list_page.dart | 4 +- lib/src/widgets/add_template_button.dart | 2 +- lib/src/widgets/address_text_field.dart | 4 +- lib/utils/exception_handler.dart | 21 ++++---- lib/utils/responsive_layout_util.dart | 16 +++--- 34 files changed, 144 insertions(+), 110 deletions(-) create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x 1.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x 1.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 62074faed..7640d53d3 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -4,9 +4,9 @@ PODS: - MTBBarcodeScanner - SwiftProtobuf - BigInt (5.2.0) - - connectivity (0.0.1): + - connectivity_plus (0.0.1): - Flutter - - Reachability + - ReachabilitySwift - CryptoSwift (1.6.0) - cw_haven (0.0.1): - cw_haven/Boost (= 0.0.1) @@ -126,11 +126,11 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - permission_handler_apple (9.0.4): + - permission_handler_apple (9.1.0): - Flutter - platform_device_id (0.0.1): - Flutter - - Reachability (3.2) + - ReachabilitySwift (5.0.0) - SDWebImage (5.15.5): - SDWebImage/Core (= 5.15.5) - SDWebImage/Core (5.15.5) @@ -153,7 +153,7 @@ PODS: DEPENDENCIES: - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) - - connectivity (from `.symlinks/plugins/connectivity/ios`) + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - CryptoSwift - cw_haven (from `.symlinks/plugins/cw_haven/ios`) - cw_monero (from `.symlinks/plugins/cw_monero/ios`) @@ -188,7 +188,7 @@ SPEC REPOS: - DKPhotoGallery - MTBBarcodeScanner - OrderedSet - - Reachability + - ReachabilitySwift - SDWebImage - SwiftProtobuf - SwiftyGif @@ -197,8 +197,8 @@ SPEC REPOS: EXTERNAL SOURCES: barcode_scan2: :path: ".symlinks/plugins/barcode_scan2/ios" - connectivity: - :path: ".symlinks/plugins/connectivity/ios" + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/ios" cw_haven: :path: ".symlinks/plugins/cw_haven/ios" cw_monero: @@ -249,7 +249,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0 BigInt: f668a80089607f521586bbe29513d708491ef2f7 - connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467 + connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e CryptoSwift: 562f8eceb40e80796fffc668b0cad9313284cfa6 cw_haven: b3e54e1fbe7b8e6fda57a93206bc38f8e89b898a cw_monero: 4cf3b96f2da8e95e2ef7d6703dd4d2c509127b7d @@ -271,9 +271,9 @@ SPEC CHECKSUMS: OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8 - permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce + permission_handler_apple: 8f116445eff3c0e7c65ad60f5fef5490aa94b4e4 platform_device_id: 81b3e2993881f87d0c82ef151dc274df4869aef5 - Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 + ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 50b9da031..dc6c28225 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -390,7 +390,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = arm64; VERSIONING_SYSTEM = "apple-generic"; }; @@ -537,7 +537,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = arm64; VERSIONING_SYSTEM = "apple-generic"; }; @@ -574,7 +574,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = arm64; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index 6d834d4ee..df5cf1cc5 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,21 +1,25 @@ { "images" : [ { + "filename" : "Icon-App-40x40@1x.png", "idiom" : "iphone", "scale" : "2x", "size" : "20x20" }, { + "filename" : "Icon-App-20x20@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "20x20" }, { + "filename" : "Icon-App-29x29@2x 1.png", "idiom" : "iphone", "scale" : "2x", "size" : "29x29" }, { + "filename" : "Icon-App-29x29@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "29x29" @@ -26,6 +30,7 @@ "size" : "40x40" }, { + "filename" : "Icon-App-40x40@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "40x40" @@ -43,26 +48,31 @@ "size" : "60x60" }, { + "filename" : "Icon-App-20x20@1x.png", "idiom" : "ipad", "scale" : "1x", "size" : "20x20" }, { + "filename" : "Icon-App-20x20@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "20x20" }, { + "filename" : "Icon-App-29x29@1x.png", "idiom" : "ipad", "scale" : "1x", "size" : "29x29" }, { + "filename" : "Icon-App-29x29@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "29x29" }, { + "filename" : "Icon-App-40x40@1x 1.png", "idiom" : "ipad", "scale" : "1x", "size" : "40x40" @@ -73,16 +83,19 @@ "size" : "40x40" }, { + "filename" : "Icon-App-76x76@1x.png", "idiom" : "ipad", "scale" : "1x", "size" : "76x76" }, { + "filename" : "Icon-App-76x76@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "76x76" }, { + "filename" : "Icon-App-83.5x83.5@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "83.5x83.5" diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..369d8d9a419ebc36e95c5cbfb488377456e99094 GIT binary patch literal 880 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb14bfc557bd6dbe135f1f9166839e8133a5cbb1 GIT binary patch literal 3332 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 FV1gC{mz)3q literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x 1.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x 1.png new file mode 100644 index 0000000000000000000000000000000000000000..07acd0a82816d11e8ce99ae5896deadf6083da1d GIT binary patch literal 3203 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..65ed7f3db173ea8f307efd0be90e41a9405a9158 GIT binary patch literal 1997 zcmV;;2Qv7HP)yU(<&8d`%QI6*7R@CzG6K<;5k9e8DuaN^6?ur^ z#ulG6aHrg*kC@<6D8VxxO9Ky(9fq0zJOBSY6=nV~jI^E4=YIZwF6aL5cka38+;gr3 ze{hlf-T<9R_W+t(8e@>tDD)pb6utY%A?+!Js;LE4%5oIv-Nv13xwu!}^xFc;@hZ4_EJ9r93LM#) z^yGjNBN0|aZN&6tAz&Dh!EkNG#LNnBes&0>CQe4=@*p%fv>FB|mM{oC5Qhmby-I&E z-2(Se7)*ZU4cxw(jnv3E0|1F9I3|+d7Iib&ePMAdE*fdkI^j6!7|=6#38pRx(sMEm zD$DXvT5tyqHML|yQ}lIkgq7WJ+7@D+a9{6=z_!3OU|GSB3Ih%t{WKPB_#B;?wXv=o z8L`ng8NU~Ie=G*8dH6quhT0G61I0pL{M~;w%w+Zt;L>9{h3gn_d3Xfxal*pl;^BB~ z4P1rFl4`!k-q8k*W1T2)%g|6)hkxhZK;exd>|Gy)w9jJTAHErGzJUZ6PH^vZ1}6+S z*3AiH+~#%&cWBER#D_(2uW*?)5x(ofFldb8F)wFPoPUKJ;3FK3`w|~7U5U)ZgUCLS zr4O7i;GDOD(UECSB}5^99k;?F1aAKr(-sB`gdc`h^*Pc>!K8U9*zCO+SB_`tMJ5Pn zDesAK?jC|8N(*wxJQNR!Cv;y7Cd_$Fk9io3Re0jVW7c?E@i#Qpw-^rS3*w`6!9s_i#k1rbps9< zF+x!L+BZkhO4f0i{UW7R11nT40{TlZ&_qLkYF=frod|yY#c(v$5TLft+g5~tr^UFG z(+b`?Q|8Y_azw0QfY$a;32OgzEr)-Oc)^7Wayhj?UOfwi6$5h$#dXBv*;nf;6J-qK zM!+vB^0__?>RVZUrM2T-I4cQK8PC834PcDLlVQH-y`XTCv-%+(Zffv_RSEILFx3;yt_NXeplYhVKMjeY= z)MnZ+s8%ub4qPN>NGEg7p%t{?Oi$*`sA%)Mi}Ul_eOqrp<p2Q0|Fj%TNN z>C|?bG6Np@cQ{P@K~)|+r(UsS$+$VOv&Z;pjG(fTUQuK&GH+8^>;K-6Jf#sYd3B?uA$W& zVaD*Vys#P#cK#y(Elq0O6X*qa_A;eVO3LT@=p5no?j~d&O2h5!JVg6@Vb$(b%DSZ+ z3pMRjV@tG7qlF{qJNQvB&Lr!-db$A{YSlQKoIq8Z?qxLXWs8u6c&wc<7pM29qpnJU zpdEW)X**bOmWCQ7V&8oe8M{-u0;e00ldraYifOL~@a3W|d1lgVtWAu^2R=)Ym2m+} zM~=j-WxjBI#R~(5kE6ofl0r!>O7e4Y@vATCd;dbUvX;+&f_FyX`nhvBwkOSSz=GT& zGUF~xrQ}jbo}aM*TQ3j6=K;%+do~9tQSp3}(D5Oq!?&fG;$8DY{h{NBAYkhbN*MkE zH}3$lgdb9)zc37tleo|@IJ>_L3+sM@I{k(@W6Ozb+`4oGC%)K+>)(EZijqpy*8oPw zfV`gtM!8O=y2ghhz&x^u5kHQ5`fb?*3rj2P35zleu(I?X)vG=TOU``oVO_$A#2ESF z9KLZL(cDl$URuL>H+q=ba5%chQ9?OCp!lQ(C`*f^rOh zUUe=E?LQm7=_d?k`G-Mj)(cU~f}v?2eL64Plfq*u^g@za?WJpTuLggp1MG$)q6U_ zZ&=k-Uwof=g>Rh5Y>XjyaNw_idzeZo+_a#&TnS}iAu5$k`WEWl2l%*DmA6pKqqn?n f`zHPbxBUMDPrkd7gh*1O00000NkvXXu0mjf{)@mP literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..80e78be415a375258c3aef7d46658f5906bf1f2b GIT binary patch literal 7194 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 cfUCLw2Qr_Ii_@%07*qoM6N<$f(zy0?*IS* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e06998b675c1d3c62e7006480a526c509e28a92d GIT binary patch literal 4305 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 with SingleTickerProviderStateMixin { AppState() : yatStore = getIt.get() { SystemChrome.setPreferredOrientations( - [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); + ResponsiveLayoutUtil.instance.isIpad ? + [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight] : + [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); } YatStore yatStore; diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index 47a62f53a..94717f93f 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -43,7 +43,7 @@ class DashboardPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - body: ResponsiveLayoutUtil.instance.isMobile(context) + body: ResponsiveLayoutUtil.instance.isMobile ? _DashboardPageView( balancePage: balancePage, dashboardViewModel: dashboardViewModel, diff --git a/lib/src/screens/dashboard/widgets/address_page.dart b/lib/src/screens/dashboard/widgets/address_page.dart index 82a867058..a047e9f29 100644 --- a/lib/src/screens/dashboard/widgets/address_page.dart +++ b/lib/src/screens/dashboard/widgets/address_page.dart @@ -73,7 +73,7 @@ class AddressPage extends BasePage { ? closeButtonImageDarkTheme : closeButtonImage; - bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context); + bool isMobileView = ResponsiveLayoutUtil.instance.isMobile; return MergeSemantics( child: SizedBox( diff --git a/lib/src/screens/dashboard/widgets/balance_page.dart b/lib/src/screens/dashboard/widgets/balance_page.dart index 6e2893429..85d0fb0a1 100644 --- a/lib/src/screens/dashboard/widgets/balance_page.dart +++ b/lib/src/screens/dashboard/widgets/balance_page.dart @@ -120,19 +120,22 @@ class BalancePage extends StatelessWidget { .backgroundColor!, height: 1)), SizedBox(height: 5), - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - AutoSizeText(availableBalance, - style: TextStyle( - fontSize: 24, - fontFamily: 'Lato', - fontWeight: FontWeight.w900, - color: Theme.of(context) - .accentTextTheme! - .displayMedium! - .backgroundColor!, - height: 1), - maxLines: 1, - textAlign: TextAlign.center), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Expanded( + child: AutoSizeText(availableBalance, + style: TextStyle( + fontSize: 24, + fontFamily: 'Lato', + fontWeight: FontWeight.w900, + color: Theme.of(context) + .accentTextTheme! + .displayMedium! + .backgroundColor!, + height: 1), + maxLines: 1, + textAlign: TextAlign.start), + ), Text(currency, style: TextStyle( fontSize: 28, diff --git a/lib/src/screens/dashboard/widgets/transactions_page.dart b/lib/src/screens/dashboard/widgets/transactions_page.dart index 61ab84265..e92e97f04 100644 --- a/lib/src/screens/dashboard/widgets/transactions_page.dart +++ b/lib/src/screens/dashboard/widgets/transactions_page.dart @@ -31,7 +31,7 @@ class TransactionsPage extends StatelessWidget { onLongPressUp: () => dashboardViewModel.balanceViewModel.isReversing = !dashboardViewModel.balanceViewModel.isReversing, child: Container( - color: ResponsiveLayoutUtil.instance.isMobile(context) + color: ResponsiveLayoutUtil.instance.isMobile ? null : Theme.of(context).colorScheme.background, padding: EdgeInsets.only(top: 24, bottom: 24), diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 6eea29b42..91097ead3 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -117,7 +117,7 @@ class ExchangePage extends BasePage { final _closeButton = currentTheme.type == ThemeType.dark ? closeButtonImageDarkTheme : closeButtonImage; - bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context); + bool isMobileView = ResponsiveLayoutUtil.instance.isMobile; return MergeSemantics( child: SizedBox( @@ -731,7 +731,7 @@ class ExchangePage extends BasePage { }, )); - if (ResponsiveLayoutUtil.instance.isMobile(context)) { + if (ResponsiveLayoutUtil.instance.isMobile) { return MobileExchangeCardsSection( firstExchangeCard: firstExchangeCard, secondExchangeCard: secondExchangeCard, diff --git a/lib/src/screens/receive/anonpay_invoice_page.dart b/lib/src/screens/receive/anonpay_invoice_page.dart index 41bd5f6fd..f8df3eeb3 100644 --- a/lib/src/screens/receive/anonpay_invoice_page.dart +++ b/lib/src/screens/receive/anonpay_invoice_page.dart @@ -9,6 +9,7 @@ import 'package:cake_wallet/src/screens/receive/widgets/anonpay_input_form.dart' import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; import 'package:cake_wallet/utils/device_info.dart'; +import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/receive_option_view_model.dart'; import 'package:flutter/material.dart'; @@ -88,32 +89,30 @@ class AnonPayInvoicePage extends BasePage { .accentTextTheme! .bodyLarge! .backgroundColor!, - nextFocus: false, - actions: [ - KeyboardActionsItem( - focusNode: _amountFocusNode, - toolbarButtons: [(_) => KeyboardDoneButton()], + nextFocus: false, + actions: [ + KeyboardActionsItem( + focusNode: _amountFocusNode, + toolbarButtons: [(_) => KeyboardDoneButton()], + ), + ]), + child: Container( + color: Theme.of(context).colorScheme.background, + child: ScrollableWithBottomSection( + contentPadding: EdgeInsets.only(bottom: 24), + content: Container( + decoration: ResponsiveLayoutUtil.instance.isMobile ? BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)), + gradient: LinearGradient( + colors: [ + Theme.of(context).primaryTextTheme!.titleSmall!.color!, + Theme.of(context).primaryTextTheme!.titleSmall!.decorationColor!, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, ), - ]), - child: Container( - color: Theme.of(context).colorScheme.background, - child: ScrollableWithBottomSection( - contentPadding: EdgeInsets.only(bottom: 24), - content: Container( - decoration: DeviceInfo.instance.isMobile - ? BoxDecoration( - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)), - gradient: LinearGradient( - colors: [ - Theme.of(context).primaryTextTheme!.titleSmall!.color!, - Theme.of(context).primaryTextTheme!.titleSmall!.decorationColor!, - ], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - ) - : null, + ) : null, child: Observer(builder: (_) { return Padding( padding: EdgeInsets.fromLTRB(24, 120, 24, 0), diff --git a/lib/src/screens/receive/widgets/currency_input_field.dart b/lib/src/screens/receive/widgets/currency_input_field.dart index f1ce170f7..85e2cdbe2 100644 --- a/lib/src/screens/receive/widgets/currency_input_field.dart +++ b/lib/src/screens/receive/widgets/currency_input_field.dart @@ -1,4 +1,5 @@ import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; +import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cw_core/currency.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -9,7 +10,8 @@ class CurrencyInputField extends StatelessWidget { required this.onTapPicker, required this.selectedCurrency, this.focusNode, - required this.controller, required this.isLight, + required this.controller, + required this.isLight, }); final Function() onTapPicker; @@ -22,13 +24,12 @@ class CurrencyInputField extends StatelessWidget { Widget build(BuildContext context) { final arrowBottomPurple = Image.asset( 'assets/images/arrow_bottom_purple_icon.png', - color: Theme.of(context) - .accentTextTheme! - .displayMedium! - .backgroundColor!, + color: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!, height: 8, ); - final _width = MediaQuery.of(context).size.width; + // This magic number for wider screen sets the text input focus at center of the inputfield + final _width = + ResponsiveLayoutUtil.instance.isMobile ? MediaQuery.of(context).size.width : 500; return Column( children: [ @@ -42,10 +43,12 @@ class CurrencyInputField extends StatelessWidget { keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true), inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'^\d+(\.|\,)?\d{0,8}'))], hintText: '0.000', - placeholderTextStyle: isLight ? null : TextStyle( - color: Theme.of(context).primaryTextTheme!.headlineSmall!.color!, - fontWeight: FontWeight.w600, - ), + placeholderTextStyle: isLight + ? null + : TextStyle( + color: Theme.of(context).primaryTextTheme!.headlineSmall!.color!, + fontWeight: FontWeight.w600, + ), borderColor: Theme.of(context).accentTextTheme!.titleLarge!.backgroundColor!, textColor: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!, textStyle: TextStyle( @@ -72,7 +75,10 @@ class CurrencyInputField extends StatelessWidget { style: TextStyle( fontWeight: FontWeight.w600, fontSize: 16, - color: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!, + color: Theme.of(context) + .accentTextTheme! + .displayMedium! + .backgroundColor!, ), ), if (selectedCurrency.tag != null) @@ -107,8 +113,10 @@ class CurrencyInputField extends StatelessWidget { style: TextStyle( fontWeight: FontWeight.w600, fontSize: 20, - color: - Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!, + color: Theme.of(context) + .accentTextTheme! + .displayMedium! + .backgroundColor!, ), ), ), diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index 6fffffa42..4ad1ad8ca 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -62,7 +62,7 @@ class SendPage extends BasePage { final _closeButton = currentTheme.type == ThemeType.dark ? closeButtonImageDarkTheme : closeButtonImage; - bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context); + bool isMobileView = ResponsiveLayoutUtil.instance.isMobile; return MergeSemantics( child: SizedBox( @@ -92,7 +92,7 @@ class SendPage extends BasePage { double _sendCardHeight(BuildContext context) { final double initialHeight = sendViewModel.isElectrumWallet ? 490 : 465; - if (!ResponsiveLayoutUtil.instance.isMobile(context)) { + if (!ResponsiveLayoutUtil.instance.isMobile) { return initialHeight - 66; } return initialHeight; diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index 96045b1bd..2b4b40fa3 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -122,7 +122,7 @@ class SendCardState extends State color: Colors.transparent, )), Container( - decoration: ResponsiveLayoutUtil.instance.isMobile(context) ? BoxDecoration( + decoration: ResponsiveLayoutUtil.instance.isMobile ? BoxDecoration( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)), @@ -137,9 +137,9 @@ class SendCardState extends State child: Padding( padding: EdgeInsets.fromLTRB( 24, - ResponsiveLayoutUtil.instance.isMobile(context) ? 100 : 55, + ResponsiveLayoutUtil.instance.isMobile ? 100 : 55, 24, - ResponsiveLayoutUtil.instance.isMobile(context) ? 32 : 0, + ResponsiveLayoutUtil.instance.isMobile ? 32 : 0, ), child: SingleChildScrollView( child: Observer(builder: (_) => Column( diff --git a/lib/src/screens/settings/display_settings_page.dart b/lib/src/screens/settings/display_settings_page.dart index c7baa9b6a..04fd134e6 100644 --- a/lib/src/screens/settings/display_settings_page.dart +++ b/lib/src/screens/settings/display_settings_page.dart @@ -8,6 +8,7 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell. import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/themes/theme_list.dart'; import 'package:cake_wallet/utils/device_info.dart'; +import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; import 'package:cake_wallet/view_model/settings/display_settings_view_model.dart'; import 'package:flutter/material.dart'; @@ -29,11 +30,11 @@ class DisplaySettingsPage extends BasePage { child: Column( children: [ SettingsSwitcherCell( - title: S.current.settings_display_balance, - value: _displaySettingsViewModel.shouldDisplayBalance, - onValueChange: (_, bool value) { - _displaySettingsViewModel.setShouldDisplayBalance(value); - }), + title: S.current.settings_display_balance, + value: _displaySettingsViewModel.shouldDisplayBalance, + onValueChange: (_, bool value) { + _displaySettingsViewModel.setShouldDisplayBalance(value); + }), SettingsSwitcherCell( title: S.current.show_market_place, value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard, @@ -42,14 +43,17 @@ class DisplaySettingsPage extends BasePage { }, ), //if (!isHaven) it does not work correctly - if(!_displaySettingsViewModel.disabledFiatApiMode) + if (!_displaySettingsViewModel.disabledFiatApiMode) SettingsPickerCell( title: S.current.settings_currency, searchHintText: S.current.search_currency, items: FiatCurrency.all, selectedItem: _displaySettingsViewModel.fiatCurrency, - onItemSelected: (FiatCurrency currency) => _displaySettingsViewModel.setFiatCurrency(currency), - images: FiatCurrency.all.map((e) => Image.asset("assets/images/flags/${e.countryCode}.png")).toList(), + onItemSelected: (FiatCurrency currency) => + _displaySettingsViewModel.setFiatCurrency(currency), + images: FiatCurrency.all + .map((e) => Image.asset("assets/images/flags/${e.countryCode}.png")) + .toList(), isGridView: true, matchingCriteria: (FiatCurrency currency, String searchText) { return currency.title.toLowerCase().contains(searchText) || @@ -66,13 +70,14 @@ class DisplaySettingsPage extends BasePage { selectedItem: _displaySettingsViewModel.languageCode, onItemSelected: _displaySettingsViewModel.onLanguageSelected, images: LanguageService.list.keys - .map((e) => Image.asset("assets/images/flags/${LanguageService.localeCountryCode[e]}.png")) + .map((e) => Image.asset( + "assets/images/flags/${LanguageService.localeCountryCode[e]}.png")) .toList(), matchingCriteria: (String code, String searchText) { return LanguageService.list[code]?.toLowerCase().contains(searchText) ?? false; }, ), - if (DeviceInfo.instance.isMobile) + if (ResponsiveLayoutUtil.instance.isMobile && DeviceInfo.instance.isMobile) SettingsChoicesCell( ChoicesListItem( title: S.current.color_theme, diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart index 3f33ebc7a..a9a4b894f 100644 --- a/lib/src/screens/wallet_list/wallet_list_page.dart +++ b/lib/src/screens/wallet_list/wallet_list_page.dart @@ -1,6 +1,6 @@ import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; -import 'package:cake_wallet/utils/device_info.dart'; +import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; @@ -229,7 +229,7 @@ class WalletListBodyState extends State { await hideProgressText(); // only pop the wallets route in mobile as it will go back to dashboard page // in desktop platforms the navigation tree is different - if (DeviceInfo.instance.isMobile) { + if (ResponsiveLayoutUtil.instance.isMobile) { WidgetsBinding.instance.addPostFrameCallback((_) { Navigator.of(context).pop(); }); diff --git a/lib/src/widgets/add_template_button.dart b/lib/src/widgets/add_template_button.dart index 87951e044..c88b72e7f 100644 --- a/lib/src/widgets/add_template_button.dart +++ b/lib/src/widgets/add_template_button.dart @@ -26,7 +26,7 @@ class AddTemplateButton extends StatelessWidget { child: Container( height: 34, padding: EdgeInsets.symmetric( - horizontal: ResponsiveLayoutUtil.instance.isMobile(context) ? 10 : 30), + horizontal: ResponsiveLayoutUtil.instance.isMobile ? 10 : 30), alignment: Alignment.center, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), diff --git a/lib/src/widgets/address_text_field.dart b/lib/src/widgets/address_text_field.dart index 415d40c6d..daa2e0a60 100644 --- a/lib/src/widgets/address_text_field.dart +++ b/lib/src/widgets/address_text_field.dart @@ -1,6 +1,6 @@ -import 'dart:io'; import 'package:cake_wallet/utils/device_info.dart'; +import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/routes.dart'; @@ -105,7 +105,7 @@ class AddressTextField extends StatelessWidget { width: prefixIconWidth * options.length + (spaceBetweenPrefixIcons * options.length), child: Row( - mainAxisAlignment: DeviceInfo.instance.isMobile + mainAxisAlignment: ResponsiveLayoutUtil.instance.isMobile ? MainAxisAlignment.spaceBetween : MainAxisAlignment.end, children: [ SizedBox(width: 5), diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart index 4b156ade1..aeb81fb66 100644 --- a/lib/utils/exception_handler.dart +++ b/lib/utils/exception_handler.dart @@ -130,17 +130,16 @@ class ExceptionHandler { _ignoredErrors.any((element) => error.contains(element)); static const List _ignoredErrors = const [ - "errno = 9", // SocketException: Bad file descriptor - "errno = 28", // OS Error: No space left on device - "errno = 32", // SocketException: Write failed (OS Error: Broken pipe) - "errno = 49", // SocketException: Can't assign requested address - "errno = 54", // SocketException: Connection reset by peer - "errno = 57", // SocketException: Read failed (OS Error: Socket is not connected) - "errno = 60", // SocketException: Operation timed out - "errno = 65", // SocketException: No route to host - "errno = 103", // SocketException: Software caused connection abort - "errno = 104", // SocketException: Connection reset by peer - "errno = 110", // SocketException: Connection timed out + "Bad file descriptor", + "No space left on device", + "Write failed (OS Error: Broken pipe)", + "Can't assign requested address", + "Read failed (OS Error: Socket is not connected)", + "Operation timed out", + "No route to host", + "Software caused connection abort", + "Connection reset by peer", + "Connection timed out", "Connection reset by peer", "Connection closed before full header was received", "Connection terminated during handshake", diff --git a/lib/utils/responsive_layout_util.dart b/lib/utils/responsive_layout_util.dart index 8ae76ca21..d0f029a54 100644 --- a/lib/utils/responsive_layout_util.dart +++ b/lib/utils/responsive_layout_util.dart @@ -1,33 +1,35 @@ import 'package:flutter/material.dart'; class ResponsiveLayoutUtil { - static const double _kMobileThreshold = 900; + static const double _kMobileThreshold = 768; static const double kDesktopMaxWidthConstraint = 400; static const double kPopupWidth = 400; static const double kPopupSpaceHeight = 100; - + static const _kIpadMaxWidth = 2560.0; const ResponsiveLayoutUtil._(); static final instance = ResponsiveLayoutUtil._(); - bool isMobile(BuildContext context) { - final MediaQueryData mediaQueryData = MediaQuery.of(context); - return mediaQueryData.size.width < _kMobileThreshold; + bool get isMobile => + WidgetsBinding.instance.platformDispatcher.views.first.physicalSize.width < _kMobileThreshold; + + bool get isIpad { + final width = WidgetsBinding.instance.platformDispatcher.views.first.physicalSize.width; + return width >= _kMobileThreshold && !(width > _kIpadMaxWidth); } /// Returns dynamic size. /// /// If screen size is mobile, it returns 66% ([scale]) of the [originalValue]. double getDynamicSize( - BuildContext context, double originalValue, { double? mobileSize, double? scale, }) { scale ??= 2 / 3; mobileSize ??= originalValue * scale; - final value = isMobile(context) ? mobileSize : originalValue; + final value = isMobile ? mobileSize : originalValue; return value.roundToDouble(); }